在本快速入门中,我们将向您展示如何构建简单的 LLM 应用程序。该应用程序会将英语文本翻译成另一种语言。这是一个相对简单的 LLM 应用程序 - 它只是一个 LLM 调用加上一些提示。尽管如此,这仍然是开始使用 LangChain 的好方法 - 只需一些提示和 LLM 调用就可以构建很多功能!
概念
我们将涵盖的概念是:
-
使用语言模型
-
使用 PromptTemplates 和 OutputParsers
-
使用 LangChain 链接 PromptTemplate + LLM + OutputParser
-
使用 LangSmith 调试和跟踪您的应用程序
-
使用 LangServe 部署您的应用程序
设置
Jupyter 笔记本
本指南(以及文档中的大多数其他指南)使用 Jupyter 笔记本,并假设读者也使用 Jupyter 笔记本。 Jupyter 笔记本非常适合学习如何使用 LLM 系统,因为经常会出现问题(意外输出、API 关闭等),在交互式环境中阅读指南是更好地理解它们的好方法。
安装
要安装 LangChain 运行:
pip install langchain
LangSmith
您使用 LangChain 构建的许多应用程序将包含多个步骤,并多次调用 LLM 调用。随着这些应用程序变得越来越复杂,能够检查链或代理内部到底发生了什么变得至关重要。做到这一点的最佳方法是与 LangSmith 合作。
在上面的链接注册后,请确保设置环境变量以开始记录跟踪:
export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."
或者,如果在笔记本中,您可以使用以下命令设置它们:
import getpass
import os
os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()
详细演练
在本指南中,我们将构建一个应用程序来将用户输入从一种语言翻译为另一种语言。
使用语言模型
首先,让我们学习如何单独使用语言模型。 LangChain支持多种不同的语言模型,您可以互换使用 - 在下面选择您想要使用的一种!
pip install -qU langchain-openai
import getpass
import os
os.environ["OPENAI_API_KEY"] = getpass.getpass()
from langchain_openai import ChatOpenAI
model = ChatOpenAI(model="gpt-3.5-turbo")
我们先直接使用模型。 ChatModel 是 LangChain“Runnables”的实例,这意味着它们公开了一个标准接口来与之交互。为了简单地调用模型,我们可以将消息列表传递给 .invoke 方法。
from langchain_core.messages import HumanMessage, SystemMessage
messages = [
SystemMessage(content="Translate the following from English into Italian"),
HumanMessage(content="hi!"),
]
model.invoke(messages)
如果我们启用了 LangSmith,我们可以看到此运行已记录到 LangSmith,并且可以看到 LangSmith 跟踪(这里是官方示范,你要到你自己的project的default里看,如下图所示)
输出解析器
请注意,模型的响应是 AIMessage 。其中包含字符串响应以及有关响应的其他元数据。通常我们可能只想处理字符串响应。我们可以使用一个简单的输出解析器来解析这个响应。
我们首先导入简单的输出解析器。
from langchain_core.output_parsers import StrOutputParser
parser = StrOutputParser()
使用它的一种方法是单独使用它。例如,我们可以保存语言模型调用的结果,然后将其传递给解析器。
result = model.invoke(messages)
parser.invoke(result)
更常见的是,我们可以使用此输出解析器“链接”模型。这意味着该输出解析器将在该链中每次被调用。该链采用语言模型的输入类型(字符串或消息列表)并返回输出解析器的输出类型(字符串)。
我们可以使用 | 运算符轻松创建链。 LangChain 中使用 | 运算符将两个元素组合在一起。
chain = model | parser
chain.invoke(messages)
如果我们现在看一下 LangSmith,我们可以看到该链有两个步骤:首先调用语言模型,然后将结果传递到输出解析器。我们可以看到 LangSmith 轨迹
提示模板
现在我们将消息列表直接传递到语言模型中。这个消息列表从哪里来?通常它由用户输入和应用程序逻辑的组合构成。此应用程序逻辑通常获取原始用户输入并将其转换为准备传递到语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。
PromptTemplates 是 LangChain 中的一个概念,旨在协助这种转换。它们接收原始用户输入并返回准备传递到语言模型的数据(提示)。
让我们在这里创建一个 PromptTemplate。它将接受两个用户变量:
- language :将文本翻译成的语言
- text :要翻译的文本
from langchain_core.prompts import ChatPromptTemplate
首先,我们创建一个字符串,将其格式化为系统消息:
system_template = "Translate the following into {language}:"
接下来,我们可以创建 PromptTemplate。这将是 system_template 以及用于放置文本的更简单模板的组合
prompt_template = ChatPromptTemplate.from_messages(
[("system", system_template), ("user", "{text}")]
)
该提示模板的输入是字典。我们可以单独使用这个提示模板来看看它本身做了什么
result = prompt_template.invoke({"language": "italian", "text": "hi"})
result
我们可以看到它返回一个由两条消息组成的 ChatPromptValue 。如果我们想直接访问消息,我们可以这样做:
result.to_messages()
我们现在可以将其与上面的模型和输出解析器结合起来。这会将所有三个组件链接在一起。
chain = prompt_template | model | parser
chain.invoke({"language": "italian", "text": "hi"})
如果我们查看 LangSmith 迹线,我们可以看到所有三个组件都显示在 LangSmith 迹线中
使用 LangServe 提供服务
现在我们已经构建了一个应用程序,我们需要为它提供服务。这就是 LangServe 的用武之地。LangServe 帮助开发人员将 LangChain 链部署为 REST API。您不需要使用 LangServe 来使用 LangChain,但在本指南中,我们将向您展示如何使用 LangServe 部署您的应用程序。
虽然本指南的第一部分旨在在 Jupyter Notebook 或脚本中运行,但我们现在将不再使用它。我们将创建一个 Python 文件,然后从命令行与其交互。
安装:
pip install "langserve[all]"
服务器
要为我们的应用程序创建服务器,我们将创建一个 serve.py 文件。这将包含我们为应用程序提供服务的逻辑。它由三部分组成:
- 我们刚刚在上面构建的链的定义
- 我们的 FastAPI 应用程序
- 为链提供服务的路由的定义,通过 langserve.add_routes 完成
#!/usr/bin/env python
from typing import List
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import ChatOpenAI
from langserve import add_routes
# 1. Create prompt template
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}')
])
# 2. Create model
model = ChatOpenAI()
# 3. Create parser
parser = StrOutputParser()
# 4. Create chain
chain = prompt_template | model | parser
# 4. App definition
app = FastAPI(
title="LangChain Server",
version="1.0",
description="A simple API server using LangChain's Runnable interfaces",
)
# 5. Adding chain route
add_routes(
app,
chain,
path="/chain",
)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
就是这样!如果我们执行这个文件:
python serve.py
如果你报错了,大概率是没有设置系统环境变量opneai的key,在代码开头加上
import os
os.environ["OPENAI_API_KEY"] = "sk-……填你自己的key"
我们应该看到我们的链在 http://localhost:8000 上提供服务。
游乐场
每个 LangServe 服务都带有一个简单的内置 UI,用于配置和调用具有流输出和中间步骤可见性的应用程序。前往 http://localhost:8000/chain/playground/ 尝试一下!传递与之前相同的输入 - {“language”: “italian”, “text”: “hi”} - 它的响应应该与之前相同。
客户
现在让我们设置一个客户端,以便以编程方式与我们的服务进行交互。我们可以使用 langserve.RemoteRunnable 轻松做到这一点。使用它,我们可以与服务链进行交互,就像它在客户端运行一样。
from langserve import RemoteRunnable
remote_chain = RemoteRunnable("http://localhost:8000/chain/")
remote_chain.invoke({"language": "italian", "text": "hi"})
结论
就是这样!在本教程中,我们逐步创建了第一个简单的 LLM 应用程序。我们学习了如何使用语言模型、如何解析其输出、如何创建提示模板、如何在使用 LangSmith 创建的链中获得良好的可观察性,以及如何使用 LangServe 部署它们。