LangChain Go 实战:使用 Mistral 模型实现流式与非流式文本补全 LangChain Go 实战使用 Mistral 模型实现流式与非流式文本补全【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo导读本文以仓库中的 Mistral Completion 示例 为核心完整演示如何通过 LangChain for Golangchaingo接入 Mistral AI 大模型实现单轮文本补全并对比流式streaming与非流式两种调用方式。读完本文你将掌握mistral.New的初始化与模型切换、llms.WithTemperature的随机性控制以及llms.WithStreamingFunc的分块实时输出技巧并能直接运行示例代码获得真实补全结果。示例概述这个例子做了什么examples/mistral-completion-example 目录下的示例是一个单文件 Go 程序围绕 Mistral AI 模型展示三件事模型初始化使用mistral.New()创建 Mistral 语言模型实例默认指定open-mistral-7b模型流式补全向模型提问 Who was the first man to walk on the moon?响应按块chunk实时流式输出到控制台非流式补全向模型提问 Who was the first man to go to space?等待完整响应生成后再一次性打印同时切换为mistral-small-latest模型并调低 temperature用于展示不同的调用参数组合。目录内包含四个文件README.md说明文档、mistral_completion_example.go示例主程序、go.mod 与 go.sum独立模块的依赖声明。前置准备与依赖运行该示例需要满足两个前提Mistral API 凭据设置环境变量MISTRAL_API_KEY。示例本身未显式传入 API Key而是依赖mistral.New的默认行为——从os.Getenv(MISTRAL_API_KEY)读取见 mistralmodel.go。你也可以在代码中通过mistral.WithAPIKey(...)显式覆盖。Go 依赖示例是独立 Go 模块go 1.24.3依赖github.com/tmc/langchaingo v0.1.14-pre.4其底层通过github.com/gage-technologies/mistral-go v1.1.0这个第三方 SDK 与 Mistral API 通信见 go.mod。完整示例代码先看完整程序取自 mistral_completion_example.gopackage main import ( context fmt log github.com/tmc/langchaingo/llms github.com/tmc/langchaingo/llms/mistral ) func main() { llm, err : mistral.New(mistral.WithModel(open-mistral-7b)) if err ! nil { log.Fatal(err) } ctx : context.Background() // 流式补全 completionWithStreaming, err : llms.GenerateFromSinglePrompt(ctx, llm, Who was the first man to walk on the moon?, llms.WithTemperature(0.8), llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error { fmt.Print(string(chunk)) return nil }), ) if err ! nil { log.Fatal(err) } // 流式结束后完整响应同样会保存在返回值中 _ completionWithStreaming // 非流式补全 completionWithoutStreaming, err : llms.GenerateFromSinglePrompt(ctx, llm, Who was the first man to go to space?, llms.WithTemperature(0.2), llms.WithModel(mistral-small-latest), ) if err ! nil { log.Fatal(err) } fmt.Println(\n completionWithoutStreaming) }整个程序只依赖 langchaingo 的两个包llms通用模型接口与调用选项和llms/mistralMistral 专属实现。初始化 Mistral 模型mistral.New(opts ...Option)负责实例化模型对象。从 mistralmodel.go 的源码可以看到其默认值体系配置项默认值说明API Keyos.Getenv(MISTRAL_API_KEY)从环境变量读取可用WithAPIKey覆盖端点sdk.Endpoint默认为 Mistral 官方 API 地址来自 mistral-go SDK最大重试次数sdk.DefaultMaxRetriesAPI 调用失败时的重试上限超时时间sdk.DefaultTimeout等待模型响应的最长时长模型名称sdk.ModelOpenMistral7b即open-mistral-7b可通过WithModel切换初始化后Model对象内部封装了 mistral-go 的MistralClient、一份clientOptions以及 langchaingo 的CallbacksHandler默认是callbacks.SimpleHandler并且通过var _ llms.Model (*Model)(nil)编译期断言确保其完整实现 langchaingo 的llms.Model接口。mistral.New还接受更多客户端级选项定义于 client_options.goWithAPIKey(apiKey string)显式传入 API KeyWithEndpoint(endpoint string)自定义 API 端点例如自建代理或兼容服务WithMaxRetries(maxRetries int)设置失败重试次数WithTimeout(timeout time.Duration)设置客户端超时WithModel(model string)设置默认模型名WithCallbacksHandler(handler callbacks.Handler)设置回调处理器。流式补全逐块输出响应第一个调用展示了流式能力llms.GenerateFromSinglePrompt(ctx, llm, Who was the first man to walk on the moon?, llms.WithTemperature(0.8), llms.WithStreamingFunc(func(ctx context.Context, chunk []byte) error { fmt.Print(string(chunk)) return nil }), )关键点在于llms.WithStreamingFunc它接收一个回调函数每当模型返回一个内容块时就会被调用chunk []byte就是该块的内容。示例中直接fmt.Print输出因此用户可以在完整答案生成之前就逐字看到回复非常适合聊天机器人、命令行流式输出等追求低延迟体验的场景。值得注意的是即使启用了流式GenerateFromSinglePrompt返回的字符串在流结束后仍然是完整响应代码中用_ completionWithStreaming占位说明这一点。这是因为底层在流式收集内容的同时把每个Delta.Content累加进了最终响应结构体中见下文原理分析。非流式补全等待完整响应第二个调用是非流式版本llms.GenerateFromSinglePrompt(ctx, llm, Who was the first man to go to space?, llms.WithTemperature(0.2), llms.WithModel(mistral-small-latest), )这里演示了两个参数技巧按调用切换模型通过llms.WithModel(mistral-small-latest)在单次调用层面覆盖默认的open-mistral-7b。这种按调用覆盖的能力来自 options.go 的WithModel它在请求发出前写入CallOptions.Model。调低 temperaturellms.WithTemperature(0.2)使输出更确定、更保守Mistral SDK 中 temperature 的取值范围是 0 到 1。对比第一次调用的 0.8可以直观感受创意度的差异——值越高采样越随机越可能产生多样化、不可预测的回答。调用完成后程序用fmt.Println(\n completionWithoutStreaming)打印完整结果开头补一个换行避免与前面的流式输出粘连。底层原理从单提示词到 Mistral API两个调用都经由llms.GenerateFromSinglePrompt这个便捷函数见 llms.go发起。它的内部逻辑是将单个字符串 prompt 包装成llms.MessageContent角色为ChatMessageTypeHuman人类消息内容为TextContent{Text: prompt}调用模型接口的GenerateContent(ctx, messages, options...)从返回的ContentResponse.Choices中取出第一条返回其Content字符串。进入 mistralmodel.go 的GenerateContent后会根据callOptions.StreamingFunc是否为 nil 分派到两条路径非流式路径generateNonStreamingContent调用m.client.Chat(...)一次性获取完整回复把Choices逐个转换为 langchaingo 的ContentChoice并携带created、model、usage等生成信息若响应中带工具调用ToolCalls也会一并映射为llms.ToolCall。流式路径generateStreamingContent调用m.client.ChatStream(...)拿到一个响应 channel逐块遍历每个 chunk 的Delta.Content先累加到总内容中同时提取created、model、usage元数据将本块内容交给callOptions.StreamingFunc回调即示例中的打印函数若 chunk 携带错误立即返回错误终止流。因此示例中边生成边打印、结束后还能拿到完整字符串的行为正是这条流式累加逻辑的体现。此外mistralmodel.go 中的resolveDefaultOptions还暴露了当前 Mistral 实现支持的调用参数边界MaxTokens、Temperature、TopP、Seed、Functions/Tools均已映射到 SDK 请求而MinLength、MaxLength、N生成多个候选项、RepetitionPenalty、FrequencyPenalty、PresencePenalty等参数目前尚未被 Mistral SDK 支持使用时应避免依赖这些选项。可用的调用级参数除了示例中用到的WithTemperature、WithModel、WithStreamingFunclangchaingo 在 options.go 中还为单次调用提供了一系列通用选项均适用于 Mistral 模型选项作用WithModel(model)覆盖本次调用使用的模型名WithMaxTokens(n)限制生成的最大 token 数WithTemperature(t)控制输出随机性Mistral 取值 0–1WithTopP(p)核采样top-p控制累积概率截断WithSeed(seed)固定随机种子获得可复现的采样结果WithStreamingFunc(fn)启用流式输出逐块回调WithStopWords(words)指定停止生成的词列表WithCandidateCount(n)生成多个候选响应WithTopK(k)top-k 采样错误处理与失败场景示例对每次调用都做了err ! nil检查并log.Fatal退出。Mistral 实现的错误处理见 errors.go会把底层 SDK 报错映射为 langchaingo 统一错误码常见场景包括API Key 无效/未授权401→ErrCodeAuthentication触发限流429→ErrCodeRateLimit模型不存在model not found→ErrCodeResourceNotFound上下文超长/超出 max_tokens →ErrCodeTokenLimit配额耗尽quota exceeded→ErrCodeQuotaExceeded服务不可用或内部错误500/503→ErrCodeProviderUnavailable。这类统一映射对上层做重试、降级与用户提示非常有价值是生产环境接入 Mistral 时可以直接复用的能力。运行示例确认MISTRAL_API_KEY已设置后在 examples/mistral-completion-example 目录下执行export MISTRAL_API_KEYyour-api-key go run mistral_completion_example.go预期行为程序先以流式逐字打印第一个问题的回答Who was the first man to walk on the moon?对应阿姆斯特朗随后换行打印第二个问题的完整回答Who was the first man to go to space?对应尤里·加加林。由于两次调用使用了不同的模型与 temperature实际输出内容与措辞会有所差异这正是观察参数影响的好机会。如果想进一步实验可以在此基础上扩展改用llms.WithMaxTokens控制回答长度、用llms.WithSeed观察固定种子的可复现性或参考 llms/mistral 的测试用例 了解更丰富的调用场景与断言方式。【免费下载链接】langchaingoLangChain for Go, the easiest way to write LLM-based programs in Go项目地址: https://gitcode.com/GitHub_Trending/la/langchaingo创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考