链式结构
链式结构允许您将语言模型与其他信息源、第三方API或甚至其他语言模型结合使用。这使您可以创建超越单一LLM调用的强大多步骤应用程序。
LangChainGo 提供了链式结构的标准接口,并提供了几种常见的内置实现。您还可以通过实现 Chain
接口来创建自定义的链式结构。
关键概念
- 顺序处理:链式结构按顺序执行步骤,将输出在各个阶段之间传递
- 灵活的输入/输出:链式结构使用映射式的输入和输出以获得最大的灵活性
- 记忆集成:链式结构可以在调用间保持对话状态
- 组合性:可以结合多个链式结构来创建复杂的流程
内置链类型
LLM 链
最简单的链,通过提示模板调用一个LLM。
顺序链
将多个步骤连接在一起,每个步骤的输出作为下一个步骤的输入。
Map-Reduce 链
处理大型文档,通过对分块进行映射操作并减少结果来实现。
对话链
在处理新输入时保持对话记忆。
检索问答链
结合文档检索和问题回答功能。
执行链式结构
在LangChain中,有多个函数用于执行链式结构。
Call
Call是用于执行链的标准函数。该函数接受一个上下文、要执行的链以及链的输入值。输入值是一个键为字符串且值可以是任何类型的映射。该函数返回链的输出值和可能发生的错误。
res, err := chains.Call(
context.Background(),
chain,
map[string]any{
"product": "彩色袜子",
},
)
if err != nil {
log.Fatal(err)
}
fmt.Println(res)
map[text:
袜子奇妙!]
Run
如果链式结构仅期望一个输入并返回一个字符串,则可以使用run函数来执行该链。因此,前面的例子可以这样写:
text, err := chains.Run(
context.Background(),
chain,
"彩色袜子",
)
if err != nil {
log.Fatal(err)
}
fmt.Println(text)
袜子奇妙!
Predict
许多链式结构期望多个输入值并返回一个字符串。在这种情况下,predict函数非常有用。
text, err := chains.Predict(
context.Background(),
chain,
map[string]any{
"product": "彩色袜子",
"description": "该公司位于加利福尼亚州"
}
)
if err != nil {
log.Fatal(err)
}
fmt.Println(text)
高级用法
要实现自己的自定义链式结构,您必须创建一个实现了chain接口的结构体。
// Chain 是所有链式结构都必须实现的接口。
type Chain interface {
// Call 运行链式结构的逻辑并返回输出。此方法不应直接调用。使用Call、Run或Predict函数来处理记忆和其他方面的链式结构。
Call(ctx context.Context, inputs map[string]any, options ...ChainCallOption) (map[string]any, error)
// GetMemory 获取链式结构的记忆。
GetMemory() schema.Memory
// InputKeys 返回链式结构期望的输入键。
GetInputKeys() []string
// OutputKeys 返回链式结构期望的输出键。
GetOutputKeys() []string
}
📄️ 链式结构
概念指南 • 操作指南