前言
首先需要安装LangChain:
使用LangChain需要与一个或多个模型提供程序、数据存储、API集成。
pip install langchain
# or
conda install langchain -c conda-forge
然后我们需要在终端设置环境变量
export OPENAI_API_KEY="..."
一、提示模版(PromptTemplate)
通常在应用程序中使用 LLM 时,不会将用户输入直接发送到 LLM。相反,您可能接受用户输入并构造一个提示符,然后将其发送给 LLM。使用LangChain,这个事情变得很简单。
定义提示模版:
from langchain.prompts import PromptTemplate
prompt = PromptTemplate(
input_variables=["product"],
template="What is a good name for a company that makes {product}?",
)
#调用.format 方法完成格式化
print(prompt.format(product="colorful socks"))
#输出为:What is a good name for a company that makes colorful socks?
二、链:在多步骤的工作流中组合LLM和提示(prompt)
真正的程序是PromptTemplate和LLM的组合。在LangChain中,链是由链组成的,可以是LLM这样的原始链,也可以是其他链。最核心的链类型是LLMChain,它由 PromptTemplate
和 LLM
组成。
它接受用户输入,使用 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")
# -> '\n\nSocktastic!'
这是比较简单的链类型之一。
三、代理Agent:基于用户输入的动态调用链
到目前为止,我们看到的链运行在一个预先确定的顺序。
但是代理不再这样做: 它们使用 LLM 来确定要执行哪些操作以及按照什么顺序执行。
操作可以使用工具并观察其输出,也可以返回给用户。
如果使用得当,效果可以非常强大。
在本教程中,我们将向您展示如何通过最简单、最高级别的 API 轻松使用代理。
为了运好代理,您应该理解以下概念:
- 工具(tools): 执行特定任务的功能。这可以是: Google 搜索、数据库查找、 Python REPL、其他链。工具的接口目前是一个函数,预计将有一个字符串作为输入,一个字符串作为输出。
- 大语言模型(LLM): 为代理提供动力的语言模型。
- 代理(agents): 要使用的代理。这应该是引用支持代理类的字符串。因为本教程主要关注最简单、最高级别的 API,所以它只涉及使用标准支持的代理。如果要实现自定义代理,请参阅自定义代理的文档(即将发布)。
#需要安装第三方包
#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
llm = OpenAI(temperature=0)
tools = load_tools(["serpapi", "llm-math"], llm=llm)
agent = initialize_agent(tools, llm, agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)
agent.run("What was the high temperature in SF yesterday in Fahrenheit? What is that number raised to the .023 power?")
四、内存:向链和代理添加状态
到目前为止,我们经历过的所有工具和代理都是无状态的的。但是通常,您可能希望链或代理具有某种“内存”概念,以便它可以记住关于其以前的交互的信息。最简单明了的例子就是在设计一个聊天机器人时——你想让它记住之前的消息,这样它就可以利用这些消息的上下文来进行更好的对话。
这是一种“短期记忆”。在更复杂的一面,你可以想象一个链条/代理随着时间的推移记住关键信息——这将是一种形式的“长期记忆”。
LangChain 提供了几个专门为此目的创建的链。 本教程使用其中一个链(ConversationChain)和两种不同类型的内存来完成操作。默认情况下,ConversationChain有一个简单的内存类型,它记住所有的输入和输出,并将他们添加到传递的上下文中。
让我们看一下如何使用这个链(设置 verbose=True
,这样我们就可以看到提示符)。
from langchain import OpenAI, ConversationChain
llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)
output = conversation.predict(input="Hi there!")
print(output)
output = conversation.predict(input="I'm doing well! Just having a conversation with an AI.")
print(output)
五、构建语言模型应用程序:聊天模型
从聊天模型获取消息完成:
您可以通过向聊天模型传递一条或多条消息来完成聊天。
响应将是一条消息。
LangChain 中当前支持的消息类型是 AIMessage
, HumanMessage
, SystemMessage
, 和 ChatMessage
– ChatMessage
接受任意角色参数。大多数时候,您只需要处理 HumanMessage
, AIMessage
, 和 SystemMessage
.
from langchain.chat_models import ChatOpenAI
from langchain.schema import (
AIMessage,
HumanMessage,
SystemMessage
)
chat = ChatOpenAI(temperature=0)
chat([HumanMessage(content="Translate this sentence from English to French. I love programming.")])
# -> AIMessage(content="J'aime programmer.", additional_kwargs={})
您还可以为 OpenAI 的 gpt-3.5-turbo 和 gpt-4型号传递多条消息。
messages = [
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="Translate this sentence from English to French. I love programming.")
]
chat(messages)
# -> AIMessage(content="J'aime programmer.", additional_kwargs={})
更进一步,使用generate为多组消息完成生成。这将返回一个带有附加message参数的LLMResult。
batch_messages = [
[
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="Translate this sentence from English to French. I love programming.")
],
[
SystemMessage(content="You are a helpful assistant that translates English to French."),
HumanMessage(content="Translate this sentence from English to French. I love artificial intelligence.")
],
]
result = chat.generate(batch_messages)
#查看token
result.llm_output['token_usage']
# -> {'prompt_tokens': 71, 'completion_tokens': 18, 'total_tokens': 89}
后续其他内容会不定时发布,谢谢大家!