ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

AgentScope 令牌计数完整指南:3 步看懂 AI 智能体的上下文成本怎么算

AgentScope 令牌计数完整指南:3 步看懂 AI 智能体的上下文成本怎么算 AgentScope 令牌计数完整指南3 步看懂 AI 智能体的上下文成本怎么算【免费下载链接】agentscopeBuild and run agents you can see, understand and trust.项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope做 Agent 的人大概率都撞过这堵墙对话聊到十几轮或者一次Read把几万行的文件读进上下文模型 API 直接报 400——prompt too long。你盯着报错发呆到底是谁把上下文撑爆的是系统提示词是工具定义还是那张随手发进去的图片AgentScope 的count_tokens令牌计数接口就是回答这个问题的尺子。它既是框架内部自动压缩上下文的依据也可以被你直接调用提前估算一段消息要花多少 token甚至接上中间件给整个回复设预算上限。先说清楚边界count_tokens是一个估算器不是计费系统。它不访问厂商 API不依赖本地分词器跑起来快、零依赖但和 OpenAI 这类厂商的真实 tokenizer 结果会有出入。它最擅长的活儿是在发请求之前告诉你大概要烧多少 token让 Agent 提前压缩旧对话、截断过大的工具结果而不是等 API 报错。先看结果一分钟量出你的消息占多少 token最短上手路径建一个任意 AgentScope 内置模型实例不需要 API Key估算本地完成再调count_tokens。import asyncio from agentscope.message import UserMsg, TextBlock, DataBlock, URLSource from agentscope.model import DashScopeChatModel model DashScopeChatModel(model_nameqwen-plus) # 参数可省估算不发请求 async def main(): msgs [UserMsg(user, TextBlock(text帮我看看这段代码))] print(await model.count_tokens(msgs, None)) # 纯文本消息 # 带一张图片的多模态消息 img DataBlock(sourceURLSource(urlhttp://x/a.png, media_typeimage/png)) print(await model.count_tokens( [UserMsg(user, [TextBlock(text这张图是什么), img])], None)) asyncio.run(main())两个观察点签名是count_tokens(messages, tools)messages是Msg对象列表框架内部结构tools传工具 JSON 定义列表或None——传进去的话工具 schema 也会算进总量这很关键很多人忘了工具定义也是隐形 token 大户。返回值只是近似值。下面这段消息你不用猜可以直接心算验证中文 的 UTF-8 字节数 ÷ 4四舍五入。像上图这种实拍图发进多模态模型时消耗远大于图片文件本身。AgentScope 的处理很干脆任何DataBlock图片、音频、视频不管 base64 内联还是 URL 引用统一按2000 token计——因为图片到底烧多少 token取决于分辨率、模型和厂商公式本地精确反推不现实不如给一个稳定的上界估算让压缩逻辑有数可依。拆穿估算公式4 字节≈1 个 token 的底气公式本体在 模型基类 的count_tokens里拆开来就三步文本类内容把消息里所有文本块用户文本、思考块、工具调用入参、工具返回结果拼起来UTF-8 字节数 ÷ 4四舍五入。英文文本约 4 字节一 token这个近似很准中文一个汉字 3 字节会略微低估但方向上够用。数据块数量 × 2000如上所述。注意 base64 字符串不会被当成文本去数——否则一张 400KB 的图片会变成十万 token压缩逻辑直接失灵。对应的单测专门锁死了这个行为。工具定义tools列表整体json.dumps后并入文本统计。十来个工具、每个带几十个参数的 schema轻松吃掉几百到上千 token。为什么选够用而不是精确看它的使用场景就明白了Agent 主循环里Agent 实现每轮都要拿count_tokens做判断——哪些旧消息可以丢进摘要、当前保留部分是否超预算、单个工具结果要不要截断。一个轮次里可能调用十几次如果每次都拉本地分词器甚至调厂商 APIAgent 的速度会被估算本身拖垮。估算器要的是单调、稳定、快而不是分毫不差。把估算接上真实场景压缩、截断与预算理解了公式就能看懂框架在哪些地方悄悄替你省钱了也知道怎么把自己的需求接进去。场景一让长对话自己瘦身。Agent 的上下文压缩是自动的每轮先估算系统提示词 摘要 保留消息 工具的总量超了就把更早的消息挪进摘要区。你不需要写任何压缩代码只需要在模型卡片里配好context_size如 DashScope 模型配置中的qwen-long配了 1000 万上下文框架就知道水位线在哪。想验证压缩是否生效最简单的办法是长对话前后各调一次count_tokens对比总量。场景二超大工具结果自动截断。Agent 有个tool_result_limit单个工具返回超过阈值时保留前半段、把后半段卸载到文件缓存里Agent 需要时可再用Read取回。估算器在这里干的是按比例截的活——先数一遍总量再二分找到恰好不超限的切点连边界那条文本都按 token 占比截断。场景三给一次回复设 token 预算。如果你的诉求是这个 Agent 一次最多烧 X token不用自己循环计数——预算中间件 直接干这事agent Agent( ..., middlewares[ ReplyBudgetControlMiddleware( token_budget10000, input_token_weight1.0, output_token_weight2.0, # 输出贵按 2 倍权重计费 ) ], )累计加权消耗一到顶中间件就往上下文里插一条系统提示强制 Agent 收工、不再调工具。预算状态挂在 Agent 状态里人类介入打断后恢复也接着算不会死而复生重置额度。场景四真要精确计费在你的模型子类里覆写count_tokens接入厂商 tokenizer 即可比如 OpenAI 的tiktoken。基类文档明确留了这个口子估算版保证框架运转精确版留给对钱敏感的你自己装。这些坑我替你踩过估算值不等于账单。count_tokens给的是量级参考别拿它乘以单价当发票。真实消耗以 API 返回的usage为准两者差个 5%~15% 都算正常中文内容尤其要留意低估。多模态消息虚胖是设计如此。一个DataBlock固定按 2000 token 计哪怕图片 URL 只是个字符串。如果你的消息里塞了几张图估算值会明显高于纯文本直觉这不是 bug。忘了tools参数。只数消息不数工具定义估算会偏小。上下文经常是被十几个工具的 JSON schema 悄悄撑爆的估算时一定把tools带上。别用len(text)数 token。中文 1 个字符 3 字节、emoji 4 字节len()和 token 数完全是两码事。要么调count_tokens要么按 UTF-8 字节算这是新手最常犯的错。base64 图片被当文本数了如果你自己实现了估算逻辑记得先把二进制数据剥出去。框架基类已经处理了 base64 和 URL 两种DataBlock的等价估算自定义实现时参考 单测里的两个断言即可。照抄清单十分钟接入你的项目pip install agentscope任选一个内置模型实例如DashScopeChatModel确认await model.count_tokens(msgs, None)能跑通打印值和你心算的字节÷4对得上。估算时务必传入tools参数把工具 schema 算进去。检查你用的模型卡片里context_size/output_size是否合理这是自动压缩的水位线见 src/agentscope/model/ 下各厂商的 YAML。长对话 大工具结果的场景确认 Agent 的压缩/截断配置生效观察上下文总量在长任务中保持平稳即可。需要成本硬约束时加ReplyBudgetControlMiddleware按输入权重 1.0 / 输出权重 2.0起步调参。对计费精度有要求再覆写count_tokens接厂商 tokenizer别从第一步就这么干。令牌计数这件事AgentScope 的态度很务实给一把够准的卷尺把精度的最后一公里留给你。看懂字节÷4 数据块×2000 工具 schema这个公式之后你就能预判 Agent 的上下文水位而不是等着 API 报错才恍然大悟。【免费下载链接】agentscopeBuild and run agents you can see, understand and trust.项目地址: https://gitcode.com/GitHub_Trending/ag/agentscope创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表