LangChain链式编程全解析
1、Chains的基本理解
chain:链,作用是将多个组件(提示模版、LLM模型、记忆、工具)连接起来,形成可复用的工作流,完成复杂的任务。
1.1 LCEL的基本组成
LCEL又叫LangChain表达式语言,他通过管道符(|)将组件连接为可执行的流程,可以简化AI应用的开发。
基本组成:提示(Prompt)+ 模型(Model)+ 输出解析器(OutputParser)
简单的模版:
chain = prompt | model | output_parser
chain.invoke({"input":"What's your name?"})
1.2 Runnable协议
Runnable是LangChain定义的一个抽象接口/协议,他强制要求所有的LCEL组件采用一种标准方法。所有实现了这些方法的对象都被认为是LCEL兼容组件,例如:聊天模型、提示词模版、输出解析器、检索器、智能体等。
统一调用的好处:
- 一致性:无论组件的功能多复杂,调用的方式完全相同;
- 组合性:管道操作符|背后自动处理类型匹配和中间结果传递。
1.3 代码示例
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import StrOutputParser
load_dotenv()
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
prompt_template = PromptTemplate.from_template(
template = "给我讲一个关于{topic}话题的简短笑话"
)
parser = StrOutputParser()
# 构建链式调用(LCEL语法)
chain = prompt_template | chat_model | parser
out_put = chain.invoke({"topic": "ice cream"})
print(out_put)
print(type(out_put))

2、传统Chain的使用
2.1 LLMChain
2.1.1 说明
在LCEL出现之前,最基础也是最常见的链类型就是LLMChain。LLMChain已经被弃用,被管道操作符|所代替。
基础组成:提示词模版+语言模型
特点:①用于单次问答,输入一个提示词,输出大模型的响应;②适合无上下文的简单任务(例如翻译、摘要、分类等);③无记忆:无法自动维护聊天历史。
2.1.2 示例使用
from langchain_classic.chains.llm import LLMChain
from langchain_core.prompts import PromptTemplate
import os
import dotenv
from langchain_openai import ChatOpenAI
dotenv.load_dotenv()
os.environ['OPENAI_API_KEY'] = os.getenv("OPENAI_API_KEY")
os.environ['OPENAI_BASE_URL'] = os.getenv("OPENAI_BASE_URL")
# 1、创建大模型实例
chat_model = ChatOpenAI(
model="gpt-4o-mini"
)
# 2、原始字符串模板
template = "桌上有{number}个苹果,四个桃子和 3 本书,一共有几个水果?"
prompt = PromptTemplate.from_template(template)
# 3、创建LLMChain
llm_chain = LLMChain(
llm=chat_model,
prompt=prompt
)
# 4、调用LLMChain,返回结果
result = llm_chain.invoke({"number": 2})
print(result)

其中参数verbose是布尔类型,设置是否以详细模式运行
2.2 顺序链之SimpleSequentialChain
顺序链允许将多个链顺序连接起来,每个Chain的输出作为下一个Chain的输入。
2.2.1 说明
SimpleSequentialChain:最简单的顺序链,多个链串联执行,各个步骤都有单一的输入与输出。
2.2.2 示例使用
A链:
from langchain_core.prompts import ChatPromptTemplate
from langchain_classic.chains import LLMChain
chainA_template = ChatPromptTemplate.from_messages([
("system", "你是一位精通各领域知识的知名教授"),
("human", "请你尽可能详细的解释一下:{knowledge}")
])
chainA_chains = LLMChain(llm=chat_model,
prompt=chainA_template,
verbose=True
)
# chainA_chains.invoke({"knowledge":"什么是LangChain?"})
B链:
from langchain_core.prompts import ChatPromptTemplate
chainB_template = ChatPromptTemplate.from_messages(
[
("system", "你非常善于提取文本中的重要信息,并做出简短的总结"),
("human", "这是针对一个提问的完整的解释说明内容:{description}"),
("human", "请你根据上述说明,尽可能简短的输出重要的结论,请控制在20个字以内"),
]
)
chainB_chains = LLMChain(llm=chat_model,
prompt=chainB_template,
verbose=True
)
顺序链连接A、B
# 导入SimpleSequentialChain
from langchain_classic.chains import SimpleSequentialChain
# 在chains参数中,按顺序传入LLMChain A 和LLMChain B
full_chain = SimpleSequentialChain(
chains=[chainA_chains, chainB_chains],
verbose=True
)
response = full_chain.invoke({"input":"什么是langChain?"}) # 唯一的输入key是input
print(response)

2.3 顺序链之SequentialChain
2.3.1 说明
SequentialChain:是更通用的顺序链
- 多变量支持:允许不同子链有独立的输入/输出变量;
- 灵活映射:需要显式定义变量从一个链传递到下一个链(精准的命名输入关键字和输出关键字,明确链之间的关系);
多输出不是chainB有多个输出,大模型通常只有一个输出,而是指的是在chainB输出的基础上chainA也会存在输出内容。
2.3.2 示例使用
from langchain_core.prompts import ChatPromptTemplate
from langchain_classic.chains import SequentialChain
from langchain_openai import ChatOpenAI
from langchain_classic.chains import LLMChain
# 创建大模型实例
chat_model = ChatOpenAI(model="gpt-4o-mini")
schainA_template = ChatPromptTemplate.from_messages([
("system", "你是一位精通各领域知识的知名教授"),
("human", "请你先尽可能详细的解释一下:{knowledge},并且{action}")
])
schainA_chains = LLMChain(llm=chat_model,
prompt=schainA_template,
verbose=True,
output_key="schainA_chains_key"
)
schainB_template = ChatPromptTemplate.from_messages([
("system", "你非常善于提取文本中的重要信息,并做出简短的总结"),
("human", "这是针对一个提问完整的解释说明内容:{schainA_chains_key}"),
("human", "请你根据上述说明,尽可能简短的输出重要的结论,请控制在100个字以内"),
])
schainB_chains = LLMChain(llm=chat_model,
prompt=schainB_template,
verbose=True,
output_key='schainB_chains_key' # 不能省略
)
# input_variables output_variables必须指明
Seq_chain = SequentialChain(
chains=[schainA_chains, schainB_chains],
input_variables=["knowledge", "action"],
output_variables=["schainA_chains_key","schainB_chains_key"],
verbose=True
)
response = Seq_chain.invoke({"knowledge":"明成祖朱棣为什么要奉天靖难","action":"举一个实际的例子"})
print(response)

3、基于LCEL构建的Chains类型
3.1 create_sql_query_chain
SQL查询链,是创建生成SQL查询的链,用于将自然语言转换为数据库的SQL查询。
前置工作:安装pymysql pip install pymysql
from langchain_openai import ChatOpenAI
from langchain_classic.chains import create_sql_query_chain
from langchain_community.utilities import SQLDatabase
import os
import dotenv
dotenv.load_dotenv()
os.environ["OPENAI_API_KEY"] = os.getenv("OPENAI_API_KEY")
os.environ["OPENAI_BASE_URL"] = os.getenv("OPENAI_BASE_URL")
# 测试链接本地数据库
# 连接 MySQL 数据库
db_user ="root"
db_password ="******"
db_host ="127.0.0.1"
db_port ="3306"
db_name ="atguigudb"
# mysql+pymysql://用户名:密码@ip地址:端口号/数据库名
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")
model = ChatOpenAI(model="gpt-4o-mini", temperature=0)
chain = create_sql_query_chain(model, db)
response = chain.invoke({"question": "How many employees are there"})
print(response)

3.2 create_stuff_documents_chain
create_stuff_documents_chain是将多个文档内容合并为单个长文本的链式工具,并且一次性传递给LLM处理。
from langchain_classic.chains.combine_documents import create_stuff_documents_chain
from langchain_core.prompts import PromptTemplate
from langchain_openai import ChatOpenAI
from langchain_core.documents import Document
# 定义提示词模板
prompt = PromptTemplate.from_template(
"""
如下文档{docs}中说,香蕉是什么颜色的?
"""
)
# 创建链
llm = ChatOpenAI(model="gpt-4o-mini")
chain = create_stuff_documents_chain(llm, prompt, document_variable_name="docs")
# 文档输入
docs = [
Document(
page_content="苹果,学名Malus pumila Mill.,别称西洋苹果、柰,属于蔷薇科苹果属的植物。苹果是全球最广泛种植和销售的水果之一,具有悠久的栽培历史和广泛的分布范围。苹果的原始种群主要起源于中亚的天山山脉附近,尤其是现代哈萨克斯坦的阿拉木图地区,提供了所有现代苹果品种的基因库。苹果通过早期的贸易路线,如丝绸之路,从中亚向外扩散到全球各地。"
),
Document(
page_content="香蕉是白色的水果,主要产自热带地区。"
),
Document(
page_content="蓝莓是蓝色的浆果,含有抗氧化物质。"
)
]
# 执行摘要
chain.invoke({"docs": docs})

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐
所有评论(0)