已经掌握了基础的Model I/O后,下面是两个比较丰富的应用工具
Chain
LangChain通过设计好的接口,实现一个具体的链的功能。例如,LLM链(LLMChain)能够接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化的响应传递给 LLM。这就相当于把整个 Model I/O 的流程封装到链里面;多个链组可以合在一起。
多种类型的预置链:
- LLMChain:这是最简单的链,主要用于处理基本的对话任务、文本生成等。它将输入文本传递给模型并输出结果。
- SequentialChain:将多个链顺序调用。每个链的输出可以作为下一个链的输入。
- TransformChain:对输入进行格式转换、分化
- RouterChain:根据输入的条件,选择不同的链。
LLMChain 围绕着语言模型推理功能又添加了一些功能,整合了 PromptTemplate、语言模型(LLM或聊天模型)和 Output Parser,相当于把Model I/O放在一个链中整体操作。它使用提示模板格式化输入,将格式化的字符串传递给 LLM,并返回 LLM 输出。
# 导入所需的库
from langchain import PromptTemplate, OpenAI, LLMChain
# 原始字符串模板
template = "{flower}的花语是?"
# 创建模型实例
llm = OpenAI(temperature=0)
# 创建LLMChain
llm_chain = LLMChain(
llm=llm,
prompt=PromptTemplate.from_template(template))
# 调用LLMChain,返回结果
result = llm_chain("玫瑰")
print(result)
路由链:构造提示信息,来引导大模型查看用户输入的问题并确定问题的类型的。
MultiPromptChain 类把前几个链整合在一起,实现路由功能。
# 构建多提示链
from langchain.chains.router import MultiPromptChain
chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=chain_map,
default_chain=default_chain,
verbose=True)
ConversationChain
包含AI前缀与人类前缀的对话摘要格式,这个对话格式和记忆机制结合得非常紧密。
# 打印对话的模板
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. # 减少幻觉
Current conversation:
{history}
Human: {input}
AI:
{history}是存储会话记忆的地方,也就是人类和人工智能之间对话历史的信息。{input}是新输入的地方,你可以把它看成是和ChatGPT对话时,文本框中的输入。
加入记忆功能:conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory()) 。聊天历史信息,都被传入了ConversationChain的提示模板中的 {history} 参数,构建出了包含聊天记录的新的提示输入。
ConversationBufferWindowMemory:缓冲窗口记忆,它的思路就是只保存最新最近的几次人类和AI的互动。因此,它在之前的“缓冲记忆”基础上增加了一个窗口值k。这意味着我们只保留一定数量的过去互动,然后“忘记”之前的互动。ConversationSummaryMemory:使用LLM将对话历史进行汇总,然后再传递给 {history} 参数。这种方法旨在通过对之前的对话进行汇总来避免长对话过度使用Token。ConversationSummaryBufferMemory:混合记忆模型,当最新的对话文字长度在300字之内的时候,LangChain会记忆原始对话内容;当对话文字超出了这个参数的长度,那么模型就会把所有超过预设长度的内容进行总结。

Chain
LangChain通过设计好的接口,实现一个具体的链的功能。例如,LLM链(LLMChain)能够接受用户输入,使用 PromptTemplate 对其进行格式化,然后将格式化的响应传递给 LLM。这就相当于把整个 Model I/O 的流程封装到链里面;多个链组可以合在一起。
多种类型的预置链:
- LLMChain:这是最简单的链,主要用于处理基本的对话任务、文本生成等。它将输入文本传递给模型并输出结果。
- SequentialChain:将多个链顺序调用。每个链的输出可以作为下一个链的输入。
- TransformChain:对输入进行格式转换、分化
- RouterChain:根据输入的条件,选择不同的链。
LLMChain 围绕着语言模型推理功能又添加了一些功能,整合了 PromptTemplate、语言模型(LLM或聊天模型)和 Output Parser,相当于把Model I/O放在一个链中整体操作。它使用提示模板格式化输入,将格式化的字符串传递给 LLM,并返回 LLM 输出。
# 导入所需的库
from langchain import PromptTemplate, OpenAI, LLMChain
# 原始字符串模板
template = "{flower}的花语是?"
# 创建模型实例
llm = OpenAI(temperature=0)
# 创建LLMChain
llm_chain = LLMChain(
llm=llm,
prompt=PromptTemplate.from_template(template))
# 调用LLMChain,返回结果
result = llm_chain("玫瑰")
print(result)
路由链:构造提示信息,来引导大模型查看用户输入的问题并确定问题的类型的。
MultiPromptChain 类把前几个链整合在一起,实现路由功能。
# 构建多提示链
from langchain.chains.router import MultiPromptChain
chain = MultiPromptChain(
router_chain=router_chain,
destination_chains=chain_map,
default_chain=default_chain,
verbose=True)
ConversationChain
包含AI前缀与人类前缀的对话摘要格式,这个对话格式和记忆机制结合得非常紧密。
# 打印对话的模板
The following is a friendly conversation between a human and an AI. The AI is talkative and provides lots of specific details from its context. If the AI does not know the answer to a question, it truthfully says it does not know. # 减少幻觉
Current conversation:
{history}
Human: {input}
AI:
{history}是存储会话记忆的地方,也就是人类和人工智能之间对话历史的信息。{input}是新输入的地方,你可以把它看成是和ChatGPT对话时,文本框中的输入。
加入记忆功能:conversation = ConversationChain(llm=llm, memory=ConversationBufferMemory()) 。聊天历史信息,都被传入了ConversationChain的提示模板中的 {history} 参数,构建出了包含聊天记录的新的提示输入。
ConversationBufferWindowMemory:缓冲窗口记忆,它的思路就是只保存最新最近的几次人类和AI的互动。因此,它在之前的“缓冲记忆”基础上增加了一个窗口值k。这意味着我们只保留一定数量的过去互动,然后“忘记”之前的互动。ConversationSummaryMemory:使用LLM将对话历史进行汇总,然后再传递给 {history} 参数。这种方法旨在通过对之前的对话进行汇总来避免长对话过度使用Token。ConversationSummaryBufferMemory:混合记忆模型,当最新的对话文字长度在300字之内的时候,LangChain会记忆原始对话内容;当对话文字超出了这个参数的长度,那么模型就会把所有超过预设长度的内容进行总结。

代理
与外部环境交互,将额外信息合并到推理中。
- 大模型:提供逻辑的引擎,负责生成预测和处理输入。
- 与之交互的外部工具:可能包括数据清洗工具、搜索引擎、应用程序等。
- 控制交互的代理:调用适当的外部工具,并管理整个交互过程的流程。
ReAct框架
Reasoning-Acting框架:指导大语言模型推理和行动的一种思维框架。
行动 -> 观察 -> 思考 -> 行动
《ReAct:在语言模型中协同推理和行动》:
大语言模型可以通过生成推理痕迹和任务特定行动来实现更大的协同作用。 Reasoning包括了对当前环境和状态的观察,并生成推理轨迹。这使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。Acting在于指导大模型采取下一步的行动,比如与外部源(如知识库或环境)进行交互并且收集信息,或者给出最终答案。

在链中,一系列操作被硬编码(在代码中)。在代理中,LLM被用作推理引擎来确定要采取哪些操作以及按什么顺序执行这些操作。
思考框架:
Use the following format:\n\n (指导模型使用下面的格式) Question: the input question you must answer\n (问题) Thought: you should always think about what to do\n (思考) Action: the action to take, should be one of [Search, Calculator]\n (行动) Action Input: the input to the action\n (行动的输入) Observation: the result of the action\n... (观察:行动的返回结果) (this Thought/Action/Action Input/Observation can repeat N times)\n (上面这个过程可以重复多次) Thought: I now know the final answer\n (思考:现在我知道最终答案了) Final Answer: the final answer to the original input question\n\n (最终答案)
根据现有知识解决不了,下一步行动是需要选择工具箱中的搜索工具:
text': ' I need to find the current market price of roses and then calculate the new price with a 15% markup.\n (Text:问题文本) Action: Search\n (行动:搜索) Action Input: "Average price of roses"' (行动的输入:搜索玫瑰平均价格)
计算:
AgentAction(tool='Calculator', tool_input='80.16 * 1.15', log=' I need to calculate the new price with a 15% markup.\nAction: Calculator\nAction Input: 80.16 * 1.15')
最后,AgentExcutor的plan方法返回一个 AgentFinish 实例,这表示代理经过对输出的检查,其内部逻辑判断出任务已经完成,思考和行动的循环要结束了。
Thought: I now know the final answer.
-
结构化工具对话代理(Structured Tool Chat)是一种通过预先设定的结构与用户进行交互的工具,可以有效引导对话的主题和内容。
- 文件管理工具集
- Web 浏览器工具集
PlayWright工具包
-
自主询问搜索代理(Self-Ask with Search)利用一种叫做 “Follow-up Question(追问)”加“Intermediate Answer(中间答案)”的技巧,来辅助大模型寻找事实性问题的过渡性答案,从而引出最终答案。
- 逐步逼近,以自己提问并搜索:
使用玫瑰作为国花的国家的首都是哪里? = 使用玫瑰作为国花的国家? + 都铎王朝的首都在哪里?
- 逐步逼近,以自己提问并搜索:
-
计划与执行代理(Plan and Execute)是指能够根据用户的需求制定计划,并执行相应操作的工具,帮助用户实现特定的目标或任务。
- 首先,制定一个计划,并将整个任务划分为更小的子任务;然后按照该计划执行子任务。
- 计划由一个LLM代理(负责推理)完成。
- 执行由另一个LLM代理(负责调用工具)完成。
- 首先,制定一个计划,并将整个任务划分为更小的子任务;然后按照该计划执行子任务。
使用 arXiv 工具
import os
# 导入库
from langchain_openai import ChatOpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
# 初始化模型和工具
llm = ChatOpenAI(temperature=0.0, model=os.environ.get("LLM_MODELEND"))
tools = load_tools(["arxiv"])
# 初始化链
agent_chain = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 运行链
agent_chain.run("介绍一下2005.14165这篇论文的创新点?")
# Thought: 论文的创新点是在少样本学习设置下测试了 GPT-3 的性能,发现扩大语言模型的规模可以极大地提高任务无关的少样本性能,有时甚至可以与之前最先进的微调方法竞争。
代理
与外部环境交互,将额外信息合并到推理中。
- 大模型:提供逻辑的引擎,负责生成预测和处理输入。
- 与之交互的外部工具:可能包括数据清洗工具、搜索引擎、应用程序等。
- 控制交互的代理:调用适当的外部工具,并管理整个交互过程的流程。
ReAct框架
Reasoning-Acting框架:指导大语言模型推理和行动的一种思维框架。
行动 -> 观察 -> 思考 -> 行动
《ReAct:在语言模型中协同推理和行动》:
大语言模型可以通过生成推理痕迹和任务特定行动来实现更大的协同作用。 Reasoning包括了对当前环境和状态的观察,并生成推理轨迹。这使模型能够诱导、跟踪和更新操作计划,甚至处理异常情况。Acting在于指导大模型采取下一步的行动,比如与外部源(如知识库或环境)进行交互并且收集信息,或者给出最终答案。
在链中,一系列操作被硬编码(在代码中)。在代理中,LLM被用作推理引擎来确定要采取哪些操作以及按什么顺序执行这些操作。
思考框架:
Use the following format:\n\n (指导模型使用下面的格式) Question: the input question you must answer\n (问题) Thought: you should always think about what to do\n (思考) Action: the action to take, should be one of [Search, Calculator]\n (行动) Action Input: the input to the action\n (行动的输入) Observation: the result of the action\n... (观察:行动的返回结果) (this Thought/Action/Action Input/Observation can repeat N times)\n (上面这个过程可以重复多次) Thought: I now know the final answer\n (思考:现在我知道最终答案了) Final Answer: the final answer to the original input question\n\n (最终答案)
根据现有知识解决不了,下一步行动是需要选择工具箱中的搜索工具:
text': ' I need to find the current market price of roses and then calculate the new price with a 15% markup.\n (Text:问题文本) Action: Search\n (行动:搜索) Action Input: "Average price of roses"' (行动的输入:搜索玫瑰平均价格)
计算:
AgentAction(tool='Calculator', tool_input='80.16 * 1.15', log=' I need to calculate the new price with a 15% markup.\nAction: Calculator\nAction Input: 80.16 * 1.15')
最后,AgentExcutor的plan方法返回一个 AgentFinish 实例,这表示代理经过对输出的检查,其内部逻辑判断出任务已经完成,思考和行动的循环要结束了。
Thought: I now know the final answer.
-
结构化工具对话代理(Structured Tool Chat)是一种通过预先设定的结构与用户进行交互的工具,可以有效引导对话的主题和内容。
- 文件管理工具集
- Web 浏览器工具集
PlayWright工具包
-
自主询问搜索代理(Self-Ask with Search)利用一种叫做 “Follow-up Question(追问)”加“Intermediate Answer(中间答案)”的技巧,来辅助大模型寻找事实性问题的过渡性答案,从而引出最终答案。
- 逐步逼近,以自己提问并搜索:
使用玫瑰作为国花的国家的首都是哪里? = 使用玫瑰作为国花的国家? + 都铎王朝的首都在哪里?
- 逐步逼近,以自己提问并搜索:
-
计划与执行代理(Plan and Execute)是指能够根据用户的需求制定计划,并执行相应操作的工具,帮助用户实现特定的目标或任务。
- 首先,制定一个计划,并将整个任务划分为更小的子任务;然后按照该计划执行子任务。
- 计划由一个LLM代理(负责推理)完成。
- 执行由另一个LLM代理(负责调用工具)完成。
- 首先,制定一个计划,并将整个任务划分为更小的子任务;然后按照该计划执行子任务。
使用 arXiv 工具
import os
# 导入库
from langchain_openai import ChatOpenAI
from langchain.agents import load_tools, initialize_agent, AgentType
# 初始化模型和工具
llm = ChatOpenAI(temperature=0.0, model=os.environ.get("LLM_MODELEND"))
tools = load_tools(["arxiv"])
# 初始化链
agent_chain = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# 运行链
agent_chain.run("介绍一下2005.14165这篇论文的创新点?")
# Thought: 论文的创新点是在少样本学习设置下测试了 GPT-3 的性能,发现扩大语言模型的规模可以极大地提高任务无关的少样本性能,有时甚至可以与之前最先进的微调方法竞争。