在本文中,我们将通过一个完整的示例程序,介绍 LangChain 的基本结构。这个程序实现了一个简单的翻译服务,用户可以通过 HTTP 请求输入待翻译的文本和目标语言,LangChain 会使用 OpenAI 模型处理请求,并返回翻译结果。通过这个程序,我们将详细讲解 LangChain 的三大核心组件:Prompt Template、Model 和 Parser,并探讨如何通过链式调用(Chain)将它们组合在一起。
以下是完整的代码:
python
#!/usr/bin/env python
from fastapi import FastAPI
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_openai import AzureChatOpenAI
from langserve import add_routes
from dotenv import load_dotenv
import os
# Load environment variables from .env file
load_dotenv()
# 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 = AzureChatOpenAI(
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)
# 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)
1. LangChain 的三大重要组成部分
在 LangChain 中,程序有三个关键部分:Prompt Template 、Model 和 Parser。这些模块一起构建了整个链式调用的基础。
(1) Prompt Template
Prompt Template 是用来为模型生成适当的提示词。LangChain 提供了灵活的模板化功能,让你可以根据不同需求生成个性化的 prompt。例如,下面的 system_template
用来告诉系统如何翻译输入的内容:
python
system_template = "Translate the following into {language}:"
通过 ChatPromptTemplate
,我们可以将系统提示和用户输入整合成一个可运行的提示模板:
python
prompt_template = ChatPromptTemplate.from_messages([
('system', system_template),
('user', '{text}')
])
这个模板接受两个变量:language
和 text
,分别代表翻译的目标语言和用户的输入文本。
(2) Model
接下来是模型部分。在这个例子中,我们使用的是 Azure 提供的 OpenAI API。通过将 API 端点、部署名称和密钥等配置引入,LangChain 可以直接调用 OpenAI 的服务来处理 prompt。下面是模型的创建代码:
python
model = AzureChatOpenAI(
azure_endpoint=os.getenv("AZURE_OPENAI_ENDPOINT"),
azure_deployment=os.getenv("AZURE_OPENAI_DEPLOYMENT_NAME"),
openai_api_version=os.getenv("AZURE_OPENAI_API_VERSION"),
api_key=os.getenv("AZURE_OPENAI_API_KEY"),
)
这一步确保了我们的 prompt 被发送到 OpenAI 的模型,并能接收到相应的回答。
(3) Parser
最后一步是解析模型的输出。在这个例子中,我们使用了 StrOutputParser
,它会将模型的响应解析为字符串形式:
python
parser = StrOutputParser()
通过这个 parser,我们可以确保模型返回的结果以适当的形式输出给用户。
链式调用:将 Prompt Template、Model 和 Parser 链接在一起
这三者通过管道式的运算符 |
被串联起来,形成了一个完整的调用链:
python
chain = prompt_template | model | parser
这就是 LangChain 的核心概念之一:链(Chain)。每一个链条都由多个可以运行的部分组成,通过简单的组合,我们可以快速构建出复杂的应用。
2. LCEL 语法及 LangChain 链的概念
LCEL(LangChain Expression Language)是 LangChain 中用于定义链式调用的语法,通过 LCEL,我们可以用非常直观的方式表达复杂的链式操作。在上面的代码中,我们通过 |
符号将不同组件串联起来,这正是 LCEL 的核心语法。每个组件都是一个独立的、可以运行的部分(Runnable),并且可以通过这种方式进行组合、链接,最终实现链式调用。
比如:
python
chain = prompt_template | model | parser
这一行代码展示了链式调用的精髓。用户输入数据后,它会被 Prompt Template 格式化为一个 prompt,然后传递给 Model 进行处理,最后交由 Parser 解析为用户需要的输出格式。
3. 调用这个简单的 LangChain 服务
通过以上代码,我们已经创建了一个简单的 LangChain API 服务。接下来,我们讨论如何调用这个服务。
(1) 传统的 Request/Response 方法:/chain/invoke
最常见的服务调用方式是通过传统的 HTTP 请求-响应模式。我们在 API 中为链式调用添加了一个路径 /chain
,用户可以通过 POST 请求访问这个路径,传入数据,并接收链式调用的最终输出。具体请求格式如下:
bash
POST /chain/invoke
Content-Type: application/json
{
"input": {
"language": "Spanish",
"text": "Hello, how are you?"
}
}
在这个例子中,我们传入了目标语言 Spanish
和待翻译的文本 Hello, how are you?
。服务器会执行链式调用,并返回翻译后的结果。
(2) 流式调用:/chain/stream
另一种调用方式是通过 Server-Sent Events(SSE)实现的流式调用。这种方法允许服务器将模型输出逐步发送给客户端,适用于需要处理长时间任务或流式生成文本的场景。在这个例子中,/chain/stream
路径支持 SSE,用户可以通过该路径接收实时的输出流。
bash
GET /chain/stream
当服务器处理完每一部分数据时,客户端会实时收到生成的结果,这对一些生成较慢或需要逐步呈现的任务非常有用。
4. 总结
通过这篇文章,我们了解了 LangChain 的核心组成部分:Prompt Template 、Model 和 Parser,以及如何将它们通过链式调用(Chain)进行组合。此外,我们还介绍了如何通过传统的请求响应模式和流式调用来使用一个简单的 LangChain API 服务。
LangChain 提供了一种简单、高效的方式来构建复杂的语言模型应用程序。通过它的模块化设计和链式结构,开发者可以快速搭建灵活且强大的应用,满足各种 NLP 任务的需求。