在大模型应用开发中,搭建好的 LangChain 链(如文本生成链、RAG 链)需要部署为 API 接口,才能供前端、APP 等下游系统调用。LangServe 作为 LangChain 官方推出的部署工具,能快速将 LangChain 可运行程序(Runnables)、链(Chains)转为标准化 REST API,无需手动编写 Flask/FastAPI 代码。本文从基础到实战,带你手把手完成 LangChain 链的 API 部署。
一、LangServe 核心优势
- 零代码适配:直接兼容 LangChain 所有组件(链、智能体、检索器等),无需修改原有链代码;
- 标准化 API:自动生成 REST 接口,支持同步 / 异步调用、批量请求、流式响应;
- 轻量高效:基于 FastAPI 构建,性能优异,支持动态扩缩容;
- 调试友好:自带 Swagger UI 文档,可直接在浏览器测试 API;
- 灵活扩展:支持自定义路由、权限控制、请求 / 响应处理。
二、前置准备
- 安装依赖:安装 LangServe 及相关核心库
bash
运行
pip install langserve langchain langchain-openai fastapi uvicorn python-dotenv
langserve:核心部署工具;fastapi/uvicorn:底层 Web 框架和服务器;langchain-openai:对接 OpenAI 模型(可替换为开源模型)。
- 配置 API Key :创建
.env文件管理 OpenAI API Key(避免硬编码)
env
# .env 文件内容
OPENAI_API_KEY=你的OpenAI API密钥
三、实战步骤:从链到 API 部署
步骤 1:创建 LangChain 链(以文本生成链为例)
先编写一个简单的 "主题→笑话生成" 链,后续将其部署为 API:
python
运行
# 文件名:chain.py(存放链的定义)
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI
from dotenv import load_dotenv
import os
# 加载环境变量
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
# 1. 定义提示词模板
prompt = ChatPromptTemplate.from_template("生成一个关于 {topic} 的短笑话,不超过30字")
# 2. 初始化大模型
model = ChatOpenAI(
model="gpt-3.5-turbo",
temperature=0.7,
api_key=openai_api_key
)
# 3. 定义输出解析器
output_parser = StrOutputParser()
# 4. 构建 LangChain 链
joke_chain = prompt | model | output_parser
# 测试链是否正常工作
if __name__ == "__main__":
result = joke_chain.invoke({"topic": "咖啡"})
print("测试结果:", result) # 示例输出:"为什么咖啡总熬夜?因为它离不开咖啡因的陪伴~"
运行 python chain.py,确认链能正常生成结果,再进行后续部署。
步骤 2:用 LangServe 部署 API
创建部署脚本,将上述链注册为 REST API 接口:
python
运行
# 文件名:server.py(部署脚本)
from fastapi import FastAPI
from langserve import add_routes
from chain import joke_chain # 导入之前定义的链
# 1. 初始化 FastAPI 应用
app = FastAPI(
title="LangServe 笑话生成 API",
description="基于 LangChain + OpenAI 的笑话生成接口",
version="1.0.0"
)
# 2. 注册链为 API 路由
# path:API 接口路径(访问时用 /joke)
# route_name:路由名称(Swagger 文档中显示)
add_routes(
app,
joke_chain,
path="/joke",
route_name="笑话生成接口"
)
# 3. 启动服务(仅本地测试用)
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="0.0.0.0", port=8000)
步骤 3:启动 API 服务
运行部署脚本,启动 Web 服务器:
bash
运行
python server.py
启动成功后,终端会显示:
plaintext
INFO: Started server process [xxxx]
INFO: Waiting for application startup.
INFO: Application startup complete.
INFO: Uvicorn running on http://0.0.0.0:8000 (Press CTRL+C to quit)
步骤 4:测试 API 接口
LangServe 自动生成了 Swagger UI 文档,可通过浏览器或代码测试接口。
方式 1:浏览器测试(推荐新手)
打开浏览器访问 http://localhost:8000/docs,进入 Swagger 文档页面:
- 找到
/joke/invoke接口(同步调用),点击 "Try it out"; - 在请求体中输入参数(JSON 格式):
json
{
"input": {
"topic": "猫咪"
}
}
- 点击 "Execute",即可看到响应结果:
json
{
"output": "猫咪为什么爱蹭人?因为它想给你"盖章"认证呀~"
}
方式 2:Python 代码调用(实际应用场景)
编写客户端代码,调用部署好的 API:
python
运行
# 文件名:client.py
import requests
# API 接口地址
url = "http://localhost:8000/joke/invoke"
# 请求参数(与链的输入格式一致)
data = {
"input": {
"topic": "程序员"
}
}
# 发送 POST 请求
response = requests.post(url, json=data)
# 解析响应结果
if response.status_code == 200:
result = response.json()
print("API 响应结果:", result["output"])
else:
print(f"请求失败,状态码:{response.status_code}")
运行 python client.py,输出示例:
plaintext
API 响应结果:程序员为什么爱穿格子衫?因为它能自动对齐代码呀~
方式 3:流式响应(适合长文本生成)
LangServe 支持流式输出,只需调用 /joke/stream 接口:
python
运行
# 流式调用示例
import requests
url = "http://localhost:8000/joke/stream"
data = {"input": {"topic": "狗狗"}}
# 流式接收响应
with requests.post(url, json=data, stream=True) as response:
for chunk in response.iter_content(chunk_size=None):
if chunk:
print(chunk.decode("utf-8"), end="")
四、进阶:部署 RAG 链(检索增强生成 API)
如果需要部署更复杂的 RAG 链(带知识库检索),只需修改 chain.py 中的链定义,部署流程完全一致。
步骤 1:定义 RAG 链
python
运行
# 文件名:chain.py(替换为 RAG 链)
from langchain_community.vectorstores import DocArrayInMemorySearch
from langchain_core.output_parsers import StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnableParallel, RunnablePassthrough
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from dotenv import load_dotenv
import os
load_dotenv()
openai_api_key = os.getenv("OPENAI_API_KEY")
# 1. 构建知识库(示例文档)
documents = [
"LangServe 是 LangChain 官方部署工具",
"LangServe 基于 FastAPI 构建,支持 REST API",
"LangServe 可部署链、智能体、检索器等组件"
]
vectorstore = DocArrayInMemorySearch.from_texts(
documents, embedding=OpenAIEmbeddings(api_key=openai_api_key)
)
retriever = vectorstore.as_retriever()
# 2. RAG 提示词模板
prompt = ChatPromptTemplate.from_template("基于以下上下文回答问题:\n{context}\n\n问题:{question}")
# 3. 构建 RAG 链
rag_chain = RunnableParallel(
{"context": retriever, "question": RunnablePassthrough()}
) | prompt | ChatOpenAI(model="gpt-3.5-turbo", api_key=openai_api_key) | StrOutputParser()
# 测试 RAG 链
if __name__ == "__main__":
result = rag_chain.invoke({"question": "LangServe 基于什么框架构建?"})
print("RAG 测试结果:", result) # 输出:"LangServe 基于 FastAPI 构建"
步骤 2:重新部署 API
无需修改 server.py,只需将导入的链改为 rag_chain:
python
运行
# server.py 中修改导入
from chain import rag_chain
# 注册 RAG 链路由
add_routes(
app,
rag_chain,
path="/rag",
route_name="RAG 问答接口"
)
重启服务后,访问 http://localhost:8000/docs,即可测试 RAG API,输入问题 "LangServe 能部署什么组件?",会返回基于知识库的答案。
五、生产环境优化建议
- 端口与主机配置:生产环境建议指定非 8000 端口,并限制访问主机(如仅允许内网访问);
- 权限控制:通过 FastAPI 的依赖注入添加 API Key 验证,防止接口被滥用;
- 日志与监控 :集成日志模块(如
logging)和监控工具(如 Prometheus),跟踪接口调用情况; - 容器化部署:将应用打包为 Docker 镜像,通过 Kubernetes 实现扩缩容;
- 模型替换:若不想依赖 OpenAI,可替换为开源模型(如 Llama 3、Mistral),只需修改链中的模型初始化部分。
六、常见问题排查
- API 调用报错 "422 Unprocessable Entity" :请求参数格式错误,需与链的输入格式一致(如链输入是
{"topic": "xxx"},则请求体需包含input: {"topic": "xxx"}); - 模型调用失败 :检查
.env中的 API Key 是否有效,或模型是否支持当前地区访问; - 端口被占用 :修改
server.py中的port参数(如改为 8080); - Swagger 文档无法访问 :确认启动命令正确,且访问地址为
http://localhost:端口/docs。
七、总结
LangServe 让 LangChain 链的部署变得 "零门槛"------ 无需编写复杂的 Web 代码,只需定义链、注册路由、启动服务三步,即可获得标准化的 REST API。无论是简单的文本生成链,还是复杂的 RAG 链、智能体,都能通过 LangServe 快速部署上线。
这种 "开发→部署" 一体化的流程,大幅降低了大模型应用的落地成本,适合快速验证原型或小中型生产环境使用。接下来你可以尝试部署自己的业务链(如客服问答链、文档解析链),并结合前端页面构建完整的应用。