欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

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)

    先看下执行效果

图片

    简单分析

  1. RunnablePassthrough将参数(“请使用中文一句话概括")完整的传递了进去

  2. 输出结果按照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的知识还不止于此后面还有更多的地方提到它,敬请期待^_^