LangServe 实战:5 分钟将 LangChain 链部署为 REST API

在大模型应用开发中,搭建好的 LangChain 链(如文本生成链、RAG 链)需要部署为 API 接口,才能供前端、APP 等下游系统调用。LangServe 作为 LangChain 官方推出的部署工具,能快速将 LangChain 可运行程序(Runnables)、链(Chains)转为标准化 REST API,无需手动编写 Flask/FastAPI 代码。本文从基础到实战,带你手把手完成 LangChain 链的 API 部署。

一、LangServe 核心优势

  1. 零代码适配:直接兼容 LangChain 所有组件(链、智能体、检索器等),无需修改原有链代码;
  2. 标准化 API:自动生成 REST 接口,支持同步 / 异步调用、批量请求、流式响应;
  3. 轻量高效:基于 FastAPI 构建,性能优异,支持动态扩缩容;
  4. 调试友好:自带 Swagger UI 文档,可直接在浏览器测试 API;
  5. 灵活扩展:支持自定义路由、权限控制、请求 / 响应处理。

二、前置准备

  1. 安装依赖:安装 LangServe 及相关核心库

bash

运行

复制代码
pip install langserve langchain langchain-openai fastapi uvicorn python-dotenv
  • langserve:核心部署工具;
  • fastapi/uvicorn:底层 Web 框架和服务器;
  • langchain-openai:对接 OpenAI 模型(可替换为开源模型)。
  1. 配置 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 文档页面:

  1. 找到 /joke/invoke 接口(同步调用),点击 "Try it out";
  2. 在请求体中输入参数(JSON 格式):

json

复制代码
{
  "input": {
    "topic": "猫咪"
  }
}
  1. 点击 "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 能部署什么组件?",会返回基于知识库的答案。

五、生产环境优化建议

  1. 端口与主机配置:生产环境建议指定非 8000 端口,并限制访问主机(如仅允许内网访问);
  2. 权限控制:通过 FastAPI 的依赖注入添加 API Key 验证,防止接口被滥用;
  3. 日志与监控 :集成日志模块(如 logging)和监控工具(如 Prometheus),跟踪接口调用情况;
  4. 容器化部署:将应用打包为 Docker 镜像,通过 Kubernetes 实现扩缩容;
  5. 模型替换:若不想依赖 OpenAI,可替换为开源模型(如 Llama 3、Mistral),只需修改链中的模型初始化部分。

六、常见问题排查

  1. API 调用报错 "422 Unprocessable Entity" :请求参数格式错误,需与链的输入格式一致(如链输入是 {"topic": "xxx"},则请求体需包含 input: {"topic": "xxx"});
  2. 模型调用失败 :检查 .env 中的 API Key 是否有效,或模型是否支持当前地区访问;
  3. 端口被占用 :修改 server.py 中的 port 参数(如改为 8080);
  4. Swagger 文档无法访问 :确认启动命令正确,且访问地址为 http://localhost:端口/docs

七、总结

LangServe 让 LangChain 链的部署变得 "零门槛"------ 无需编写复杂的 Web 代码,只需定义链、注册路由、启动服务三步,即可获得标准化的 REST API。无论是简单的文本生成链,还是复杂的 RAG 链、智能体,都能通过 LangServe 快速部署上线。

这种 "开发→部署" 一体化的流程,大幅降低了大模型应用的落地成本,适合快速验证原型或小中型生产环境使用。接下来你可以尝试部署自己的业务链(如客服问答链、文档解析链),并结合前端页面构建完整的应用。

相关推荐
倾颜5 小时前
我是怎么把单 Tool Calling 升级成多 Tool Runtime 的
前端·后端·langchain
张正业6 小时前
LangChain v1 Agent 执行流程源码解析
langchain
羑悻的小杀马特7 小时前
深入 LangChain示例选择器核心:详解 Length、Similarity、MMR 与 Ngram 示例选择策略
langchain·示例选择器
qq_5470261798 小时前
LangChain 输出解析器(OutputParser)
langchain
JaydenAI8 小时前
[RAG在LangChain中的实现]根据数据格式选择文档加载器和文本分割器
python·langchain·ai编程
java资料站1 天前
LangChain 中文入门教程
langchain
QWsin1 天前
【LangGraph Server】 LangGraph Server是什么?
人工智能·langchain·langgraph·langsmith
米小虾1 天前
从对话到行动:AI Agent 架构演进与工程实践指南
人工智能·langchain·agent
Csvn1 天前
🌟 LangChain 30 天保姆级教程 · Day 4|用 LLMChain 把 Prompt 和 LLM 打包成可复用组件!
langchain