Runnable
接口的一个关键优点是,任何两个可运行对象都可以“链接”在一起,形成序列。前一个可运行对象 .invoke()
调用的输出将作为输入传递给下一个可运行对象。这可以使用管道运算符 ( |
) 或更显式 .pipe()
的方法来完成,该方法执行相同的操作。生成的结果是 RunnableSequence 可运行的,这意味着它可以像任何其他可运行对象一样被调用、流式传输或管道传输。
pipe operator
使用提示模板将输入格式化为聊天模型,最后使用输出解析器将聊天消息输出转换为字符串。
from langchain_anthropic import ChatAnthropic
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
prompt = ChatPromptTemplate.from_template("tell me a joke about {topic}")
model = ChatAnthropic(model_name="claude-3-haiku-20240307")
chain = prompt | model | StrOutputParser()
提示和模型都是可运行的,提示调用的输出类型与聊天模型的输入类型相同,因此我们可以将它们链接在一起。然后,我们可以像调用任何其他可运行序列一样调用结果序列:
chain.invoke({"topic": "bears"})
Coercion 强迫
我们甚至可以将这条链与更多的可运行对象结合起来,以创建另一条链。这可能涉及使用其他类型的可运行对象进行一些输入/输出格式,具体取决于链组件所需的输入和输出。
例如,假设我们想用另一条链组成笑话生成链,该链评估生成的笑话是否有趣。
from langchain_core.output_parsers import StrOutputParser
analysis_prompt = ChatPromptTemplate.from_template("is this a funny joke? {joke}")
composed_chain = {"joke": chain}
| analysis_prompt
| model
| StrOutputParser()
composed_chain.invoke({"topic": "bears"})
函数也将被强制为可运行对象,因此您也可以将自定义逻辑添加到链中。以下链产生与之前相同的逻辑流:
composed_chain_with_lambda = (
chain
| (lambda input: {"joke": input})
| analysis_prompt
| model
| StrOutputParser()
)
composed_chain_with_lambda.invoke({"topic": "beets"})
但是,请记住,使用此类函数可能会干扰流式处理等操作。有关详细信息,请参阅此部分。
.pipe()方法
我们也可以使用 .pipe() 方法组成相同的序列。
from langchain_core.runnables import RunnableParallel
composed_chain_with_pipe = (
RunnableParallel({"joke": chain})
.pipe(analysis_prompt)
.pipe(model)
.pipe(StrOutputParser())
)
composed_chain_with_pipe.invoke({"topic": "battlestar galactica"})
对比