我们继续写点儿偏工程实践的内容——LangChain的核心模块3——Chain。
1.核心模块3:Chain
在《【chatGPT】学习笔记11-LLM应用-垂直领域知识问答系统(基于ChatGLM2)》中,我们知道LangChain-ChatChat有如下工作流程:
如何实现呢?其实,LangChain抽象了Chain的概念。
1.1.Chain Class
- 类的继承关系:Chain –>
Chain # Examples: LLMChain, MapReduceChain, RouterChain - 代码路径/libs/langchain/langchain/chains/base.py,详细源码如下:
|
|
我们看一个例子:
- LLMChain:创建了一个步骤,该步骤可执行
prompt
提示词。 - run方法:调用LLMChain的
run
方法,可以和LLM进行问答。
1.2.顺序链
(1)源码解读
- SequentialChain:继承于Chain,顺序链,允许将多个Chain链接起来,形成Pipeline(流水线)。
- 代码路径/libs/langchain/langchain/chains/sequential.py,详细源码如下:
|
|
- SimpleSequentialChain:继承于SequentialChain,一种简化版的顺序链,允许将多个Chain链接起来,形成Pipeline(流水线)。
- 代码路径/libs/langchain/langchain/chains/sequential.py,详细源码如下:
|
|
(2)SimpleSequentialChain的代码示例
我们来看如下的代码,实现了LLM模仿医生对病情进行介绍,并给出治疗方案。
- 通过SimpleSequentialChain,连接了病情摘要Chain和病情评论Chain。
- 病情摘要Chain的输出,作为了病情评论Chain的输入。
(3)SequentialChain的代码示例
我们来看如下的代码,实现了LLM模仿医生对病情进行介绍,并给出治疗方案。
不同的是,要支持多输入、多输出。
- 通过SequentialChain,连接了病情摘要Chain和病情评论Chain。
- 病情摘要Chain的输入有多个,病情摘要Chain的输出作为了病情评论Chain的输入,病情评论Chain的输出有多个。
1.3.决策链
(1)源码解读
- RouterChain:继承于Chain,决策链,允许将多个Chain链接起来,可以实现条件判断的分支Pipeline(分支流水线)。
- 代码路径/libs/langchain/langchain/chains/router/base.py,详细源码如下:
|
|
(2)RouterChain的代码示例
我们来看如下的代码,实现了根据问题内容,选择程序员角色的AI或测试工程师AI出来回答问题。
- 创建两个决策分支:能回答软件开发问题的程序员、能回答软件测试问题的程序员。
- 创建根据问题内容进行决策的RouterChain。
这个决策链是如何实现的决策功能呢?进一步看一下:
- destinations_str:描述了根据问题内容,期望选择哪个AI来回答问题。
- MULTI_PROMPT_ROUTER_TEMPLATE:LangChain提供了决策链的提示词模板。
- router_template:最终的决策链提示词为:
- 将决策链和两个回答问题的链进行连接。
- 测试一下关于软件开发的问题:
- 测试一下关于软件测试的问题:
2.小结
本文阐述了Chain模块的内部实现:
- Chain类:抽象了PipeLine流水线。
- 顺序链:SequentialChain,实现了多输入多输出的串行执行的工作流。
- 决策链:RouterChain,实现了根据问题内容,选择工作流走向的能力。
- Chain类拥有很多子类,实现不同的业务流程,可以根据实战需要继续阅读源码和实践。
后续文章,我们继续解读LangChain的核心模块,感谢阅读。