介绍
LangChain的chain模块是其框架中用于构建智能对话和任务式应用的核心组件之一,主要负责流程控制和数据传递。以下是chain模块的一些详细介绍:
- 流程控制:Chains是LangChain中的核心流程控制单元,它们负责串联不同的组件和步骤,定义应用程序的执行逻辑。
- 数据传递:Chains可以传递上下文和数据,使得不同的模块之间能够共享信息。
- 组合与嵌套:Chains支持嵌套和组合,可以构建复杂的流程,例如顺序执行、条件判断和循环等。
- 可重用性:Chains可以被定义为可重用的模块,在不同的应用场景中复用。
- 灵活性:LangChain支持多种类型的Chains,如简单链、索引链、对话链等,以满足不同的需求。
链的创建与组合:
- 单一链:开发者可以创建一个包含特定功能的单一链,例如文本预处理、模型推理等。
- 自定义链:利用内置的基础链类,开发者可以自定义链的输入、输出和处理逻辑。
- 顺序组合:将多个链按照执行顺序串联起来,前一个链的输出作为下一个链的输入。
- 并行组合:同时执行多个链,将它们的输出合并或选择性地使用。
- 嵌套链:在一个链的内部调用另一个链,实现更复杂的流程控制
核心链类型:
- LLMChain:与大型语言模型(LLMs)直接交互的链,用于生成和理解自然语言
- SimpleSequentialChain:一个简单的顺序执行链,用于按顺序执行一系列步骤
- SequentialChain:一个顺序链,可以包含多个步骤,每个步骤可以是另一个链
- RouterChain:用于智能路由决策,根据输入决定执行哪个链
- TransformChain:用于数据处理,可以对输入数据进行转换或处理
通过这些链的组合和嵌套,LangChain框架能够实现复杂的自然语言处理应用程序,提供高度的扩展性和可维护性
LLMChain
LLMChain 是 LangChain 中最简单的链,作为其他复杂 Chains 和 Agents 的内部调用,被广泛应用。一个LLMChain由PromptTemplate和语言模型(LLM or Chat Model)组成。它使用直接传入(或 memory 提供)的 key-value 来规范化生成 Prompt Template(提示模板),并将生成的 prompt (格式化后的字符串)传递给大模型,并返回大模型输出。
案例如下:
from langchain_community.chat_models import ChatZhipuAI
from langchain_core.messages import AIMessage, HumanMessage, SystemMessage
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate
import os
os.environ["ZHIPUAI_API_KEY"] = ""
chat = ChatZhipuAI(
model="glm-4",
temperature=0.5,
)
prompt = PromptTemplate(
input_variables=["product"],
template="给制造{product}的有限公司取10个好名字,并给出完整的公司名称",
)
chain = LLMChain(llm=chat, prompt=prompt)
print(chain.invoke({
'product': "性能卓越的GPU"
}))
输出:
Sequential Chain(顺序链)
SequentialChain是一种链(Chain)类型,用于定义一系列步骤或组件,这些步骤或组件将按顺序执行。SequentialChain的核心功能是将多个处理步骤串联起来,使得每一步的输出成为下一步的输入,从而形成一个有序的执行流程。顺序链(Sequential Chain )允许用户连接多个链并将它们组合成执行特定场景的流水线(Pipeline)。有两种类型的顺序链:
- SimpleSequentialChain:最简单形式的顺序链,每个步骤都具有单一输入/输出,并且一个步骤的输出是下一个步骤的输入。
- SequentialChain:更通用形式的顺序链,允许多个输入/输出。
SimpleSequentialChain-Demo: 包含参数chains以及参数verbose
- chains:列表,包含了要顺序执行的链。前边链的输出作为后边链的输入。
- verbose:用于控制链的执行是否应该输出详细的日志信息。当设置为 True 时,链在执行过程中会打印出更多的信息,这有助于调试和监控链的执行状态。
SequentialChain-Demo: 通用顺序链,包含多个输入以及输出。参数包括:chains、input_variables、output_variables、verbose
- chains: 这是一个列表,包含了要顺序执行的子链。在这个例子中,synopsis_chain 和 review_chain 被包含在列表中,意味着这两个链将按顺序执行。
- input_variables: 这是一个列表,定义了这个链的输入变量。在这个例子中,SequentialChain 期望接收两个输入变量:era 和 title。这些变量将被传递给链中的第一个子链,通常是用于初始化或配置子链的参数。
- output_variables: 这是一个列表,定义了这个链的输出变量。在这个例子中,SequentialChain 将返回两个输出变量:synopsis 和 review。这些输出变量分别对应于 synopsis_chain 和 review_chain 的输出,表示这个链的最终结果。
- verbose: 这是一个布尔值参数,用于控制链的执行是否应该输出详细的日志信息。当设置为 True 时,链在执行过程中会打印出更多的信息,这有助于调试和监控链的执行状态。
SequentialChain与SimpleSequentialChain相比,重要的是定义好中间的输入变量以及输出变量(input_variables、output_variables),方便后续输出
获取领域知识的链(专门用途chain)
APIChain使得可以使用LLMs与API进行交互,以检索相关信息。通过提供与所提供的API文档相关的问题来构建链。 下面是与播客查询相关的
ini复制代码import os
from langchain.llms import OpenAI
from langchain.chains.api import podcast_docs
from langchain.chains import APIChain
listen_api_key = 'xxx'
llm = OpenAI(temperature=0)
headers = {"X-ListenAPI-Key": listen_api_key}
chain = APIChain.from_llm_and_api_docs(llm, podcast_docs.PODCAST_DOCS, headers=headers, verbose=True)
chain.run("搜索关于ChatGPT的节目, 要求超过30分钟,只返回一条")
合并文档的链的高频使用场景举例
对话场景(最广泛) ConversationalRetrievalChain 对话式检索链的工作原理:将聊天历史记录(显式传入或从提供的内存中检索)和问题合并到一个独立的问题中,然后从检索器查找相关文档,最后将这些文档和问题传递给问答链以返回响应。
ini复制代码def test_converstion():
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
loader = TextLoader("./test.txt")
documents = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
documents = text_splitter.split_documents(documents)
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(documents, embeddings)
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(OpenAI(temperature=0), vectorstore.as_retriever(), memory=memory)
query = "这本书包含哪些内容?"
result = qa({"question": query})
print(result)
chat_history = [(query, result["answer"])]
query = "还有要补充的吗"
result = qa({"question": query, "chat_history": chat_history})
print(result["answer"])