跳到主要内容

使用 LCEL 构建简单的 LLM 应用

在快速入门中,我们将向您展示如何使用 LangChain 构建简单的 LLM 应用程序。该应用程序会将英语文本翻译成另一种语言。这是一个相对简单的LLM应用。 这只是一个LLM通话加上一些提示。尽管如此,这仍然是开始使用 LangChain 的好方法 - 只需一些提示语和 LLM 调用就可以构建很多功能!

阅读本教程后,您将对以下内容有一个高层次的理解:

  • 使用语言模型
  • 使用 PromptTemplates 和 OutputParsers
  • 使用 LangChain 表达式语言 (LCEL) 把组件链接在一起
  • 使用 LangSmith 调试跟踪你的应用程序
  • 使用 LangServe 部署你的应用

让我们深入了解一下!

设置

Jupyter Notebook

本指南(以及文档中的大多数其他指南)使用 Jupyter Notebook,并假设读者也使用 Jupyter Notebook。 Jupyter Notebook非常适合学习如何使用 LLM 系统,因为事情经常可能会出错(意外输出、API 关闭等),而在交互式环境中阅读指南是更好地理解它们的好方法。

本教程和其他教程可能最方便地在 Jupyter Notebook 中运行。有关如何安装的说明,请参阅 此处

安装

安装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支持多种不同的语言模型,您可以互换使用 - 在下面选择您想要使用的一种!

#openai Azure
pip install -qU langchain-openai
#Anthropic
pip install -qU langchain-anthropic
#Google
pip install -qU langchain-google-vertexai
#Cohere
pip install -qU langchain-cohere

#...
import getpass
import os

os.environ["COHERE_API_KEY"] = getpass.getpass()

from langchain_cohere import ChatCohere

model = ChatCohere(model="command-r-plus")

我们先直接使用模型。 ChatModels 是 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)

API 参考: HumanMessage | SystemMessage

AIMessage(content='ciao!', response_metadata={'token_usage': {'completion_tokens': 3, 'prompt_tokens': 20, 'total_tokens': 23}, 'model_name': 'gpt-4', 'system_fingerprint': None, 'finish_reason': 'stop', 'logprobs': None}, id='run-fc5d7c88-9615-48ab-a3c7-425232b562c5-0')

如果我们启用了 LangSmith,我们可以看到此运行已记录到 LangSmith,并且可以看到 LangSmith 跟踪

OutputParsers 输出解析器

注意,模型的响应是 AIMessage。其中包含字符串响应以及有关响应的其他元数据。通常我们可能只想处理字符串响应。我们可以使用一个简单的输出解析器来解析这个响应。

我们首先导入简单的输出解析器

from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()

API 参考: StrOutputParser

使用它的一种方法是单独使用它。例如,我们可以保存语言模型调用的结果,然后将其传递给解析器。

result = model.invoke(messages)
parser.invoke(result)
'Ciao!'

更常见的是,我们可以使用此输出解析器“链接”模型。这意味着该输出解析器将在该链中每次被调用。该链采用语言模型的输入类型(字符串或消息列表)并返回输出解析器的输出类型(字符串)。

我们可以使用 | 轻松创建链操作符。 | 操作符在 LangChain 中使用运算符将两个元素组合在一起。

chain = model | parser
chain.invoke(messages)
'Ciao!'

如果我们现在看看 LangSmith,我们可以看到该链有两个步骤:首先调用语言模型,然后将结果传递到输出解析器。我们可以看到 LangSmith 跟踪

Prompt Templates

现在我们将消息列表直接传递到语言模型中。这个消息列表从哪里来?通常,它是由用户输入和应用程序逻辑的组合构建的。此应用程序逻辑通常获取原始用户输入并将其转换为准备传递到语言模型的消息列表。常见的转换包括添加系统消息或使用用户输入格式化模板。

PromptTemplates是LangChain中的一个概念,用于协助这种转变

它们接收原始用户输入并返回准备传给语言模型的数据(提示)。

让我们在这里创建一个 PromptTemplate。它将接受两个用户变量:

  • language: 要翻译成的语言
  • text: 被翻译的语言
from langchain_core.prompts import ChatPromptTemplate

API 参考: 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(messages=[SystemMessage(content='Translate the following into italian:'), HumanMessage(content='hi')])

我们可以看到它返回一个由两条消息组成的 ChatPromptValue。如果我们想直接访问消息,我们可以这样做:

result.to_messages()
[SystemMessage(content='Translate the following into italian:'),
HumanMessage(content='hi')]

使用 LCEL 将组件链接在一起

我们现在可以使用管道 (|) 运算符将其与上面的模型和输出解析器结合起来:

chain = prompt_template | model | parser
chain.invoke({"language": "italian", "text": "hi"})
'ciao'

这是一个使用 LangChain 表达式语言(LCEL)将 LangChain 模块链接在一起的简单例子。

如果我们查看 LangSmith 跟踪,我们可以看到所有三个组件都显示在 LangSmith 跟踪轨迹中。

使用 LangServe 提供服务

现在我们已经构建了一个应用程序,我们需要为它构建服务。这就是 LangServe 的用武之地。LangServe 帮助开发人员将 LangChain 链部署为 REST API。您不需要使用 LangServe 来使用 LangChain,但在本指南中,我们将向您展示如何使用 LangServe 部署您的应用程序。

虽然本指南的第一部分是用 Jupyter Notebook 或脚本中运行,但我们现在将不再使用它。我们将创建一个 Python 文件,然后从命令行与其交互。

用以下命令安装:

pip install "langserve[all]"

服务

要为我们的应用程序创建服务器,我们将创建一个serve.py 文件。这将包含我们为应用程序提供服务的逻辑。它由三部分组成:

1.我们刚刚在上面构建的链的定义 2.我们的 FastAPI 应用程序 3.为链提供服务的路由的定义,通过 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)

API 参考: ChatPromptTemplate | StrOutputParser | ChatOpenAI

就是这样!如果我们执行这个文件:

python serve.py

我们应该能看到我们的链在 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"})
'Ciao'

要了解有关 LangServe 的许多其他功能的更多信息,请前往 此处

结论

就酱!在本教程中,您学习了如何创建第一个简单的大模型应用。您已经学习了如何使用语言模型、如何解析其输出、如何创建提示模板、使用 LCEL 链接它们、如何在使用 LangSmith 创建的链中获得良好的可观察性,以及如何使用 LangServe 部署它们。

这些是你想要成为一名熟练的人工智能工程师所需要学习的知识的皮毛。幸运的是 - 我们还有很多其他资源!

为了进一步了解LangChain的核心概念,我们提供了详细的 概念指南