AI 新手向前飞 - LangChain 系列第 8 期--深入了解 LCEL 和 Chain(第 2 部分)
最编程
2024-05-03 08:06:02
...
温馨提示:为了看懂本篇,务必要仔细阅读上、中篇的内容
AI菜鸟向前飞 — LangChain系列之六 - 深入浅出LCEL与Chain(上篇)
AI菜鸟向前飞 — LangChain系列之七 - 深入浅出LCEL与Chain(中篇)
前言
开篇一张图,等读完本篇后,你就知道它是怎么来的了
当Chain“遇到”Runnable
程序
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
model = ChatOllama(model="llama3", temperature=0)
chain_pipe = ChatPromptTemplate.from_template("{text}") | model | StrOutputParser()
chain_res = (
{"topic": chain_pipe}
| ChatPromptTemplate.from_template("{topic}, 基于每一点再扩展说明一下,并请用中文回答")
| model
| StrOutputParser()
)
reponse = chain_res.invoke("关于软件测试的概念,请简明扼要说出三点出来?请用中文回答")
print(reponse)
输出结果
- chain_res返回内容
- response返回内容
多说两句RunnablePassthrough
- 在Sequence场景
from langchain_core.runnables import RunnablePassthrough
from langchain_community.chat_models import ChatOllama
from langchain_core.output_parsers import StrOutputParser
chain = RunnablePassthrough() | ChatOllama(model="llama3") | StrOutputParser()
print(chain.invoke("请问什么是软件测试?请用中文回答。"))
我们看下上述程序的输出结果(效果)
可以自行试验一下这两种有什么区别呢?
chain = ChatPromptTemplate.from_template("{text}") | ChatOllama(model="llama3") | StrOutputParser()
chain = RunnablePassthrough() | ChatOllama(model="llama3") | StrOutputParser()
- 在Parallel场景
from langchain_community.chat_models import ChatOllama
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import chain, RunnableParallel, RunnablePassthrough
prompt_pm = ChatPromptTemplate.from_template("产品经理是做什么的?{text}")
prompt_dev = ChatPromptTemplate.from_template("软件开发工程师是做什么的?{text}")
prompt_test = ChatPromptTemplate.from_template("软件测试工程师是做什么的?{text}")
prompt_op = ChatPromptTemplate.from_template("运维工程师是做什么的?{text}")
model = ChatOllama(model="llama3", temperature=0)
outparser = StrOutputParser()
chain_pm = prompt_pm | model | outparser
chain_dev = prompt_dev | model | outparser
chain_test = prompt_test | model | outparser
chain_op = prompt_op | model | outparser
params = {
"产品经理是做什么的?": chain_pm,
"软件开发工程师是做什么的?": chain_dev,
"测试测试工程师是做什么的?": chain_test,
"运维工程师是做什么的?": chain_op,
"我是谁?": RunnablePassthrough() | model | outparser
}
chain = RunnableParallel(**params)
response = chain.invoke("请使用中文一句话概括")
print(response)
先看下执行效果
简单分析
-
RunnablePassthrough将参数(“请使用中文一句话概括")完整的传递了进去
-
输出结果按照
params
的结构体返回回来,包含了如上五个字段内容
最后再来看RunnablePassthrough的另一种高级用法:
程序
params = {
"产品经理是做什么的?": chain_pm,
"软件开发工程师是做什么的?": chain_dev,
"测试测试工程师是做什么的?": chain_test,
"运维工程师是做什么的?": chain_op,
"我是谁?": RunnablePassthrough() | model | outparser
}
chain = params | RunnablePassthrough.assign(new_params=lambda para :
dict(map(lambda key:
(f"{key}请用一句话概括回答", para[key]), para.keys())))
response = chain.invoke("请使用中文一句话概括")
print(response)
输出结果
开篇时给大家晒到一张图,这里就给出如何打印出开篇的那张图的命令:
chain.get_graph().print_ascii()
关于LCEL就先讲到这里,但关于Chain的知识还不止于此后面还有更多的地方提到它,敬请期待^_^