十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Agent Zero 的 Token 工具箱:深入解析 helpers/tokens.py 的计数、近似与裁剪机制

Agent Zero 的 Token 工具箱:深入解析 helpers/tokens.py 的计数、近似与裁剪机制 Agent Zero 的 Token 工具箱深入解析 helpers/tokens.py 的计数、近似与裁剪机制【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero导读helpers/tokens.py是 Agent Zero AI framework 中负责 Token 度量的核心辅助模块它既提供基于 tiktoken 的精确计数也提供带缓冲余量的快速近似还包含针对多模态内容的内嵌图片清洗与面向 Token 预算的文本裁剪能力。该模块被 Agent 上下文窗口记录、速率限制、历史压缩、对话命名、Prompt 注入扫描等多个核心链路复用。读完本文你将掌握这五个公开函数的调用契约、缓冲常量的设计意图以及它们在实际源码与测试中是如何被验证和使用的。模块定位一个扁平目录下的共享 Token API在 helpers 目录中tokens.py与它的文档伴侣tokens.py.dox.md刻意保持同目录共存。DOX 文档helpers/tokens.py.dox.md明确了所有权契约tokens.py拥有运行时实现tokens.py.dox.md负责记录该实现的责任、公开契约、副作用与验证方式由于目录刻意扁平化文档必须与源码保持同步。DOX 同时强调辅助模块拥有被核心代码与插件复用的框架级 API除非所有调用方、测试与文档一并更新否则必须保持公开调用方不变并且要求路径、认证、密钥、持久化、网络与子进程行为保持显式且有界。tokens.py被观察到的副作用区域是secret handling密钥处理即它不会触碰任何密钥或安全边界仅做纯文本计算。模块的依赖面非常收敛仅有三项标准库re、类型标注typing以及 OpenAI 官方的tiktoken。这让它成为一个零业务依赖、可独立测试的纯计算单元。五个公开函数契约与源码实现DOX 文档列出的顶层函数共五个下面逐一结合源码helpers/tokens.py展开。1.count_tokens精确计数def count_tokens(text: str, encoding_namecl100k_base) - int: if not text: return 0 encoding tiktoken.get_encoding(encoding_name) tokens encoding.encode(text, disallowed_special()) token_count len(tokens) return token_count空文本直接返回0避免无意义的编码调用默认使用cl100k_base编码GPT-4 与 GPT-3.5 系列采用的 BPE 词表disallowed_special()表示允许编码所有特殊 Token如|endoftext|防止对包含特殊序列的文本抛异常返回值是encoding.encode结果的长度即真正的 BPE Token 数量。该函数在_promptinclude插件中承担精确预算核算扫描器用count_tokens(raw)统计每个文件的真实 Token 数scanner.py并据此决定文件是否整体纳入、按单文件上限裁剪还是被跳过。2.approximate_tokens带缓冲的快速近似APPROX_BUFFER 1.1 def approximate_tokens(text: str) - int: return int(count_tokens(text) * APPROX_BUFFER)近似值 精确值 × 1.1。这 10% 的缓冲APPROX_BUFFER覆盖了编码差异、消息格式开销角色标签、换行、分隔符等不可见成本确保近似估计偏保守宁高勿低避免实际请求超出上下文窗口。它是全项目使用最频繁的入口Message.calculate_tokens用它为每条历史消息计算 Token 数history.py并在压缩摘要后重新计算速率限制器用它为输入输出增量计费models.py聊天压缩插件用它判断历史是否超出输入预算compactor.py。3.sanitize_embedded_image_data_urls内嵌图片清洗EMBEDDED_IMAGE_DATA_PLACEHOLDER [embedded image data omitted from token estimate] _EMBEDDED_IMAGE_DATA_URL_PATTERN re.compile( rdata:(image/[A-Za-z0-9.-](?:;[A-Za-z0-9.-][A-Za-z0-9./_-])*);base64,[A-Za-z0-9/_-] ) def sanitize_embedded_image_data_urls(text: str) - str: if not text: return text return _EMBEDDED_IMAGE_DATA_URL_PATTERN.sub( fdata:\\1;base64,{EMBEDDED_IMAGE_DATA_PLACEHOLDER}, text, )多模态消息会把整张图片以data:image/png;base64,...的形式内联进 Prompt。一张图片的 base64 可能膨胀到数万甚至数十万字符若按文本方式计数Token 估算会被严重污染。该函数用正则识别image/[A-Za-z0-9.-]图片 MIME 类型png/jpeg/webp 等可选的多参数段如;charsetutf-8跟随的;base64,与 base64 字符集并将整段 base64 载荷替换为固定占位符保留 MIME 头以便识别图片存在。正则采用re.compile预编译可反复复用。4.approximate_prompt_tokens面向 Prompt 的近似入口def approximate_prompt_tokens(text: str) - int: return approximate_tokens(sanitize_embedded_image_data_urls(text))先清洗内嵌图片再近似两步组合成Prompt 语境下的 Token 估算。这是 Agent 主循环记录上下文窗口大小所用的入口在 agent.py 中build_prompt将系统提示、协议、历史与扩展信息格式化为full_text后用approximate_prompt_tokens(full_text)计算并存入上下文窗口数据供前端展示与后续决策。_a0_connector插件的token_statusAPI 同样用它上报会话 Token 状态token_status.py。5.trim_to_tokens按预算裁剪文本TRIM_BUFFER 0.8 def trim_to_tokens(text, max_tokens, direction, ellipsis...): chars len(text) tokens count_tokens(text) if tokens max_tokens: return text approx_chars int(chars * (max_tokens / tokens) * TRIM_BUFFER) if direction start: return text[:approx_chars] ellipsis return ellipsis text[chars - approx_chars: chars]裁剪流程分四步快速通道若当前 Token 数已不超预算直接原样返回比例换算以字符数 ×预算/当前 Token× TRIM_BUFFER估算目标字符数。TRIM_BUFFER 0.8让第一次裁剪就留出 20% 的余量补偿 BPE 切分的不均匀性避免一次裁剪后仍然超限方向控制directionstart保留文本开头丢弃结尾适用于日志类头重内容directionend保留文本结尾适用于需要保留最新结论的对话内容省略号标记被截断的一端用ellipsis默认...标注让读者知道内容不完整。调用方可以反过来利用APPROX_BUFFER反推精确预算聊天命名插件用max(int(token_budget / tokens.APPROX_BUFFER) - 1, 1)把近似预算换算成精确 Token 预算再调用trim_to_tokens(..., directionend)并通过循环逐步收缩预算直到近似值达标naming.py。_promptinclude扫描器在预算即将耗尽时用trim_to_tokens(raw, remaining, directionstart)保留文件开头、裁剪掉超过预算的尾部scanner.py。缓冲常量一对互补的设计哲学常量值作用域设计意图APPROX_BUFFER1.1近似估算在精确值上浮 10%让估算偏保守防止超出上下文/速率预算TRIM_BUFFER0.8裁剪计算在目标字符数上打 8 折让裁剪偏激进防止一次裁剪后仍超限两者方向相反、目标一致近似时宁多算裁剪时宁少留。_text_editor插件在估算行级 Token 时同样引用TRIM_BUFFERfile_ops.py与主模块保持同一套余量策略。底层原理tiktoken 的 BPE 编码count_tokens的精确性来自tiktoken——OpenAI 的 BPEByte Pair Encoding分词库。tiktoken.get_encoding(cl100k_base)返回编码器后encoding.encode(text)将文本切分为词表编号序列其长度即 Token 数。要点BPE 从字节级别构建合并规则天然支持任意 Unicode 文本中文、Emoji 等无需语言特定的分词器同一文本在不同编码如o200k_base下 Token 数可能不同因此函数暴露了encoding_name参数以便按模型族切换由于 BPE 的切分与模型实际推理一致count_tokens的返回值可以作为请求计费与上下文管理的可靠基准。helpers/tokens.py中所有近似与裁剪最终都锚定在这一精确基线上。测试与验证可复现的证据链DOX 文档列出了与该模块相关的测试面其中 tests/test_default_prompt_budget.py 直接验证了图片清洗行为L197-L207embedded_png data:image/png;base64, (ABCDabcd0123/ * 20_000) prompt_text fuser: please inspect this screenshot {embedded_png} sanitized tokens.sanitize_embedded_image_data_urls(prompt_text) assert ABCDabcd0123/ not in sanitized assert data:image/png;base64, in sanitized assert tokens.EMBEDDED_IMAGE_DATA_PLACEHOLDER in sanitized assert tokens.approximate_prompt_tokens(prompt_text) 100 assert tokens.approximate_prompt_tokens(prompt_text) tokens.approximate_tokens(prompt_text) / 100该测试构造了一段包含约 24 万字符 base64 的 Prompt验证了三个关键契约base64 载荷被彻底移除断言不含原始数据MIME 头被保留data:image/png;base64,仍存在清洗不破坏这是一张图的信息估算量级正确清洗后的近似 Token 小于 100且不到未清洗近似值的 1%证明图片数据不会再污染 Prompt 预算。其它相关验证还包括默认 Prompt 总预算不超过 1 万 Token 的守卫测试同文件 L60、压缩插件用桩函数替换近似逻辑的行为测试test_chat_compaction.py、L169、浏览器回归中对 Prompt 近似值的上限断言test_browser_agent_regressions.py以及工具行为契约测试中对approximate_tokens的桩替换test_tool_action_contracts.py。这些测试印证了该模块在多个子系统间被稳定复用的契约稳定性。使用指南与边界说明精确 vs 近似的选择需要严格计费、逐文件核算时用count_tokens需要快速判断是否超出预算时用approximate_tokens其 1.1 倍缓冲可容忍格式开销多模态消息必须走approximate_prompt_tokens直接对含图片的文本调用approximate_tokens会把 base64 当普通文本计数导致估算严重失真裁剪方向日志、代码等头部重要内容用directionstart对话、结论等尾部重要内容用directionend并配合ellipsis标记截断编码参数默认cl100k_base面向 GPT 系列模型若目标模型使用其他词表如o200k_base应显式传入对应encoding_name性能count_tokens每次都会执行完整 BPE 编码在超长文本上高频调用有成本因此项目内常见模式是近似先行、精确兜底——先用approximate_tokens快速分流仅在最终决策时使用count_tokens或trim_to_tokens。小结helpers/tokens.py用不足 70 行的实现为 Agent Zero 提供了从精确计数到预算裁剪的完整 Token 管理闭环count_tokens是精确基准approximate_tokens提供带余量的快速判断sanitize_embedded_image_data_urls与approximate_prompt_tokens解决多模态场景的估算失真trim_to_tokens配合TRIM_BUFFER保障裁剪一次到位。理解这套 API 的契约与缓冲哲学是在该项目中编写上下文管理、速率限制与插件扩展代码的前提。【免费下载链接】agent-zeroAgent Zero AI framework项目地址: https://gitcode.com/GitHub_Trending/ag/agent-zero创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表