0. 思维导图
1. 引言 🌟
在人工智能快速发展的今天,如何有效地利用大语言模型(LLM)构建强大的应用成为众多开发者关注的焦点。前面的课程中,我们学习了正则表达式以及向量数据库的相关知识,了解了如何处理文档并将其附加给大模型。本章我们将深入探讨LangChain中的核心概念——“Chain”(链)。
LangChain作为一个强大的框架,让我们能够将LLM与其他计算资源或知识源结合起来,创建更加智能的应用。而Chain则是这个框架的重要组成部分,它就像是将各种功能模块串联起来的纽带,使得复杂的AI工作流成为可能。
2. 什么是Chain(链)💡
2.1 链的基本概念
在LangChain中,Chain(链)是一个核心概念,它代表一系列组件的连接,这些组件按照特定的顺序执行,以完成复杂的任务。简单来说,Chain就是将多个步骤组合成一个可调用的单元,让信息能够从一个组件流向另一个组件。
链的基本工作流程是:接收输入 → 处理数据 → 产生输出。而这个处理过程可能涉及到与LLM的交互、文档的检索、信息的提取等多个步骤。
2.2 链的重要性
链的设计理念使得我们可以:
- 🔄 模块化地组合不同功能
- 📦 封装复杂的逻辑流程
- 🛠️ 重用常见的处理模式
- 🧩 灵活地扩展应用功能
正是这种灵活性和模块化的特性,使得LangChain能够适应各种各样的AI应用场景,从简单的问答系统到复杂的智能助手。
3. 四种基本的内置链 🔗
LangChain提供了多种内置的链类型,其中最基础的四种分别是LLM链、顺序链、路由链和检索链。这些内置链为我们提供了处理不同任务的基本工具。
3.1 LLM Chain
LLM Chain(LLM链)是最基础也是最常用的链类型,它将提示模板(PromptTemplate)和语言模型(LLM)结合在一起,形成一个简单但强大的处理单元。
工作原理:
- 接收用户输入
- 根据提示模板格式化输入
- 将格式化后的提示发送给LLM
- 返回LLM的响应
代码示例:
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate# 创建提示模板
template = "请告诉我{topic}的三个重要知识点"
prompt = PromptTemplate(input_variables=["topic"], template=template)# 初始化LLM
llm = OpenAI(temperature=0.7)# 创建LLM链
chain = LLMChain(llm=llm, prompt=prompt)# 使用链
response = chain.run("人工智能")
print(response)
3.2 Sequential Chain(顺序链)
顺序链允许我们将多个链按照特定顺序连接起来,前一个链的输出可以作为后一个链的输入,从而实现更复杂的处理流程。
顺序链主要有两种类型:
- SimpleSequentialChain:每个链只有一个输入和一个输出,链之间一对一串联
- SequentialChain:支持多输入多输出,更加灵活
代码示例(SimpleSequentialChain):
from langchain.chains import SimpleSequentialChain
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplatellm = OpenAI(temperature=0.7)# 第一个链:生成一个故事概要
first_prompt = PromptTemplate(input_variables=["subject"],template="请为{subject}写一个简短的故事概要"
)
chain_one = LLMChain(llm=llm, prompt=first_prompt)# 第二个链:基于故事概要写一个完整故事
second_prompt = PromptTemplate(input_variables=["概要"],template="基于以下概要,写一个完整的故事:\n\n{概要}"
)
chain_two = LLMChain(llm=llm, prompt=second_prompt)# 创建顺序链
overall_chain = SimpleSequentialChain(chains=[chain_one, chain_two])# 运行链
response = overall_chain.run("一只迷路的猫")
print(response)
代码示例(SequentialChain):
from langchain.chains import SequentialChain
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplatellm = OpenAI(temperature=0.7)# 第一个链:为电影生成标题
first_prompt = PromptTemplate(input_variables=["genre"],template="为{genre}类型的电影想一个标题"
)
title_chain = LLMChain(llm=llm, prompt=first_prompt, output_key="title")# 第二个链:为电影生成简介
second_prompt = PromptTemplate(input_variables=["title"],template="为电影《{title}》写一个简短的简介"
)
synopsis_chain = LLMChain(llm=llm, prompt=second_prompt, output_key="synopsis")# 创建顺序链
overall_chain = SequentialChain(chains=[title_chain, synopsis_chain],input_variables=["genre"],output_variables=["title", "synopsis"]
)# 运行链
response = overall_chain.run("科幻")
print(f"标题: {response['title']}\n简介: {response['synopsis']}")
3.3 Router Chain(路由链)
路由链是一种能够根据输入动态决定调用哪个子链的高级链。它根据输入的内容或特征,选择最适合处理该输入的链,类似于一个智能分发器。
Router Chain由三个主要部分组成:
- 路由器(决定使用哪个链)
- 目标链(可选择的链集合)
- 默认链(当无法确定路由时使用)
代码示例:
from langchain.chains.router import MultiPromptChain
from langchain.chains.router.llm_router import LLMRouterChain
from langchain.chains import LLMChain
from langchain.llms import OpenAI
from langchain.prompts import PromptTemplatellm = OpenAI(temperature=0.7)# 定义各专业领域的提示模板
physics_template = PromptTemplate(template="你是一位物理学专家。回答以下物理学问题:{question}",input_variables=["question"]