链式调用与 Prompt 模板
"链"(Chain)是 LangChain 的核心抽象:将模板填充、模型调用、输出解析等步骤组合为可复用的流程。langchaingo 通过 prompts 与 chains 包实现这一模型。
PromptTemplate
模板使用 Go 的 text/template 语法,声明时需列出全部变量:
chains.Run(ctx, chain, input) 是单输入链的快捷方式,等价于 chains.Call 传入只有一个键的映射;返回值直接是字符串。多变量链一律使用 Call,结果通过 llmChain.OutputKey 取出。
顺序链:组合多个步骤
复杂任务可以拆分为多个链串联:前一步的输出作为后一步的输入。典型流程是"先让模型生成,再让模型评估":
顺序链的键必须严格衔接:每条链的输入变量要么来自整体输入,要么来自上游某条链的输出键;各链输出键不能重复。默认输出键为 text,需要区分时自定义 OutputKey。
会话记忆
NewConversation 内置了对话模板(history + input)与记忆接口,几行代码即可获得有上下文的多轮对话:
记忆策略选择:ConversationBuffer 原样保存全部历史,简单但会随轮数膨胀;长会话应改用长度受限的缓冲记忆(NewConversationTokenBuffer)或将历史落库,通过 database 自行管理。
输出结构化
模型输出常需转为结构体。先约束模型输出 JSON,再配合 encoding/json 解析:
LLM 输出具有不确定性,直接 json.Unmarshal 可能因代码围栏(```json)或多余文本失败。健壮的做法是:截取第一个 { 到最后一个 } 之间的内容,或使用支持结构化输出/JSON 模式的模型参数。
与并发结合
链本身不是并发安全的共享对象,但可以并发地调用同一条链,用 WaitGroup 批量处理任务:
小结
prompts.NewPromptTemplate+chains.NewLLMChain构成最小编排单元。- 多输入链用
chains.Call,单输入链可用chains.Run;复杂流程用顺序链拆解。 - 记忆组件维护对话历史;结构化输出需在 Prompt 中约束并做容错解析。