一架梯子,一头程序猿,仰望星空!
LangChain教程(Python版本) > 内容正文

LangChain 快速入门


安装LangChain

要安装 LangChain,请运行:

  • Pip
pip install langchain
  • Conda
conda install langchain -c conda-forge

更多详情,请查看我们的安装指南

环境设置

使用LangChain通常需要与一个或多个模型提供商、数据存储、API等集成。对于这个例子,我们将使用OpenAI的模型API。

首先,我们需要安装Openai的Python包:

pip install openai

访问API需要一个API密钥,您可以通过创建一个帐户并前往这里来获取。获取api密钥后,我们就可以通过运行以下命令将其设置为环境变量:

export OPENAI_API_KEY=\"...\"

如果您不喜欢设置环境变量,也可以通过在初始化OpenAI LLM类时的openai_api_key命名参数直接传入密钥:

from langchain.llms import OpenAI

llm = OpenAI(openai_api_key=\"...\")

构建应用程序

现在我们可以开始构建语言模型应用程序了。LangChain提供了许多模块来构建语言模型应用程序。模块可以作为简单应用程序中的独立部分使用,也可以组合用于更复杂的用例。

LLM

通过大语言模型预测

LangChain的基本构建模块是LLM,它接受文本输入并生成更多文本。

例如,假设我们正在构建一个根据公司描述生成公司名称的应用程序。为此,我们需要初始化一个OpenAI模型封装器。在这种情况下,由于我们希望输出更加随机,我们将使用高温度初始化我们的模型。

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.9)

现在我们可以传入文本并获得预测了!

llm.predict("What would be a good company name for a company that makes colorful socks?\")

# 返回 Feetful of Fun

聊天模型

聊天模型是语言模型的一个变种。虽然聊天模型在底层使用语言模型,但它们暴露的接口有点不同:它们没有暴露“文本输入,文本输出”的API,而是暴露了一个界面,其中“聊天消息”是输入和输出。

您可以通过向聊天模型传递一个或多个消息来获取聊天补全。响应将是一个消息。LangChain目前支持的消息类型有AIMessageHumanMessageSystemMessageChatMessage - ChatMessage接受一个任意的角色参数。大多数时候,您只需要处理HumanMessageAIMessageSystemMessage

from langchain.chat_models import ChatOpenAI
from langchain.schema import (
    AIMessage,
    HumanMessage,
    SystemMessage
)

chat = ChatOpenAI(temperature=0)
chat.predict_messages([HumanMessage(content="Translate this sentence from English to French. I love programming.")])

# >> AIMessage(content="J'aime programmer.", additional_kwargs={})

理解聊天模型与普通LLM的不同之处是有用的,但通常能够以与普通LLM相同的方式对待它们也很方便。LangChain通过也暴露一个接口来实现这一点,您可以通过该接口与聊天模型进行交互,就像与普通LLM一样。您可以通过predict接口访问它。

chat.predict("Translate this sentence from English to French. I love programming.")
# >> J'aime programmer

提示模板

大多数LLM应用程序不会将用户输入直接传入LLM。它们通常会将用户输入添加到一个更大的文本片段中,称为提示模板(Prompt Template),以提供有关特定任务的附加上下文。

在之前的示例中,我们传递给模型的文本包含生成公司名称的说明。对于我们的应用程序,最好的是用户只需要提供公司/产品的描述,而不必担心向模型提供说明。

LLM

使用PromptTemplates非常容易!

from langchain.prompts import PromptTemplate

// prompt模板
prompt = PromptTemplate.from_template("What is a good name for a company that makes {product}?")

// 通过模板变量渲染模板
prompt.format(product="colorful socks")
What is a good name for a company that makes colorful socks?

聊天模型

与LLM类似,您可以通过使用MessagePromptTemplate来利用模板。您可以从一个或多个MessagePromptTemplate构建一个ChatPromptTemplate。您可以使用ChatPromptTemplateformat_messages方法来生成格式化的消息。

因为这是生成一系列消息,所以它比只生成一个字符串的正常提示模板稍微复杂一些。请参阅有关提示的详细指南,以了解这里可用的更多选项。

from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

// 定义模板
template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)

chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt,human_message_prompt])
// 设置模板变量值
chat_prompt.format_messages(input_language="English", output_language="French", text="I love programming.")
[
    SystemMessage(content="You are a helpful assistant that translates English to French.", additional_kwargs={}),
    HumanMessage(content="I love programming.")
]

链(Chain)

现在我们已经有了一个模型和一个提示模板,我们将想要将两者组合起来。链(Chain)为我们提供了一种将(或链式地)多个基础模块(如模型、提示和其他链)链接起来的方式。

LLM

最简单也最常见的链类型是LLMChain,它首先将输入传递给一个PromptTemplate,然后传递给一个LLM。我们可以从现有的模型和提示模板构造一个LLM链。

直接使用llm的例子

llm.predict("What would be a good company name for a company that makes colorful socks?")

使用LLMChain的等价例子

from langchain.chains import LLMChain

chain = LLMChain(llm=llm, prompt=prompt)
chain.run("colorful socks")

返回

Feetful of Fun

这是我们的第一个链!理解这个简单链的工作原理会很好地为使用更复杂的链做准备。

聊天模型

LLMChain也可以与聊天模型一起使用:

from langchain import LLMChain
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
    ChatPromptTemplate,
    SystemMessagePromptTemplate,
    HumanMessagePromptTemplate,
)

chat = ChatOpenAI(temperature=0)

template = "You are a helpful assistant that translates {input_language} to {output_language}."
system_message_prompt = SystemMessagePromptTemplate.from_template(template)
human_template = "{text}"  
human_message_prompt = HumanMessagePromptTemplate.from_template(human_template)
chat_prompt = ChatPromptTemplate.from_messages([system_message_prompt, human_message_prompt])

chain = LLMChain(llm=chat, prompt=chat_prompt)
chain.run(input_language="English", output_language="French", text="I love programming.")

返回

J'aime programmer.

代理(Agents)

我们的第一个链运行了一个预定的序列步骤。为了处理复杂的工作流程, 我需要执行一序列操作用于增强LLM(大模型)的能力。

代理(Agents)简单的理解就是代替模型执行一些操作,大模型作为大脑用于决策,由大模型决定执行什么操作或者操作的顺序。

代理可以访问工具,工具指的是封装好的一些操作/处理逻辑等,通过代理运行工具并观察输出, 直到它们得出最终答案。

要加载一个代理,您需要选择一个:

  • LLM/聊天模型: 驱动代理的语言模型。
  • 工具: 执行特定任务的函数。这可以是以下事项:谷歌搜索、数据库查找、Python REPL、其他链。
  • 代理名称: 用于引用代理类。

对于此示例,我们将使用SerpAPI查询搜索引擎。

您需要安装SerpAPI Python包:

pip install google-search-results

并设置SERPAPI_API_KEY环境变量。

LLM

from langchain.agents import AgentType, initialize_agent, load_tools
from langchain.llms import OpenAI

# 使用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)

# 向AI提问,LLM大模型通过agent调用SerpAPI工具进行搜索引擎查询信息,并格式化结果返回。
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...

Thought: 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.

返回结果

The high temperature in SF yesterday in Fahrenheit raised to the .023 power is 1.0974509573251117.

记忆(memory)

到目前为止,我们看到的链和代理都是无状态的,但是对于许多应用来说,参考过去的交互非常必要。这在聊天机器人中是十分明显的,您会希望它根据过去的消息来理解新的消息。

提示:目前所有大模型都存在有限的上下文限制,简单的说大模型记不住曾经说过话、做过的事情,LangChain通过memory模块帮助记忆历史信息。

Memory模块为您提供了一种维护应用程序状态的方式。基本的内存接口很简单:它允许您根据最新运行的输入和输出更新状态,并允许您使用存储的状态修改(或上下文化)下一个输入。

有许多内置的memory系统。其中最简单的就是缓冲内存,它只是将最近的几个输入/输出追加到当前输入中 —— 我们将在下面的示例中使用它。

from langchain import OpenAI, ConversationChain

llm = OpenAI(temperature=0)
conversation = ConversationChain(llm=llm, verbose=True)
conversation.run("Hi there!")

下面是跟AI对话过程,LangChain在对话过程插入历史信息,帮助AI恢复记忆。

> 进入新的链...
格式化后的提示:
以下是人工智能和人类之间的友好对话。该AI很善于交谈,并从其上下文中提供大量具体细节。如果AI不知道问题的答案,它会真实地说它不知道。

当前对话:

H: 嗨,你好!
AI:

> 完成链。
>> '你好!今天你好吗?'

现在如果我们再次运行链

conversation.run("I'm doing well! Just having a conversation with an AI.")

我们会看到传递给模型的完整提示包含我们第一次交互的输入和输出,以及我们最新的输入

> 进入新的链...
格式化后的提示:
以下是人工智能和人类之间的友好对话。该AI很善于交谈,并从其上下文中提供大量具体细节。如果AI不知道问题的答案,它会真实地说它不知道。

当前对话:
人类:嗨,你好!  
AI:你好!今天你好吗?
人类:我很好!只是在与AI对话。
AI:

> 完成链。

>> "太好了!你想聊什么?"


关联主题