快速入门
安装
要安装LangChain,请运行以下命令:
- Pip
- Conda
pip install langchain
conda install langchain -c conda-forge
更多细节,请查看我们的安装指南。
环境设置
通常使用LangChain会需要与一个或多个模型提供商、数据存储、API等进行集成。在这个例子中,我们将使用OpenAI的模型API。
首先我们需要安装Python包:
pip install openai
访问 API 需要一个 API 密钥,你可以通过创建一个账户并前往 这里 获得。一旦我们有了密钥,我们就可以通过运行以下命令将其设置为环境变量:
export OPENAI_API_KEY="..."
如果你不希望设置环境变量,你可以在初始化 OpenAI LLM 类时直接通过 openai_api_key
命名参数传入密钥
from langchain.llms import OpenAI
llm = OpenAI(openai_api_key="...")
构建应用程序
现在我们可以开始构建我们的语言模型应用程序。LangChain 提供了许多模块,可以用来构建语言模型应用程序。模块可以在简单的应用程序中作为独立的模块使用,也可以组合在一起用于更复杂的用例。
LangChain 应用程序的核心构建块是 LLMChain。它包含三个部分:
- LLM: 语言模型是这里的核心推理引擎。为了使用 LangChain,你需要了解不同类型的语言模型以及如何使用它们。
- 提示模板(Prompt Templates):这为语言模型提供了指令。这决定了语言模型的输出,因此理解如何构造提示和不同的提示策略至关重要。
- 输出解析器(Output Parsers):这些将 LLM 的原始响应翻译为更可操作的格式,使得下游使用输出变得容易。
在这个入门指南中,我们将单独介绍这三个组件,然后介绍将它们全部结合起来的 LLMChain。理解这些概念将为你使用和自定义 LangChain 应用程序打下良好的基础。多数 LangChain 应用程序允许你配置 LLM 和使用的提示(Prompts),因此知道如何利用这一点将会是一个大的推动力。
LLMs
在LangChain中,有两种类型的语言模型:
- LLMs:这是一种语言模型,输入一个字符串,返回一个字符串
- ChatModels:这是一种语言模型,输入一个消息列表,返回一个消息
LLMs的输入/输出非常简单,易于理解 - 就是一个字符串。但是ChatModels呢?在这里,输入是一个ChatMessage
的列表,输出是一个ChatMessage
。一个ChatMessage
有两个必需的组件:
content
:这是消息的内容role
:这是产生ChatMessage
的实体的角色
LangChain提供了几个对象以方便区分不同的角色:
HumanMessage
:来自人类/用户的ChatMessage
AIMessage
:来自AI/助手的ChatMessage
SystemMessage
:来自系统的ChatMessage
FunctionMessage
:来自函数调用的ChatMessage
如果这些角色都不合适,也有一个ChatMessage
类,您可以在其中手动指定角色。关于如何最有效地使用这些不同的消息,参见我们的提示指南。
LangChain对这两者都提供了一个标准接口,但为了构建给定语言模型的提示,理解这个区别是很有用的。LangChain公开的标准接口有两个方法:
predict
:输入一个字符串,返回一个字符串predict_messages
:输入一个消息列表,返回一个消息
让我们看看如何使用这些不同类型的模型和这些不同类型的输入。首先,让我们导入一个LLM和一个ChatModel。
from langchain.llms import OpenAI
from langchain.chat_models import ChatOpenAI
llm = OpenAI()
chat_model = ChatOpenAI()
llm.predict("hi!")
# >> "Hi"
chat_model.predict("hi!")
# >> "Hi"
OpenAI和ChatOpenAI对象基本上只是配置对象。您可以使用temperature等参数初始化它们,并传递它们。
接下来,让我们使用predict
方法运行一个字符串输入:
text = "What would be a good company name for a company that makes colorful socks?"
llm.predict(text)
# >> Feetful of Fun
chat_model.predict(text)
# >> Socks O'Color
用predict_messages
方法将一组字符串作为输入:
from langchain.schema import HumanMessage
text = "What would be a good company name for a company that makes colorful socks?"
messages = [HumanMessage(content=text)]
llm.predict_messages(messages)
# >> Feetful of Fun
chat_model.predict_messages(messages)
# >> Socks O'Color
对于这两种方法,您也可以将参数作为关键字参数传递。例如,您可以传入temperature=0
来调整与对象配置的温度。在运行时传入的任何值总是会覆盖对象配置的值。
提示模板 Prompt templates
大多数LLM应用并不会直接把用户输入传递到LLM中。通常,他们会把用户输入添加到一个更大的文本中,这个文本被称为提示模板Prompt templates,它提供了关于特定任务的附加背景信息。
在前面的示例中,我们传递给模型的文本包含了生成公司名称的指令。对于我们的应用,如果用户只需要提供公司/产品的描述,而不必担心给模型提供指令,那就太好了。
提示模板就是为了解决这个问题!他们将用户输入转换成一个完全格式化的提示的所有逻辑都捆绑在一起。这可以从非常简单的开始 - 例如,生成上述字符串的提示只需:
from langchain.prompts import PromptTemplate
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?
然而,使用这些而不是原始字符串格式化的优势有几个。你可以"部分"出变量 - 例如,你可以一次只格式化一部分变量。你可以把它们组合在一起,轻松地将不同的模板组合成一个单独的提示。对于这些功能的解释,请参阅 关于提示的部分 以获取更多细节。
提示模板还可以用来生成一系列消息。在这种情况下,提示不仅包含了内容的信息,还包含了每个消息的信息(它的角色,它在列表中的位置等)。这里,最常见的情况是ChatPromptTemplate是一系列的ChatMessageTemplates。每个ChatMessageTemplate都包含了如何格式化该ChatMessage的指令 - 其角色,以及其内容。让我们看看下面的例子:
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.")
]
ChatPromptTemplates也可以包含ChatMessageTemplates之外的其他内容 - 请查看有关提示的部分以获取更多详情。
输出解析器 OutputParsers
OutputParsers将 LLM 的原始输出转化为可以在下游使用的格式。主要有几种类型的 OutputParsers,包括:
- 将 LLM 的文本转换为结构化信息(例如 JSON)
- 将 ChatMessage 转换为字符串
- 将除消息以外从调用中返回的额外信息(例如 OpenAI 函数调用)转换为字符串。
有关此的完整信息,请参阅 输出解析器 的部分
from langchain.schema import BaseOutputParser
class CommaSeparatedListOutputParser(BaseOutputParser):
"""Parse the output of an LLM call to a comma-separated list."""
def parse(self, text: str):
"""Parse the output of an LLM call."""
return text.strip().split(", ")
CommaSeparatedListOutputParser().parse("hi, bye")
# >> ['hi', 'bye']
LLMChain
现在我们可以将所有这些组合成一个链(Chain)。此链将接收输入变量,将这些变量传递给提示模板(Prompt Template)以创建提示,然后将提示传递给LLM,然后将输出通过(可选的)输出解析器(OutputParsers)传递出去。这是打包一块模块化逻辑的便捷方式。让我们看看它的实际应用!
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import (
ChatPromptTemplate,
SystemMessagePromptTemplate,
HumanMessagePromptTemplate,
)
from langchain.chains import LLMChain
from langchain.schema import BaseOutputParser
class CommaSeparatedListOutputParser(BaseOutputParser):
"""Parse the output of an LLM call to a comma-separated list."""
def parse(self, text: str):
"""Parse the output of an LLM call."""
return text.strip().split(", ")
template = """You are a helpful assistant who generates comma separated lists.
A user will pass in a category, and you should generate 5 objects in that category in a comma separated list.
ONLY return a comma separated list, and nothing more."""
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=ChatOpenAI(),
prompt=chat_prompt,
output_parser=CommaSeparatedListOutputParser()
)
chain.run("colors")
# >> ['red', 'blue', 'green', 'yellow', 'orange']
下一步
就是这样!我们现在已经介绍了如何创建LangChain应用的核心构建模块 - LLMChains。这些组件(LLMs、prompts、output parsers)中都有许多细微之处,还有更多不同的组件需要学习。要继续你的旅程: