[AI应用基础学习-3] LangChain-Chains
Chain的基本概念
Chains在最新的1.0版本已经没有描述了,但仍然可以使用,学习Chains的思想。
Chain 的核心思想是通过组合不同的模块化单元,实现比单一组件更强大的功能。比如:
- 将LLM与Prompt Template 结合
- 将LLM与输出解析器结合
- 将LLM与外部数据结合
- 将LLM与长期记忆结合
- 将LLM1与LLM2....结合
LCEL 及其基本构成
使用LCEL,可以构造出结构最简单的Chain。LangChain表达式语言(LCEL,LangChain Expression Language)是一种声明式方法,可以轻松地将多个组件链接成 AI 工作流。它通过Python原生操作符(如管道符 | )将组件连接成可执行流程,显著简化了AI应用的开发。
LCEL的基本构成:提示(Prompt)+ 模型(Model)+ 输出解析器(OutputParser)
chain = prompt | model | output_parser
chain.invoke({"input":"what's your name?"})
Prompt:Prompt 是一个 BasePromptTemplate,这意味着它接受一个模板变量的字典并生成一个PromptValue可以传递给 LLM(它以字符串作为输入)或 ChatModel(它以 消息序列作为输入)。Model:将 PromptValue 传递给 model。如果我们的 model 是一个 ChatModel,这意味着它将输出一个BaseMessage。OutputParser:将 model 的输出传递给 output_parser,它是一个 BaseOutputParser,意味着它可以接受字符串或 BaseMessage 作为输入。- Chain:我们可以使用
|运算符轻松创建这个Chain。|运算符在 LangChain 中用于将两个元素组合在一起。 - invoke:所有LCEL对象都实现了
Runnable协议,保证一致的调用方式 (invoke / batch / stream)
Runnable是LangChain定义的一个抽象接口(Protocol),它强制要求所有LCEL组件实现一组标准方法。
任何实现了这些方法的对象都被视为LCEL兼容组件。比如:聊天模型、提示词模板、输出解析器、检索器、代理(智能体)等。
每个 LCEL 对象都实现了 Runnable 接口,该接口定义了一组公共的调用方法。
#无Runnable
prompt_text = prompt.format(topic="猫")
model_out = model.generate(prompt_text)
result = parser.parse(model_out)
#有Runnable 分步调用
prompt_text = prompt.invoke(topic="猫")
model_out = model.invoke(prompt_text)
result = parser.invoke(model_out)
#LCEL 管道符
chain = prompt | model | parser
result = chain.invoke({"topic":"猫"})
使用
import os
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() #自动加载.env文件
#创建大模型实例
llm=ChatOpenAI(
model= "qwen-plus",
base_url= os.getenv("OPENAI_API_URL"),
api_key= os.getenv("OPENAI_API_KEY1")
)
prompt_template = PromptTemplate.from_template(
template = "讲一个关于{topic}简短的笑话"
)
parser = StrOutputParser()
#构造链式调用 LCEL
chain = prompt_template | llm | parser
output = chain.invoke({"topic":"ice cream"})
print(output)
基于LCEL构建的Chains的类型
基于LCEL构建的Chains
create_sql_query_chain
create_stuff_documents_chain
create_openai_fn_runnable
create_structured_output_runnable
load_query_constructor_runnable
create_history_aware_retriever
create_retrieval_chain
create_sql_query_chain
create_sql_query_chain,SQL查询链,是创建生成SQL查询的链,用于将自然语言转换成数据库的 SQL查询
pip install pymysql
from langchain_community.utilities import SQLDatabase
db_user = "root"
db_password = "abc123"
db_host = "localhost"
db_port = 3306
db_name = "mysql"
db = SQLDatabase.from_uri(f"mysql+pymysql://{db_user}:{db_password}@{db_host}:{db_port}/{db_name}")
print("哪种数据库",db.dialect)
print("获取数据表",db.get_usable_table_names())
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
load_dotenv() #自动加载.env文件
#创建大模型实例
llm=ChatOpenAI(
model= "qwen-plus",
base_url= os.getenv("OPENAI_API_URL"),
api_key= os.getenv("OPENAI_API_KEY1")
)
chain = create_sql_query_chain(llm=llm, db=db)
output = chain.invoke({"question":"一共有多少员工?"})
#限定表
output = chain.invoke({"question":"一共有多少员工?","table_names_to_use":["employees"]})
print(output)
create_stuff_documents_chain
create_stuff_documents_chain用于将多个文档内容合并成单个长文本的链式工具,并一次性传递给 LLM处理(而不是分多次处理)。
import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_classic.chains.combine_documents import create_stuff_documents_chain
from langchain_core.documents import Document
load_dotenv() #自动加载.env文件
#创建大模型实例
llm=ChatOpenAI(
model= "qwen-plus",
base_url= os.getenv("OPENAI_API_URL"),
api_key= os.getenv("OPENAI_API_KEY1")
)
prompt = PromptTemplate.from_template("""
如下文档{docs}中,香蕉是什么颜色的?
""")
chain = create_stuff_documents_chain(llm, prompt, document_variable_name="docs")
docs= [
Document(
page_content= "苹果,学名Malus pumila Mill.,别称西洋苹果、柰,属于蔷薇科苹果属的植物。苹果是全球最广泛种植和销售的水果之一,具有悠久的栽培历史和广泛的分布范围。苹果的原始种群主要起源于中亚的天山山脉附近,尤其是现代哈萨克斯坦的阿拉木图地区,提供了所有现代苹果品种的基因库。苹果通过早期的贸易路线,如丝绸之路,从中亚向外扩散到全球各地。"
),
Document(
page_content= "香蕉(Musa acuminata '(AAA)'),英文名(banana)芭蕉科芭蕉属多年生草本植物,植株丛生,有匐匍茎;假茎浓绿有黑色斑点;叶片长圆形,上面为深绿色,无白粉,下面浅绿色;花朵为乳白色或淡紫色;果实呈弯曲的弓状,有棱,果皮为青绿色,成熟后变黄;果肉松软,黄白色,味甜香味浓,无种子。"
),
Document(
page_content= "蓝莓是杜鹃花科、越橘属的落叶灌木,小枝绿色,具棱或圆柱形,通常具成行的柔毛;叶片近革质,卵形至椭圆形,先端急尖,基部樱形至近圆形,边缘具锯齿至全缘,暗绿色,上面无毛,下面有毛;总状花序,生于去年生枝上,花尊绿色,无毛;花冠白色到粉红色,近圆筒形;花丝通常具柔毛。浆果圆球形,暗蓝色,无毛,被白粉;花期6~7月;果期8~9月。蓝莓的名称源自英语“blueberry”的直译,意为蓝色浆果。"
)
]
chain.invoke({"docs":docs})

本文来自博客园,作者:Rodericklog,转载请注明原文链接:https://www.cnblogs.com/rodericklog/articles/19455051

浙公网安备 33010602011771号