langchain基础的链包括三个组件:提示词、LLM模型、输出解析器,但实际LLM应用开发会复杂很多,可能需要更多组件。
本篇我们介绍LCEL提供的几个常用方法,可以帮助开发者构建自定义runnable组件,进而组合成功能更强大的链。
1. LCEL组件构建方法
LCEL在Runnable协议中定义了如下方法,帮助开发者灵活构建runnable组件:
- RunnablePassthrough
- RunnableLambda
- RunnableBranch
(1)RunnablePassthrough:
功能简介:
透传用户输入。通常与一个键组成键值对,用于构造下一个组件的输入。
使用语法:
- 如下示例,prompt组件需要的输入是以topic为键的字典,但实际用户输入是字符串"袋鼠”。
- 利用
RunnablePassthrough
透传用户输入,并与topic组成键值对,构造了promt所需的输入。
1 2 3 4 5 6
prompt = ChatPromptTemplate.from_template("请讲一个关于{topic}的笑话。") output_parser = StrOutputParser() model = ChatOpenAI() chain = {"topic": RunnablePassthrough()} | prompt| model | output_parser chain.invoke("袋鼠")
(2)RunnableLambda:
功能简介:
RunnableLambda
可以把自定义函数转换成Runnable对象,以便在组件中使用。使用语法:
- 如下示例,自定义函数my_function,然后通过RunnableLambda(my_function)转换为runnable组件。
1 2 3 4 5
def my_function() ... return xxxx chain = RunnableLambda(my_function) | 其它组件| ...
(3)RunnableBranch
功能简介:
类似路由功能,可以根据条件选择要运行的分支,即当条件满足时,则执行该分支。
使用语法:
- 如下示例,
RunnableBranch
的参数是"条件、分支"对 + 默认分支。 - 当某个条件满足时,则执行对应分支;如果条件都不满足,则执行默认分支。
1 2 3 4 5 6 7 8
branch = RunnableBranch( (条件1, 分支1), ..., (条件n, 分支n), 默认分支, ) chain = branch | 其它组件| ...
- 如下示例,
2.快速上手
以智能客服场景为例,我们使用上述三个方法来组成一个相对复杂的工作链:
利用LLM判断问题类别、感情色彩
自定义函数对LLM输出结果格式化,以便后续组件使用
根据问题类别,构造不同的客服分支,组建客服路由链
组成完整工作链,根据问题类别回答问题
STEP1: 构建问题分类链
- 构建问题分类链topic_chain,任务是判断问题属于"产品质量” or “物流”,情绪是"积极”、“消极” or “中立”。
- 使用
RunnablePassthrough
透传用户问题,并与"question"组成键值对,作为prompt组件的输入。
STEP2: 自定义Runnable组件:格式化输出结果
- LangChain自带的输出解析器
StrOutputParser
输出的是字符串,但我们下个组件的输入要求是字典。所以自己写个函数format_func,把字符串转成字典格式。 - 使用
RunnableLambda
把自定义函数format_func转换成runnable,并作为组件加入到工作链service_chain中。 - 使用相同的用户问题调用工作链service_chain,输出结果为字典。
STEP3: 构建路由链:由3个分支链组成(物流、产品和默认)
- 先创建3个分支链,用于回答产品质量、物流等不同类别的问题。
- 利用
RunnableBranch
构造客服路由链anwser_routing_chain:- 当用户问题类别为产品质量时,走产品客服链prod_response
- 当用户问题类别为物流时,走物流客服链logistic_response链
- 当用户问题类别不是上面两类时,走默认链general_response
STEP4: 组成完整工作链
- 现在,把工作链service_chain增加客服路由组件,组成完整工作链。
- 使用不同的问题来测试,不同类别的问题都得到了对应领域客服的回复。
3.小结
本篇介绍了LCEL提供的几种常用方法,可以帮助开发者灵活构建自己的Runnable组件,以支撑开发复杂的LLM应用。
关键要点如下:
RunnablePassthrough: 透传用户输入。通常与一个键组成键值对,用于构造下一个组件的输入。
RunnableLambda: 把自定义函数转换成Runnable对象,以便在组件中使用。
RunnableBranch: 类似路由功能,可以根据条件选择要运行的分支,即当条件满足时,则执行该分支。
实例演示
- 使用上述方法,构建了一个客服问答工作链,自动判断用户问题类别并路由到对应领域的客服。
参考文档:翻译的LangChain官方文档
- 翻译链接:https://jherculesqz.gitbook.io/langchain-guan-fang-wen-dang