eino 推理内容全链路:从 reasoning_content 字段定义到生产调试的 3 步实战
【免费下载链接】einoThe ultimate LLM/AI application development framework in Go.项目地址: https://gitcode.com/GitHub_Trending/ei/eino
为什么模型答了,你却不知道它为什么这么答
用 eino 开发 Agent 时,最常见的卡点是:模型直接回了答案,但你不知道它为什么这么回。是理解错了题意,还是推理走错了分支?事后只能靠猜。eino 的reasoning_content字段把模型每一轮的思考过程都记了下来,让你在生产环境直接核对决策链路 🔍
一图看懂 eino reasoning_content 的流转
图里 ChatModel 和 Tools 通过 action / observation 构成循环,模型每轮输出最终被包装成 AgentEvents 发出。ReasoningContent字段就挂在循环中流转的 Message 上,模型每思考一次,这段内容就随消息多出一截,方便你逐轮回溯。
拆解推理内容的三段链路
看数据层怎么定义推理字段
在 消息结构定义 中,Message结构体给每条 assistant 消息留了一个专门的字段:
// ReasoningContent is the thinking process of the model ReasoningContent string `json:"reasoning_content,omitempty"`白话:每条模型回复消息都能携带一段"思考过程",JSON 序列化时如果为空会自动省略,不占传输和存储空间。
旁边的TokenUsage.CompletionTokensDetails.ReasoningTokens还会单独统计思考消耗的 token 数,让你知道这部分输出花了多少成本。
看运行时怎么合并流式推理片段
ChatModel 的输出通常是流式的,每个 chunk 只带一小段推理文本,框架的ConcatMessages负责把它们拼回完整内容:
if msg.ReasoningContent != "" { reasoningContents = append(reasoningContents, msg.ReasoningContent) reasoningContentLen += len(msg.ReasoningContent) }白话:流式输出的每一块思考碎片都被逐个收集,函数最后按顺序拼成完整字符串写回最终 Message 的 ReasoningContent 字段。
部分模型(如 OpenAI 协议)的推理内容会包在ReasoningExtension里、按 Index 分片,schema/openai/extension.go 中的ConcatReasoningExtensions会先按索引排序再拼接,保证顺序不乱。
看合并后的思考怎么被读取和消费
消息合并完成后,有两处会直接消费这段内容。第一处是消息的调试渲染:
if len(m.ReasoningContent) > 0 { sb.WriteString("\nreasoning content:\n") sb.WriteString(m.ReasoningContent) }白话:你打印或记录消息时,只要带了思考过程,就会单独输出一段 "reasoning content",日志里一眼就能定位模型当时在想什么。
第二处在 摘要中间件:它估算消息 token 数时,把ReasoningContent的长度和正文一起计入,长对话压缩历史时不会漏算思考部分的开销。
3 步跑通 eino 推理内容读取 🚀
- 克隆代码到本地:
git clone https://gitcode.com/GitHub_Trending/ei/eino - 打开 schema/message.go,找到
ReasoningContent字段定义,确认它的序列化行为 - 跑一遍相关测试,验证流式合并逻辑:
go test ./schema/ ./schema/openai/ - 在自己的项目里,模型调用返回后直接读取
msg.ReasoningContent并打印,即可拿到完整思考过程
避坑 & 进阶
- omitempty 的"没值"要区分清楚:字段缺失通常意味着模型或供应商这一轮根本没返回思考内容,别误判为合并出 bug,先确认模型侧是否支持。
- 流式分片有顺序要求:OpenAI 协议的推理块带 Index 分片,自己手写拼接逻辑时不排序就会把思考顺序打乱,参考
ConcatReasoningExtensions按索引聚合。 - 思考过程也算 token 成本:摘要中间件估算长度时已包含这部分,长对话里思考文本常占大头,压缩历史或估算费用时要把它算进去。
掌握 reasoning_content 后,模型下次答错,你能直接翻它的思考日志,一眼看出卡在哪一步 🎯
【免费下载链接】einoThe ultimate LLM/AI application development framework in Go.项目地址: https://gitcode.com/GitHub_Trending/ei/eino
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考