使用 LangChain Go 的 JSON Mode:从多 LLM 后端获取结构化 JSON 输出

发布时间:2026/11/12 4:12:40

使用 LangChain Go 的 JSON Mode:从多 LLM 后端获取结构化 JSON 输出 使用 LangChain Go 的 JSON Mode从多 LLM 后端获取结构化 JSON 输出【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo导读本文围绕 langchaingo 仓库中的 json-mode-example 示例 展开讲解如何用同一套 Go 代码通过llms.WithJSONMode()让 OpenAI、Ollama、Anthropic、Google AI 四个不同后端稳定输出 JSON 格式的结构化数据。读完本文你将掌握 langchaingo 中 JSON 结构化输出的核心 API、各后端底层实现差异以及如何修改和扩展该示例用于真实业务。示例要解决什么问题大语言模型默认返回自由文本这对程序化解析很不友好。JSON Mode 的核心价值在于让模型在推理时就被约束为输出合法 JSON配合明确要求字段名的提示词即可获得可直接json.Unmarshal的结构化结果。这个示例程序做的事情非常聚焦见 examples/json-mode-example/README.md通过命令行 flag 选择要使用的 AI 后端初始化所选后端OpenAI、Ollama、Anthropic 或 Google AI发送提示词 Who was the first man to walk on the moon? 并要求以 JSON 格式响应打印模型返回的 JSON 内容。它同时演示了两个关键实践JSON Mode 结构化输出和temperature 设为 0 获得更确定的结果。环境准备与运行方式示例是独立 Go module见 examples/json-mode-example/go.modmodule 名为github.com/tmc/langchaingo/examples/json-mode-exampleGo 版本要求go 1.24.3依赖github.com/tmc/langchaingo v0.1.14-pre.4因此直接在该目录下go run即可无需手动配置本地 replace。运行前先确保目标后端所需的 API Key 或本地服务就绪后端前置条件openai设置OPENAI_API_KEY环境变量ollama本地启动 Ollama 服务并已拉取mistral模型anthropic设置ANTHROPIC_API_KEY环境变量googleai设置GEMINI_API_KEY或等效的 Google AI 凭据启动命令来自 READMEgo run json_mode_example.go -backendopenai将openai替换为ollama、anthropic或googleai即可切换后端无需改动任何代码go run json_mode_example.go -backendollama go run json_mode_example.go -backendanthropic go run json_mode_example.go -backendgoogleai完整代码逐段解析源码位于 examples/json-mode-example/json_mode_example.go结构非常精简整体只有三个部分。1. flag 定义与主流程var flagBackend flag.String(backend, openai, backend to use) func main() { flag.Parse() ctx : context.Background() llm, err : initBackend(ctx) if err ! nil { log.Fatal(err) } completion, err : llms.GenerateFromSinglePrompt(ctx, llm, Who was first man to walk on the moon? Respond in json format, include first_man in response keys., llms.WithTemperature(0.0), llms.WithJSONMode(), ) if err ! nil { log.Fatal(err) } fmt.Println(completion) }核心只有一次调用llms.GenerateFromSinglePrompt(ctx, llm, prompt, opts...)。注意提示词本身也参与了结构化约束——除了要求 Respond in json format还明确指定了first_man必须出现在响应键中这是获得稳定字段名的关键技巧JSON Mode 保证格式合法提示词决定字段内容。2. 四个后端的统一初始化func initBackend(ctx context.Context) (llms.Model, error) { switch *flagBackend { case openai: return openai.New() case ollama: return ollama.New(ollama.WithModel(mistral)) case anthropic: return anthropic.New(anthropic.WithModel(claude-3-5-sonnet-20240620)) case googleai: return googleai.New(ctx, googleai.WithDefaultModel(gemini-1.5-flash)) default: return nil, fmt.Errorf(unknown backend: %s, *flagBackend) } }所有后端都返回统一的llms.Model接口这是 langchaingo 多后端抽象的核心业务代码只依赖llms包具体厂商差异被收敛在各自的初始化函数里。此处也展示了各家的模型选择方式Ollama 用WithModel(mistral)Anthropic 指定claude-3-5-sonnet-20240620Google AI 用WithDefaultModel(gemini-1.5-flash)OpenAI 则使用默认模型。3. 输出模型返回的 JSON 以纯文本打印到标准输出例如可能得到{first_man: Neil Armstrong}核心 APIWithJSONMode 与 GenerateFromSinglePromptWithJSONMode 选项llms.WithJSONMode()在 llms/options.go 中定义其作用是把CallOptions.JSONMode置为true对应结构体字段见 llms/options.go// WithJSONMode will add an option to set the response format to JSON. func WithJSONMode() CallOption { return func(o *CallOptions) { o.JSONMode true } }它属于CallOption体系可以和WithTemperature、WithSeed、WithMaxTokens等选项自由组合作用域仅限单次调用。GenerateFromSinglePrompt 便捷函数GenerateFromSinglePrompt定义在 llms/llms.go是为单个字符串提示词、期望单个字符串响应场景提供的便捷封装它把 prompt 包装成一条ChatMessageTypeHuman消息调用底层llm.GenerateContent然后取出第一个 choice 的文本返回。想要更细粒度控制多轮消息、多 choice、Token 用量统计时应直接使用llm.GenerateContent。各后端 JSON Mode 的底层实现差异JSON Mode 并不是 langchaingo 自己拼装提示词而是把意图透传给各厂商的专用参数。这一点在源码里可以清晰看到OpenAI在 llms/openai/openaillm.go 中JSONMode为 true 时设置req.ResponseFormat ResponseFormatJSON而ResponseFormatJSON在 llms/openai/openaillm_option.go 中被定义为ResponseFormat{Type: json_object}对应 OpenAI 的response_format: {type: json_object}参数。如果还需要严格 JSON Schema 校验langchaingo 也提供了ResponseFormatJSONSchema相关的结构化输出类型见 llms/openai/internal/openaiclient/chat.go。Ollama在 llms/ollama/ollamallm.go 中JSONMode会把请求的format字段设为json对应 Ollama 的原生 JSON 模式。Google AIGemini在 llms/googleai/googleai.go 中JSONMode会设置model.ResponseMIMEType ResponseMIMETypeJson通过 MIME 类型约束模型输出 JSON。值得注意的一个细节Google AI 后端中JSONMode与ResponseMIMEType是互斥的同时设置会直接返回错误conflicting options, cant use JSONMode and ResponseMIMEType together而ResponseMIMEType本身又支持text/plain等非 JSON 类型见 llms/options.go 附近的注释。另外 Maritaca 后端也采用了与 Ollama 相同的format json透传方式见 llms/maritaca/maritacallm.go。Anthropic示例中 Anthropic 后端同样接受这些 CallOptions从代码结构看该示例主要依赖 Anthropic 对提示词指令的遵循能力来完成 JSON 输出。这些实现差异都在 llms/googleai/googleai_test.goTestGoogleAIWithJSONMode和 llms/options_test.go 等测试中得到验证说明WithJSONMode的行为是被单元测试守护的公开契约。temperature 0 的作用llms.WithTemperature(0.0)将采样温度设为 0让模型在生成时尽可能选择高概率 token显著降低同一提示词多次调用结果漂移的概率。对 JSON 结构化输出来说这有两个直接收益字段名、嵌套结构更稳定便于程序化解析相同输入下结果可复现性更好方便调试和测试。需要说明的是temperature0 不能完全保证每次输出逐字一致模型自身仍有一定随机性若要进一步追求确定性还可以组合使用WithSeed见 llms/options.go 的Seed字段。如何基于该示例做扩展示例的提示词和字段名都是写死的实际项目中常见做法更换提示词与字段约定把 includefirst_manin response keys 替换成你需要的键名清单模型会按约束生成。解析 JSON对completion直接json.Unmarshal到自定义 struct例如var result struct { FirstMan string json:first_man } if err : json.Unmarshal([]byte(completion), result); err ! nil { log.Fatal(err) }切换更多模型在initBackend的 switch 中新增分支即可例如 OpenAI 侧换用openai.WithModel(gpt-4o)或叠加openai.WithBaseURL(...)指向兼容端点。注意事项JSON 合法 ≠ 结构符合预期JSON Mode 只保证输出是合法 JSON字段是否齐全仍取决于提示词约束生产代码应对解析结果做校验和兜底。后端能力差异不同厂商对 JSON 模式的支持机制不同json_object、format: json、ResponseMIMEType切换到新后端时建议先跑一遍示例验证行为。版本前提示例基于 langchaingov0.1.14-pre.4与 Go 1.24.3升级主库版本前建议核对WithJSONMode等 API 的兼容性。本文介绍的 json-mode-example 是探索 langchaingo 结构化输出的最小可运行入口一套代码、四个后端、一个选项即可让 LLM 返回可直接解析的 JSON——这是把大模型能力接入真实业务系统时最常用的一步。【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
延伸阅读

更多相关文章

2026/11/7 22:19:00

ICP-20100与R7KA8D2KFLCAC气压测量系统设计实战

1. 为什么“快速测量气压”这件事,从来不是换个传感器就能解决的ICP-20100 和 R7KA8D2KFLCAC 这两个型号放在一起,第一眼容易让人误以为是“随便配对就能用”的标准组合——毕竟都带“ICP”前缀,又都出现在气压传感相关文档里。但我在实际调试…

2026/11/10 0:33:22

GRPO训练崩溃根因分析与分层调试实战指南

1. 为什么GRPO训练崩溃不能靠“重跑一次”来解决?GRPO——Generalized Reinforcement Learning with Policy Optimization,是当前大模型对齐领域里一个既高效又脆弱的训练范式。它把PPO的策略梯度更新、KL约束、价值网络回传和奖励建模全部打包进一个统一…

2026/11/12 4:09:19

遂宁电工证哪里可以办多少钱都别怕学历不高也能报

遂宁电工证哪里可以办多少钱都别怕学历不高也能报 学历不高怕报不上名?别急,电工证其实没你想的那么难!今天咱们就聊聊【遂宁电工证哪里可以办】,顺便说说多少钱、怎么选机构,还有你关心的电子证书怎么查,统统给你安排上。 电工证到底值不值得考?…

2026/11/12 4:09:19

新乡长垣电工证多久拿证外省证能转吗

新乡长垣电工证多久拿证外省证能转吗 之前考的证在外省能不能转过来?这个问题,很多在河南长垣的电工朋友都问过,其实答案是 可以转 ,但需要走正规流程,特别是涉及到 新乡长垣电工证 的 多久拿证 问题,很多人还不太清楚,下面我们一步步说清楚。…

2026/11/12 4:09:18

高级电工证什么时候发报名费多少钱

南阳电工证什么时候发?真实经历告诉你怎么避坑 刚出校门就听说电工证是找工作门槛,结果到手才发现, 高级电工证什么时候发 这个问题,直接卡住了我的入职流程。那会儿我在南阳一家市政工程公司做实习,眼看项目就要开工,偏偏电工证没下来,项目经理当场…

2026/11/12 4:09:18

遂宁电工证哪里可以办 怎么报名不被坑

遂宁电工证哪里可以办 怎么报名不被坑 不知道去哪报名怕被中介坑,你不是一个人。最近我帮朋友代办电工证,结果被几个培训机构坑了,交了钱连培训都没上。这年头, 遂宁电工证哪里可以办…

2026/11/12 4:09:18

姑苏考电工证费用多少 官方报名入口怎么找

姑苏考电工证费用多少 官方报名入口怎么找 学历不高怕报不上名?其实电工证的报考门槛并不高,只要年满18周岁,具备初中及以上学历,身体健康,通过正规渠道报名就可以。尤其是现在国家对安全生产和职业资格认证越来越重视, 电工证…

2026/11/12 4:04:18

电力电缆作业证含金量到底值不值?真实经历告诉你答案

电力电缆作业证含金量到底值不值?真实经历告诉你答案 怕考不过白交培训费?这年头,特种作业证成了不少工友的“刚需”,尤其是电力电缆作业证,含金量到底高不高?其实,这事儿我身边很多人都问过,今天就从咱平顶山市政公用工程从业者的角度,聊聊电力电缆…

2026/11/11 12:42:59

电工证丢失还能补吗?千万别踩坑,丢了证等于失业

电工证丢失还能补吗?千万别踩坑,丢了证等于失业 你正在找工作,但手里的电工证突然丢了,这下怎么办?别急,先别慌, 电工证丢失还能补吗 ?答案是肯定的,但 千万别踩坑 ,补办流程如果不了解,可能会耽误你上岗、甚至影响到你的收入。…

2026/11/12 0:04:01

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘

工地太忙根本没时间复习考试?学习电工证到哪里学通过率揭秘 工地太忙根本没时间复习考试?你不是一个人。作为一名在南阳卧龙区干了七八年市政公用工程的电工,我深知这个问题的现实性。电工证不仅是工作的“入场券”,更是职业发展的“通行证”,但备考过程…

2026/11/12 0:04:01

双流电工证考别怕挂科!郑州报考避坑指南全攻略

双流电工证考别怕挂科!郑州报考避坑指南全攻略 实操考试心里没底怕挂科?双流电工证考在郑州报名,很多人因为不了解流程、准备不充分,白白浪费时间和金钱。作为三门峡应届工程类毕业生,我也曾经历过这样的焦虑。今天就从零开始,手把手教你如何避开郑州报…

2026/11/12 0:04:01

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少

之前考的证在外省能不能转过来 怎么报名考电工证培训价格多少 之前考的证在外省能不能转过来?这个问题确实让不少准备换城市工作的朋友犯了难,尤其像电工证这种实操性很强的证书,很多人担心跨省后证书能不能继续用。其实,只要符合相关流程,是可以顺利转…

2026/11/11 20:27:01

面向复杂光照与角度的宠物面部识别鲁棒性增强策略

在智慧养宠时代,基于视觉的宠物身份识别技术正逐步从实验室走向家庭应用。然而,与配合度高的人类不同,宠物是典型的“非合作生物识别对象”——它们不会主动配合摄像头调整姿态,更无法控制光照环境。实际应用中,我们常…

2026/11/10 10:29:37

SSM电子书店源码全解析:结构、原理、部署与排错实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑