LangChain教程 - 使用 LCEL 构建一个简单的 LLM 应用程序

系列文章索引
LangChain教程 - 系列文章

在本教程中,我们将展示如何使用 LangChain 构建一个简单的 LLM 应用程序。这个应用将把文本从英语翻译成其他语言。虽然这是一个相对简单的应用程序——仅涉及单个 LLM 调用和一些提示,但它是学习 LangChain 的绝佳入门方式。很多功能可以通过提示和 LLM 调用轻松实现!

通过本教程,你将了解以下内容:

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

让我们开始吧!

环境准备

Jupyter Notebook

本教程(以及其他大多数文档中的教程)都使用 Jupyter Notebook。Jupyter Notebook 是学习如何处理 LLM 系统的理想工具,因为很多时候事情可能会出错(如意外的输出或 API 错误),通过交互式环境进行学习能帮助你更好地理解这些问题。

在 Jupyter Notebook 中运行本教程最为方便。你可以查看如何安装 Jupyter Notebook

安装

要安装 LangChain,请运行以下命令:

pip install langchain

更多详细信息请参阅我们的安装指南

LangSmith

你构建的许多 LangChain 应用程序都包含多个步骤和 LLM 调用。随着应用的复杂性增加,能够深入检查链条或代理内部发生的事情变得至关重要。LangSmith 是实现这一目的的最佳工具。

注册后,设置环境变量以开始记录链条追踪:

export LANGCHAIN_TRACING_V2="true"
export LANGCHAIN_API_KEY="..."

在 Notebook 中,你也可以使用以下代码设置环境变量:

import getpass
import os

os.environ["LANGCHAIN_TRACING_V2"] = "true"
os.environ["LANGCHAIN_API_KEY"] = getpass.getpass()

使用语言模型

首先,我们学习如何直接使用语言模型。LangChain 支持多种语言模型,你可以根据需求选择使用。以下是 OpenAI 模型的示例。

安装 OpenAI 包

pip install -qU langchain-openai

配置 OpenAI API 密钥

import getpass
import os

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

初始化模型

from langchain_openai import ChatOpenAI

model = ChatOpenAI(model="gpt-4")

接下来,我们直接调用模型。ChatModels 是 LangChain 中 “Runnable” 的实例,提供了标准接口。可以通过传递消息列表给 .invoke 方法直接调用模型。

from langchain_core.messages import HumanMessage, SystemMessage

messages = [
    SystemMessage(content="Translate the following from English into Italian"),
    HumanMessage(content="hi!"),
]

model.invoke(messages)

输出示例:

AIMessage(content='ciao!', ...)

OutputParsers

响应结果是一个 AIMessage 对象,包含生成的字符串响应以及其他元数据。我们通常只需要处理字符串响应。可以通过 OutputParser 提取此响应。

from langchain_core.output_parsers import StrOutputParser

parser = StrOutputParser()

result = model.invoke(messages)
parser.invoke(result)

输出:

'Ciao!'

更常见的是,我们可以将模型和输出解析器“链”在一起。每次调用时,输出解析器将自动处理模型的结果。

chain = model | parser
chain.invoke(messages)

输出:

'Ciao!'

PromptTemplates

目前,我们直接传递消息列表给模型。然而,通常消息是由用户输入和应用程序逻辑生成的。PromptTemplates 是 LangChain 中用于帮助处理这种转换的工具。它将用户的原始输入转换为可以传递给语言模型的消息列表。

from langchain_core.prompts import ChatPromptTemplate

system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages(
    [("system", system_template), ("user", "{text}")]
)

result = prompt_template.invoke({"language": "italian", "text": "hi"})
result.to_messages()

输出:

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

使用 LCEL 链接组件

现在,我们可以使用 | 操作符将 PromptTemplate、模型和输出解析器组合在一起,形成一个链:

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

输出:

'ciao'

这就是使用 LangChain Expression Language (LCEL) 将组件链接在一起的简单示例。使用 LCEL 的好处包括优化的流处理和追踪支持。

使用 LangServe 部署应用

创建好应用后,我们可以使用 LangServe 将其部署为 REST API。虽然前面的部分是在 Jupyter Notebook 中运行的,但现在我们将创建一个 Python 文件并从命令行与其交互。

安装 LangServe

pip install "langserve[all]"

创建 serve.py 文件

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. 创建 Prompt 模板
system_template = "Translate the following into {language}:"
prompt_template = ChatPromptTemplate.from_messages([
    ('system', system_template),
    ('user', '{text}')
])

# 2. 创建模型
model = ChatOpenAI()

# 3. 创建解析器
parser = StrOutputParser()

# 4. 创建链
chain = prompt_template | model | parser

# 5. 定义 FastAPI 应用
app = FastAPI(
  title="LangChain Server",
  version="1.0",
  description="一个简单的 LangChain API 服务",
)

# 6. 添加链路到 API 路径
add_routes(
    app,
    chain,
    path="/chain",
)

if __name__ == "__main__":
    import uvicorn

    uvicorn.run(app, host="localhost", port=8000)

运行服务

python serve.py

服务将在 http://localhost:8000 运行。

使用 LangServe Playground

每个 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'

总结

通过本教程,你学习了如何创建一个简单的 LLM 应用,如何使用语言模型,解析模型输出,创建提示模板,使用 LCEL 链接组件,以及如何通过 LangServe 部署应用。这只是入门的第一步,成为一个熟练的 AI 工程师还需要掌握更多知识。幸运的是,我们提供了丰富的资源供你学习!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值