问答

社媒接口返回的 JSON 太长,喂给大模型太费 token,怎么省?

简短回答

别等拿到再删,直接让接口少返回:okdata 可以指定只返回哪几个字段,也可以用精简视图去掉空值,两者都不影响价格(小红书搜索每页都是 $0.02)。做评论情感分析时,每条评论留三个字段通常就够了。

搜了三次抖音,上下文就用掉一半,智能体开始忘记你最初的要求;Claude Code 甚至会因为工具结果太大,把它转存成文件。办法是少要字段,条数照旧:一页 20 条视频,每条只留五个字段,体积只有带着头像、图片列表、话题标签和全部数据指标那一版的一小部分。

两个参数,所有接口通用

抖音视频搜索、小红书笔记搜索、抖音视频评论等每个 okdata 接口都支持这两个参数:

  • fields:只保留你列出的字段,嵌套字段用点号,例如 fields=id,title,metrics.likes。写错的字段会出现在 warnings 里,不会悄悄失效。
  • view:默认返回多少。standard 是默认值,compact 会再去掉所有空字段,full 会在 ext 里附带平台特有字段,放进提示词基本用不上。

这两个参数都不改变价格,也不改变条数。按次计费,瘦身后的一页和完整的一页价钱一样。

不同任务留哪些字段

任务 fields 每页价格
评论情感分析 text,likes,published_at $0.002
扫热榜 rank,name,heat $0.002
筛博主 id,name,followers,posts,likes,bio $0.002
内容调研 id,url,title,text,metrics.likes,metrics.comments,author.name $0.02

自己对比一下

下面把同一个搜索跑两遍,一遍默认字段,一遍精简字段,打印各自的大小。共两次调用,$0.04。

import json, os, requests

URL = "https://api.okdata.online/v1/douyin/videos/search"
H = {"Authorization": f"Bearer {os.environ['OKDATA_API_KEY']}"}

for fields in (None, "id,title,metrics.likes,author.name"):
    params = {"query": "露营装备", **({"fields": fields} if fields else {})}
    body = requests.get(URL, headers=H, params=params, timeout=60).json()
    if body["code"] != "ok":
        raise RuntimeError(body["message"])
    size = len(json.dumps(body["data"], ensure_ascii=False))
    print(fields or "standard", size, "个字符", body["warnings"])

走 MCP 时,智能体在 params 里传同样的参数,比如 {"query": "露营装备", "fields": "id,title,metrics.likes"}。记得在提示词里明确要求,模型很少会主动少要字段。

比参数更省的几个习惯

  • 原始数据存下来,给模型看精简版。 完整响应写进文件或数据库,当前步骤需要什么就给模型什么。之后想回查,不用再花钱调一次。
  • 每拿一页先总结,再拿下一页。 十页评论先变成十段短笔记,再合成一份总结,比一次塞进一个超长提示词稳得多。
  • 字幕: fields=text 只返回纯文本,不带每段的时间戳,体积常常能少一半。只有需要精确引用到第几秒时,才保留分段。
  • 条数也要裁。 模型只需要点赞最高的 20 条评论,就先在代码里排序,把其余的丢掉再拼提示词。

其他做法

用 jq 或几行 Python 自己裁剪,对任何接口都适用,也不花钱,只是完整响应得先传到你的程序里。最不推荐的是让 MCP 客户端自动截断长结果:它从末尾往前砍,模型丢掉的是最后几条数据,没用的字段反而留着。完整参数说明见请求与响应。

更新于