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})

Logo

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

更多推荐