【LangChain LCEL】11. 链式调用的艺术

【LangChain LCEL】11. 链式调用的艺术

首页角色扮演你的魔法链更新时间:2024-07-29

在编程的世界里,有时候我们就像是在玩乐高积木,一块接一块,直到我们构建出一个宏伟的城堡。今天,我们要探索的是Langchain这个神奇的乐高套装,它让我们能够将多个“链”(Chains)巧妙地连接起来,创造出令人惊叹的自动化魔法。

多链的魅力

想象一下,你有一个聊天机器人,它不仅能回答你的问题,还能根据你的回答提出新的问题。这就是Langchain的多链功能——一个接一个的自动化流程,它们就像是一条条灵活的链条,可以根据需要自由组合和拆分。

代码案例一:从名人到地理

首先,我们来看一个例子,这个例子将告诉我们如何从一个简单的问题开始,然后逐步深入到更复杂的信息中。比如,我们想知道奥巴马的故乡在哪里。

from operator import itemgetter from langchain_core.output_parsers import StrOutputParser from langchain_core.prompts import ChatPromptTemplate from langchain_openai import ChatOpenAI prompt1 = ChatPromptTemplate.from_template("{person}来自哪个城市?") prompt2 = ChatPromptTemplate.from_template("这个城市{city}位于哪个国家?请用{language}回答") model = ChatOpenAI() chain1 = prompt1 | model | StrOutputParser() chain2 = ( {"city": chain1, "language": itemgetter("language")} | prompt2 | model | StrOutputParser() ) print(chain2.invoke({"person": "奥巴马", "language": "中文"}))

这个例子中,我们首先创建了两个模板,然后通过Langchain的管道操作符|,将它们和模型连接起来。最后,我们调用chain2.invoke方法,并传入奥巴马的名字,得到了他的故乡信息。

代码案例二:颜色的奇妙旅程

接下来,我们来看一个更加多彩的例子。这次,我们要生成一个关于颜色的问题,然后找到对应颜色的水果和国家。

prompt1 = ChatPromptTemplate.from_template( "生成一个{attribute}的颜色。只返回颜色名称:" ) prompt2 = ChatPromptTemplate.from_template( "这种{color}颜色的水果是什么?只返回水果名称:" ) prompt3 = ChatPromptTemplate.from_template( "哪个国家有这种{color}颜色的国旗?只返回国家名称" ) prompt4 = ChatPromptTemplate.from_template( "这种{fruit}的颜色和这个{country}国家的国旗颜色是什么?" ) model_parser = model | StrOutputParser() color_generator = ( {"attribute": RunnablePassthrough()} | prompt1 | {"color": model_parser} ) color_to_fruit = prompt2 | model_parser color_to_country = prompt3 | model_parser question_generator = ( color_generator | {"fruit": color_to_fruit, "country": color_to_country} | prompt4 ) print(question_generator.invoke("温暖"))

在这个例子中,我们首先生成了一个温暖的颜色,然后找到了这种颜色的水果和国家。最后,我们将这些信息组合成一个完整的问题,并打印出来。

分支与合并:多链的高级玩法

Langchain的多链功能不仅仅是线性的,它还可以让我们创建复杂的分支和合并结构。这就像是在编程中玩“分身术”,我们可以让一个输入被多个组件并行处理,然后再将结果合并起来。

planner = ( ChatPromptTemplate.from_template("生成一个辩论,关于: {input}") | model | StrOutputParser() | {"base_response": RunnablePassthrough()} ) arguments_for = ( ChatPromptTemplate.from_template( "列出{base_response}的优点或积极方面" ) | model | StrOutputParser() ) arguments_against = ( ChatPromptTemplate.from_template( "列出{base_response}的缺点或消极方面" ) | model | StrOutputParser() ) final_responder = ( ChatPromptTemplate.from_messages( [ ("ai", "{original_response}"), ("human", "优点:\n{results_1}\n\n缺点:\n{results_2}"), ("system", "根据辩论生成最终回应"), ] ) | model | StrOutputParser() ) chain = ( planner | { "results_1": arguments_for, "results_2": arguments_against, "original_response": itemgetter("base_response"), } | final_responder ) print(chain.invoke({"input": "宗教"}))

在这个高级例子中,我们首先生成了一个关于宗教的争论,然后分别列出了它的优点和缺点。最后,我们将这些信息整合起来,生成了一个最终的回应。

结语

Langchain的多链功能就像是编程界的瑞士军刀,它让我们能够灵活地构建复杂的自动化流程。无论是简单的问答,还是复杂的信息整合,Langchain都能让我们以一种优雅而高效的方式实现。所以,下次当你需要构建一个自动化的魔法链时,不妨试试Langchain,它可能会给你带来意想不到的惊喜!

查看全文
大家还看了
也许喜欢
更多游戏

Copyright © 2024 妖气游戏网 www.17u1u.com All Rights Reserved