跳到主要内容

链式结构

链式结构允许您将语言模型与其他信息源、第三方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
}