尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

LangChain Go 实战:使用 OpenAI o1-preview 推理模型构建问答应用

LangChain Go 实战:使用 OpenAI o1-preview 推理模型构建问答应用 LangChain Go 实战使用 OpenAI o1-preview 推理模型构建问答应用【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo导读本文围绕 langchaingo 仓库中 openai-o1-example 这一官方示例完整讲解如何在 Go 中通过 LangChain for Go 接入 OpenAI 的 o1 系列推理模型o1-preview / o1-mini包括模型客户端初始化、自定义参数max tokens、temperature的设置、推理内容的生成以及如何提取与打印生成元数据token 用量等。读完本文你将掌握llms.GenerateContent调用链的完整写法并能在自己的 Go 应用中复刻这一模式让 o1 模型为你执行复杂的规划与代码生成任务。示例概览它做了什么该示例位于 examples/openai-o1-example/openai_o1_chat_example.go核心流程分为四步初始化 OpenAI 语言模型客户端默认指定o1-preview模型构造一段提示词请模型为用 Go 构建一个基于数据库的问答应用做规划并输出完整代码文件通过llm.GenerateContent基于提示词生成内容打印生成的正文以及本次生成附带的元数据JSON 格式。这是一个单轮推理 元数据查看的最小可运行示例不涉及记忆、工具调用或多轮对话非常适合作为接入 o1 系列模型的入门起点。环境准备与运行方式前置条件安装 Go示例的 go.mod 声明go 1.24.3并依赖github.com/tmc/langchaingo v0.1.14-pre.4请确保本地 Go 版本兼容设置 OpenAI API 凭据。OpenAI 客户端默认从OPENAI_API_KEY环境变量读取密钥见 llms/openai/openaillm_option.go 中的tokenEnvVarName定义。运行命令go run openai_o1_chat_example.go也可以使用-model命令行参数切换模型例如go run openai_o1_chat_example.go -model o1-mini-model参数由标准库flag包解析默认值为o1-preview示例代码中的定义如下var flagModel flag.String(model, o1-preview, model to use (e.g. o1-preview, o1-mini))也就是说运行时不加参数默认走o1-preview加参数则可切换到o1-mini等模型名。核心实现逐行拆解1. 初始化 OpenAI 客户端llm, err : openai.New( openai.WithModel(*flagModel), ) if err ! nil { log.Fatal(err) }openai.New接收可变参数形式的函数式选项functional options。这里使用openai.WithModel显式指定模型名若不指定客户端会回退到OPENAI_MODEL环境变量。从 llms/openai/openaillm_option.go 的源码注释可以看到WithModel未设置时模型从OPENAI_MODEL环境变量读取当使用 AzureAPIType 为APITypeAzure/APITypeAzureAD时WithModel是必填项。如果需要进一步定制客户端同文件还提供了WithToken、WithBaseURL、WithOrganization、WithAPIType、WithAPIVersion等选项分别对应OPENAI_API_KEY、OPENAI_BASE_URL、OPENAI_ORGANIZATION等环境变量。默认基础 URL 为https://api.openai.com/v1。2. 构造消息内容content : []llms.MessageContent{ llms.TextParts(llms.ChatMessageTypeHuman, I want to build a Go app that takes user questions and looks them up in a database where they are mapped to answers. If there is a close match, it retrieves the matched answer. If there isnt, it asks the user to provide an answer and stores the question/answer pair in the database. Make a plan for the directory structure youll need, then return each file in full. Only supply your reasoning at the beginning and end, not throughout the code.), }消息通过 llms.TextParts 构建它接收一个ChatMessageType角色这里是llms.ChatMessageTypeHuman即人类/用户消息和若干字符串片段将其包装成MessageContent结构体。从源码看MessageContent包含Role与Parts []ContentPart两个字段TextParts内部会把每个字符串片段逐一转换为TextPart即TextContent并追加到Parts中。这意味着同一消息里可以包含多段文本甚至是不同类型的ContentPart——这是 LangChain for Go 统一的多模态消息模型后续扩展到图片等非文本内容时无需改变整体调用结构。提示词本身也值得留意它要求 o1 模型先规划目录结构再返回每个文件的完整代码并且只在开头和结尾给出推理过程。这类明确的输出约束正是 o1 系列推理模型擅长的任务形态。3. 生成内容output, err : llm.GenerateContent(ctx, content, llms.WithMaxTokens(4000), llms.WithTemperature(1), ) if err ! nil { log.Fatal(err) } fmt.Println(output.Choices[0].Content)GenerateContent是 langchaingo 所有 LLM 实现的统一入口接口见 llms/llms.go 中LLM接口的GenerateContent方法。调用时通过CallOption传入生成参数llms.WithMaxTokens(4000)限制生成的最大 token 数。示例设置为 4000因为 o1 系列是推理模型会在正式回答前进行思考reasoning需要预留足够的输出空间llms.WithTemperature(1)调节输出的随机性/创造力。langchaingo 中该字段的取值范围约定为 0 到 1。值得注意的是o1 系列模型的请求与常规 GPT 模型存在差异。在 llms/openai/internal/openaiclient/chat.go 中客户端会对以o1-为前缀的模型进行特判strings.HasPrefix(model, o1-)并将其识别为推理模型reasoning model在序列化请求时做相应处理例如 o1 模型会省略 temperature 字段相关行为见 llms/openai/internal/openaiclient/marshal_test.go 中 o1 model omits temperature 的测试用例。因此示例中即便传入WithTemperature(1)针对 o1 模型时该参数也不会被发送到服务端。生成结果通过output.Choices[0].Content取出首个候选的文本内容并打印这就是模型对提示词的最终回答。4. 打印生成元数据fmt.Println(\ngeneration info:) json.NewEncoder(os.Stdout).Encode(output.Choices[0].GenerationInfo)GenerationInfo是一个map[string]any保存了本次生成的统计信息。对于 OpenAI 客户端它由 llms/openai/openaillm.go 填充包含CompletionTokens生成部分消耗的 token 数PromptTokens提示词消耗的 token 数TotalTokens总 token 数ReasoningTokenso1 等推理模型在思考阶段消耗的 token 数来自CompletionTokensDetails.ReasoningTokens。将GenerationInfo以 JSON 形式输出到标准输出方便观察 o1 模型的推理开销与整体 token 消耗——这对估算成本、调优MaxTokens都非常有用。从示例到实战扩展建议切换模型通过-model o1-mini或修改WithModel参数即可在o1-preview与o1-mini之间切换在 llms/openai/internal/openaiclient/chat.go 中还可以看到o3、o3-mini等模型同样被识别为推理模型说明这套客户端已为后续推理模型家族做了通用化处理。读取环境变量若不显式传 token请确保导出OPENAI_API_KEY也可参考 examples/openai-chat-example 了解 OpenAI 客户端在常规模型下的更多用法。元数据驱动调优将GenerationInfo中的ReasoningTokens与CompletionTokens结合分析可判断MaxTokens设置是否过小导致回答被截断或过大造成浪费。多轮与工具调用扩展本示例是单轮推理若需让 o1 模型参与多轮对话或函数调用可参考仓库中 openai-functions-agent 以及 agents 包的实现那里展示了如何在 langchaingo 中组合 Agent、工具与 LLM。小结通过本示例你已了解在 LangChain for Go 中使用 OpenAI o1 推理模型的标准模式openai.New初始化客户端 →llms.TextParts构造消息 →GenerateContent携带CallOption生成内容 → 读取Choices[0]获取正文与GenerationInfo元数据。完整可运行的代码见 openai_o1_chat_example.go配合go run与OPENAI_API_KEY即可在几分钟内跑通整个流程并以此为模板继续构建更复杂的 Go LLM 应用。【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表