分类目录:《自然语言处理从入门到应用》总目录
在《自然语言处理从入门到应用——LangChain:快速入门》系列文章中我们会用最简练的语言与范例带领大家快速调试并上手LangChain,读者读完本系列的文章后,就会对LangChain有一个大致的了解并可以将LangChain运用到自己开发的程序中。但如果读者想对LangChain的各个模块进行更深入的了解,可以继续学习《自然语言处理从入门到应用——LangChain:核心模块的详细解释》系列文章。本文主要是阐述了如何快速上手LangChain三个核心模块:链(Chains)、代理(Agent:)和内存(Memory)。
到目前为止,我们已经自己处理了单独的PromptTemplate和LLM。但是,真正的应用程序不仅仅是一个,而是它们的组合。在LangChain中,链是由链组成的,可以是LLM这样的原始链,也可以是其他链。最核心的链类型是LLMChain,它由PromptTemplate和LLM组成。扩展《自然语言处理从入门到应用——LangChain:快速入门-[安装与环境配置]》中的示例,我们可以构造一个LLMChain。它接受用户输入,使用PromptTemplate对其进行格式化,然后将格式化后的响应传递给LLM:
from langchain.prompts import PromptTemplate
from langchain.llms import OpenAI
llm = OpenAI(temperature=0.9)
prompt = PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?",
)
我们现在可以创建一个非常简单的链:它接受用户输入,用它格式化提示符,然后将它发送到 LLM:
from langchain.chains import LLMChain
chain = LLMChain(llm=llm, prompt=prompt)
现在我们可以运行该链,只指定产品:
chain.run("colorful socks")
这就是我们的第1个链——1个LLM链。这是比较简单的链类型之一,但是了解它的工作原理将为您处理更复杂的链打下良好的基础。有关更多细节,可以参考《自然语言处理从入门到应用——LangChain:核心模块的详细解释》系列文章中链的部分。
在上文中,我们看到的链运行在一个预先确定的顺序。但是代理不再这样做,它们使用LLM来确定要执行哪些操作以及按照什么顺序执行。操作可以使用工具并观察其输出,也可以返回给用户。如果使用得当,效果可以非常强大。在下文中,我们将向读者展示如何通过最简单、最高级别的API轻松使用代理。
为了运好代理,您应该理解以下概念:
对于本例,我们还需要安装SerpAPI Python包。
pip install google-search-results
并设置适当的环境变量。
import os
os.environ["SERPAPI_API_KEY"] = "..."
下面就是我们关于代理的示例:
from langchain.agents import load_tools
from langchain.agents import initialize_agent
from langchain.agents import AgentType
from langchain.llms import OpenAI
# First, let's load the language model we're going to use to control the agent.
llm = OpenAI(temperature=0)
# Next, let's load some tools to use. Note that the `llm-math` tool uses an LLM, so we need to pass that in.
tools = load_tools(["serpapi", "llm-math"], llm=llm)
# Finally, let's initialize an agent with the tools, the language model, and the type of agent we want to use.
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
# Now let's test it out!
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")
可以得到输出:
> Entering new AgentExecutor chain...
I need to find the temperature first, then use the calculator to raise it to the .023 power.
Action: Search
Action Input: "High temperature in SF yesterday"
Observation: San Francisco Temperature Yesterday. Maximum temperature yesterday: 57 °F (at 1:56 pm) Minimum temperature yesterday: 49 °F (at 1:56 am) Average temperature ...
Thought: I now have the temperature, so I can use the calculator to raise it to the .023 power.
Action: Calculator
Action Input: 57^.023
Observation: Answer: 1.0974509573251117
Thought: I now know the final answer
Final Answer: The high temperature in SF yesterday in Fahrenheit raised to the .023 power is 1.0974509573251117.
> Finished chain.
上文中我们经历过的所有工具和代理都是无状态的的。但是通常,我们可能希望链或代理具有某种“内存”概念,以便它可以记住关于其以前的交互的信息。最简单明了的例子就是在设计一个聊天机器人时,我们期望它记住之前的消息,这样它就可以利用这些消息的上下文来进行更好的对话。
这是一种“短期记忆”。在更复杂的一面,读者可以想象一个链条/代理随着时间的推移记住关键信息——这将是一种形式的“长期记忆”。关于后者的更多具体想法,可以参考文章《MemPrompt: Memory-assisted Prompt Editing with User Feedback》。
LangChain提供了几个专门为此目的创建的链。 本文使用其中一个链ConversationChain
和两种不同类型的内存来完成操作。默认情况下,ConversationChain
有一个简单的内存类型,它记住所有以前的输入/输出,并将它们添加到传递的上下文中。让我们看一下如何使用这个链:
from langchain import OpenAI, ConversationChain
llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)
output = conversation.predict(input="Hi there!")
print(output)
输出:
> Entering new chain...
Prompt after formatting:
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:
Human: Hi there!
AI:
> Finished chain.
' Hello! How are you today?'
输入:
output = conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
print(output)
输出:
> Entering new chain...
Prompt after formatting:
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:
Human: Hi there!
AI: Hello! How are you today?
Human: I'm doing well! Just having a conversation with an AI.
AI:
> Finished chain.
" That's great! What would you like to talk about?"
通过这个示例我们可以知道,通过LangChain的内存机制可以使得LLM记住前序对话的内容。
参考文献:
[1] LangChain ️ 中文网,跟着LangChain一起学LLM/GPT开发