安装
要安装LangChain,请运行以下命令:
pip install langchain
更多详细信息,请参阅我们的安装指南。
环境设置
使用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帮助创建的最常见和最重要的链包含三个部分:
-
LLM(语言模型):这是这里的核心推理引擎。为了与LangChain一起工作,你需要了解不同类型的语言模型以及如何与它们一起工作。
-
提示模板:这为语言模型提供指令。它控制着语言模型的输出,因此理解如何构造提示和不同的提示策略是至关重要的。
-
输出解析器:这些将LLM的原始响应转换为更易于使用的格式,使其易于在下游使用。
-
在这个入门指南中,我们将分别介绍这三个组件,然后讨论如何将它们组合在一起。理解这些概念将使你能够更好地使用和定制LangChain应用程序。大多数LangChain应用程序允许你配置LLM和/或使用的提示,因此知道如何利用这一点将是一个很大的优势。
LLMs(大语言模型)
在LangChain中,有两种类型的语言模型,分别称为:
-
LLMs
:这是一种接受字符串输入并返回字符串的语言模型。 -
ChatModels
:这是一种接受一组消息作为输入并返回一条消息的语言模型。
LLMs的输入/输出很简单易懂,即一个字符串。但是ChatModels呢?它的输入是一组ChatMessages
,而输出是一条单个的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()
>>> "Hi" chat_model.predict("hi!")
llm.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模板
大多数LLM应用程序不会直接将用户输入传递给LLM。通常,它们会将用户输入添加到一个更大的文本中,称为提示模板,该模板提供了有关特定任务的额外上下文信息。
在上述示例中,我们传递给模型的文本包含了生成公司名称的指令。对于我们的应用来说,如果用户只需要提供公司/产品的描述,而不必担心给模型提供指令,那就太好了。
提示模板正是为此而设计的!它们将所有从用户输入到完全格式化的提示的逻辑捆绑在一起。这可以开始非常简单 - 例如,要生成上述字符串的提示可能只是:
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")
一家生产彩色袜子的好公司叫什么名字?
然而,使用这些模板而不是原始字符串格式化的好处有几个。您可以“部分”省略变量 - 例如,您可以随时只格式化其中一些变量。您可以将它们组合在一起,轻松地将不同的模板组合成单个提示。有关这些功能的详细说明,请参阅关于提示的部分。
提示模板还可用于生成消息列表。在这种情况下,提示不仅包含有关内容的信息,还包括每个消息(其角色、在列表中的位置等)。最常见的情况是ChatPromptTemplate
是一个ChatMessageTemplate
的列表。每个ChatMessageTemplate
包含如何格式化该ChatMessage
的指令 - 其角色,然后还有其内容。让我们看一下下面的示例:
from langchain.prompts.chat import ChatPromptTemplate
template = "You are a helpful assistant that translates {input_language} to {output_language}."
human_template = "{text}"
chat_prompt = ChatPromptTemplate.from_messages([
("system", template),
("human", human_template),
])
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
还可以以其他方式构造 - 请参阅关于提示的部分以获取更多详细信息。
输出解析器
输出解析器将LLM的原始输出转换为可以在下游使用的格式。主要的输出解析器类型包括:
-
将LLM的文本转换为结构化信息(例如
JSON
)。 -
将
ChatMessage
仅转换为字符串。 -
将调用中返回的除消息以外的额外信息(如
OpenAI
函数调用)转换为字符串。
有关这方面的详细信息,请参阅输出解析器部分。
在这个入门指南中,我们将编写自己的输出解析器 - 一个将逗号分隔的列表转换为列表的解析器。
首先,我们需要导入BaseOutputParser
类:
from langchain.schema import BaseOutputParser
接下来,我们创建一个名为CommaSeparatedListOutputParser
的类,该类继承自BaseOutputParser
:
class CommaSeparatedListOutputParser(BaseOutputParser):
"""Parse the output of an LLM call to a comma-separated list."""
然后,我们需要实现parse
方法,该方法接受一个字符串参数text
,并返回一个解析后的列表:
def parse(self, text: str):
"""Parse the output of an LLM call."""
return text.strip().split(", ")
最后,我们可以创建一个CommaSeparatedListOutputParser
实例,并调用其parse
方法来解析逗号分隔的字符串:
parser = CommaSeparatedListOutputParser()
result = parser.parse("hi, bye")
print(result)
# >> ['hi', 'bye']
PromptTemplate
+ LLM
+ OutputParser
我们可以将所有这些组合成一个链。这个链将接收输入变量,将这些变量传递给一个提示模板以创建提示,然后将提示传递给语言模型,并将输出通过(可选的)输出解析器进行传递。这是一种方便的方式来捆绑模块化的逻辑。让我们来看看它是如何工作的!
这段代码是一个使用Langchain库的示例,用于创建一个聊天机器人。该机器人接收一个类别作为输入,并生成该类别中的5个对象,以逗号分隔的形式返回。
首先,导入所需的模块:
from langchain.chat_models import ChatOpenAI
from langchain.prompts.chat import ChatPromptTemplate
from langchain.schema import BaseOutputParser
然后,定义一个名为CommaSeparatedListOutputParser
的类,继承自BaseOutputParser
。这个类的目的是将LLM调用的输出解析为逗号分隔的列表。
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
,其中包含系统消息和人类消息。系统消息指示助手应该生成一个逗号分隔的列表,而人类消息则包含用户输入的文本。
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.
"""
human_template = "{text}"
然后,使用ChatPromptTemplate.from_messages()
方法创建一个聊天提示模板,并将系统消息和人类消息传递给它。这将创建一个包含两个消息的提示模板。
chat_prompt = ChatPromptTemplate.from_messages([
("system", template),
("human", human_template),
])
最后,创建一条链,将聊天提示模板、ChatOpenAI
模型和CommaSeparatedListOutputParser
解析器连接起来。通过调用invoke()
方法并传递一个包含文本参数的字典来触发聊天机器人的行为。在这个例子中,我们传递了类别"colors",机器人将返回一个包含5种颜色的逗号分隔的列表。
chain = chat_prompt | ChatOpenAI() | CommaSeparatedListOutputParser()
result = chain.invoke({"text": "colors"})
print(result)
# >> ['red', 'blue', 'green', 'yellow', 'orange']
运行以上代码将输出一个包含5种颜色的逗号分隔的列表。
请注意,我们使用|
语法将这些组件连接在一起。这种|
语法称为LangChain表达式语言。要了解更多关于此语法的信息,请阅读此处的文档。
下一步
就是这些!我们已经介绍了如何创建LangChain应用程序的核心构建块。所有这些组件(LLMs,提示词,输出解析器)有许多细微差别,以及更多不同的组件需要学习。要继续您的旅程:
-
深入研究LLMs,提示词和输出解析器
-
学习其他关键组件
-
阅读有关LangChain表达式语言的文章,了解如何将这些组件链接在一起
-
查看我们有用的指南,详细了解特定主题的演练
-
探索端到端用例