eino 中 reasoning_content 推理过程解析与实战指南

📅 发布时间:2026/9/13 19:05:59
eino 中 reasoning_content 推理过程解析与实战指南
eino 中 reasoning_content 推理过程解析与实战指南【免费下载链接】einoThe ultimate LLM/AI application development framework in Go.项目地址: https://gitcode.com/GitHub_Trending/ei/eino用 eino 写 Agent模型回传的消息里除了正文还有一个不太起眼的字段——reasoning_content它装着模型在给出答案前的思考过程。如果你调试时总觉得模型这步怎么突然跑偏了却只能看到干巴巴的最终答案那这个字段就是你要的突破口。本文从一个能立刻跑通的最小场景讲起再倒推它的字段定义、流式拼接和展示逻辑。先让模型把思考过程吐出来跑一个能返回推理内容的最小链路先确认两件事选带推理能力的模型并打开思考参数不是所有模型都会回填reasoning_content。字段注释写得很直白只有当模型返回推理内容时它才会被填进去。换句话说你得选带推理能力的模型并在请求里打开思考开关否则这个字段永远是空的后面所有讨论都不成立。从返回的 Message 里直接取字段拿到响应后读msg.ReasoningContent就行。它和正文Content是平级的两个 string互不干扰不需要额外解析。这个字段到底定义在哪schema/message.go 里的一个可选 stringreasoning_content的定义在 schema/message.go 的 Message 结构体里就一行// 模型思考过程模型返回推理内容时才会带上 ReasoningContent string json:reasoning_content,omitempty两个细节值得停一下类型是 string 而非结构体序列化标签带omitempty。前者意味着 eino 把思考当成一段纯文本挂在消息上后者意味着空值序列化时直接消失你导出的 JSON 里不会出现一个空字符串字段。它为什么能跟着消息一起走Message 本身是可序列化、可拷贝、可合并的一等对象。正因为reasoning_content是它的普通字段才会自动跟着 checkpoint、缓存、日志这些环节流动你不必为它单独写搬运逻辑。流式返回时推理内容怎么拼真实调用几乎都是流式一段思考会被拆成若干 chunk 吐回来最后要拼回一条。ConcatMessages 负责纵向合并schema/message.go 里的ConcatMessages把多条流式消息合并成一条推理内容和正文各归各位if msg.ReasoningContent ! { reasoningContents append(reasoningContents, msg.ReasoningContent) reasoningContentLen len(msg.ReasoningContent) }OpenAI 扩展里的横向排序若底层是 OpenAI 系接口schema/openai/extension.go 还定义了带Index字段的ReasoningContent结构Index只有流式才有。拼接时按Index排序、同 index 累加文本乱序到达的分片也能拼回原顺序。这一层供应商相关你一般不碰但排查流式推理内容错位时要想到它。思考过程如何被看到String() 里专门给它留了位置Message 的String()方法负责把消息打成可读文本它给推理内容单独留了一段非空才打印if len(m.ReasoningContent) 0 { sb.WriteString(\nreasoning content:\n) sb.WriteString(m.ReasoningContent) }所以fmt.Println(msg.String())之后非空的推理内容会以独立段落冒出来跟 tool_calls、usage 并列。这是日常调试时最快的查看入口。两个容易忽略的消费方这个字段不只用来展示还有两个会真正算它的地方 token 估算把它算进去了adk/middlewares/reduction/reduction.go 的默认 token 计数器会把 ReasoningContent 和正文一起累加来估长度。推理内容越长占用的预算越多触发裁剪的时机也越早。摘要中间件同样在数它adk/middlewares/summarization/summarization.go 计算消息总长时是len(msg.Content) len(msg.ReasoningContent)一起算。别以为思考免费它实实在在吃上下文窗口。动手验证清单按顺序走一遍确认每个环节都通 选带推理能力、且请求里打开了思考参数的模型发一条会触发多步分析的问题。读返回 Message 的ReasoningContent确认非空再fmt.Println(msg.String())看它是否单独成段。换流式调用确认ConcatMessages把分片拼成了一条完整推理。打开 reduction / summarization 中间件观察长推理内容如何提前触发裁剪。检查导出 JSON空值时字段应因omitempty消失非空时应原样保留。哪一步卡住就把对应那一层单独抽出来打印定位到此为止。【免费下载链接】einoThe ultimate LLM/AI application development framework in Go.项目地址: https://gitcode.com/GitHub_Trending/ei/eino创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考