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