我们现在已经可以简单地写一个Langchain程序,在之前 为PM写一个SQL语句小助手,我们也使用streamlit快速搭建了一个Web应用来让PM使用。但是streamlit毕竟是一个用于demo展示、快速原型验证的python转Web的UI框架,很多地方还是有所受限。
那么我们的Langchain程序怎么才能被用户正常使用呢?按照我们传统编程的经验,诸多App的一些服务究其本质是依赖API请求来达到某些目的。那么这个问题就转化成了,怎么把AI原型转化为企业级API?
LangServe
概念
LangServe正是解决了这样一个非常具体的痛点:AI原型到生产服务的"最后一公里"问题。在LangChain中开发的复杂工作流(如RAG系统、多步Agent),通过LangServe可以几乎零成本地转化为企业级API服务。
- 一键部署:只需一行代码即可将 LangChain 组件转换为完整的 API 服务
- 自动文档:基于 FastAPI 自动生成交互式 API 文档(Swagger UI/ReDoc)
- 类型安全:利用 Pydantic 和类型提示确保 API 输入输出的安全性
- 高性能:基于 FastAPI 和 Uvicorn,支持异步处理和高并发
- 流式支持:原生支持 LLM 的流式输出
- 自动Playground生成:为每个部署的链提供交互式Web测试界面
- 易于扩展:完全兼容 FastAPI 生态系统,可以轻松添加自定义路由和中间件
安装
bash
pip install langserve
示例🌰
ini
# 创建LangChain链
prompt = ChatPromptTemplate.from_template("翻译为{language}: {text}")
model = ChatOpenAI(model="gpt-4")
chain = prompt | model
# 一键部署为API
app = FastAPI(title="翻译服务")
add_routes(app, chain, path="/translate")
API访问
标准调用
bash
curl -X 'POST' \
'http://localhost:8000/translate/invoke' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"question": "什么是机器学习?"
}'
流式调用
bash
curl -X 'POST' \
'http://localhost:8000/translate/stream' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{
"question": "什么是机器学习?"
}'
FastAPI
上述LangServe示例代码,我们看到了FastAPI。那么FastAPI又是个什么东东?

概念
FastAPI是一个用于构建API的现代、高性能Web框架。它的核心建立在三大支柱之上:
-
ASGI标准:是WSGI的异步进化版,让FastAPI天生支持异步请求处理,这是其高并发能力的基石。
-
类型提示 :深度利用Python的Type Hints。你定义带有类型注解的Pydantic模型和函数参数,框架便能据此自动进行请求/响应的数据验证、序列化和生成OpenAPI文档。
-
自动API文档:基于OpenAPI标准,自动生成交互式API文档(Swagger UI和ReDoc),无需手动维护。
LangServe往往基于FastAPI构建,继承了其所有现代Web框架特性,但增加了针对AI工作流的专门优化。之所以选择FastAPI,是因为其本身的特点:
-
快速:性能接近 Node.js 和 Go(得益于 Starlette 和 Pydantic)。
-
高效开发:代码自动补全率提高约 200% - 300%。
-
更少的 bug:减少约 40% 的人为错误。
-
直观:具有出色的编辑器支持,代码可读性强。
-
简单:易于使用和学习,降低开发成本。
-
短:减少代码重复,每个参数声明都有多种用途。
-
健壮:自动生成交互式文档。
-
基于标准:基于 API 的相关开放标准(OpenAPI 和 JSON Schema)。
FastAPI Vs Streamlit Vs Flask
如果说Streamlit(快速专用)是一个智能家电 ,Flask(灵活传统)是一个全能手工工具箱 ,那么FastAPI (兼具现代性、高性能和开发效率)就是一个高度自动化、流水线化的精密仪器生产车间。它的设计目标非常聚焦:用最少的代码,生产出性能最高、文档最清晰的API。

| 对比维度 | Flask | Streamlit | FastAPI |
|---|---|---|---|
| 核心设计哲学 | "微内核"框架。只提供最基础的路由、模板等核心,其他一切通过扩展实现,追求极致的灵活性。 | "从脚本到应用"框架 。将数据脚本自动转换为交互式Web应用,追求从想法到可分享原型的极速开发。 | "现代化API"框架。为构建高性能、类型安全的API而生,深度集成异步支持和自动文档生成。 |
| 技术栈/协议 | WSGI, Jinja2, Werkzeug | 自定义反应式引擎 | ASGI, Pydantic, Starlette |
| 特点 | 1. 极度灵活自由 ,无强制设计模式。 2. 庞大成熟的扩展生态。 3. 适合构建全功能网站(服务端渲染)。 4. 社区资源极其丰富。 | 1. 零前端代码 ,纯Python构建UI。 2. 声明式 + 反应式 ,交互触发脚本重执行,UI自动更新。 3. 内置丰富的数据可视化组件。 4. 开发迭代速度极快。 | 1. 原生高性能异步 支持。 2. 基于Python类型提示,实现自动数据验证、序列化和API文档(Swagger UI)。 3. 开发者体验优秀,代码即文档。 |
| 不足 | 1. 同步默认,高并发需额外配置(异步支持非原生)。 2. 过度自由,在大型项目中若缺乏良好设计,易导致结构混乱。 | 1. 定制性严重受限 ,难以实现复杂、非标准交互。 2. 性能差,不适合高并发生产环境。 3. 应用状态管理模型独特,在复杂逻辑下可能难以驾驭。 | 1. 生态系统较新,某些垂直领域的库不如Flask丰富。 2. 不擅长服务端渲染HTML页面(非设计目标)。 |
| 应用场景 | 1. 传统的全栈Web应用 (如CMS、博客、后台管理)。 2. 需要高度自定义架构 的中大型项目。 3. 作为胶水层集成多种服务的项目。 | 1. 数据科学/机器学习 模型的演示、调试与结果展示。 2. 快速搭建数据可视化仪表盘 和内部数据分析工具 。 3. 构建概念验证或算法交互的原型界面。 | 1. 构建高性能的RESTful/GraphQL API 和微服务 。 2. 需要实时通信 的应用(如WebSocket)。 3. 任何对API文档、类型安全和性能有高要求的后端服务。 |
| 心智模型 | "我是导演" :你需要设计和指挥每一个环节(路由、视图、模型),控制力强,但事必躬亲。 | "我是编剧" :你只需写好主线剧情(数据逻辑),Streamlit负责把它变成"电影"(交互应用),但你不能指导"演员"的细微表情。 | "我是产品经理+架构师" :你清晰定义接口规范(类型提示),框架自动实现可靠的通信层,并生成产品说明书(API文档)。 |
| 一句话总结 | 自由的代价是责任。它给你建造任何房屋(从茅草屋到摩天楼)的自由,但结构安全和施工流程全靠你自己。 | 最快的样板间建造工具。能瞬间把你的设计图(数据脚本)变成可参观的样板间,但你别指望用它盖一栋坚固的、个性化的大楼。 | 现代化的专业管线系统。它不是用来盖房子的,而是用来建造高效、标准、可自动维护的"水电燃气"通信管网。 |
Uvicorn
Uvicorn 是一个高性能的 ASGI 服务器,用于运行FastAPI应用
安装
bash
pip install fastapi uvicorn
第一个FastAPI应用
准备工作
ini
# 开启调试
set_debug(True)
#获得访问大模型客户端
# client = ChatTongyi()
client = get_lc_model_client()
#解析返回结果
parser = StrOutputParser()
#定义提示模版
prompt_template = ChatPromptTemplate.from_messages(
[
#改为 ('system','请将以下的内容翻译成{language}') 也可以
SystemMessagePromptTemplate.from_template("请将以下的内容翻译成{language}"),
# 改为 HumanMessagePromptTemplate.from_template("{text}") 也可以
('human', '{text}')
]
)
# 以链的形式调用
chain = prompt_template | client | parser
服务部署
ini
#部署为服务 部署成web应用的框架
app = FastAPI(title="基于LangChain的服务",version="V1.5",description="翻译服务")
# 函数和访问路径一一对应
add_routes(app, chain,path="/lanchainServer")
if __name__ == "__main__":
import uvicorn
uvicorn.run(app, host="localhost", port=8000)
Run起来

API 文档查看
访问以下 URL 查看自动生成的交互式文档:
- Swagger UI: http://localhost:8000/docs

- ReDoc: http://localhost:8000/redoc

使用
我们使用PostMan模拟发起一个请求,看看接口返回的数据内容。至此,我们这个AI原型程序就成功部署到服务上了,后续无论是Web页面还是移动端都可以通过接口调用使用到对应的AI服务。

客户端使用
我们也可以通过RemoteRunnable在python客户端直连并使用服务。
css
from langserve import RemoteRunnable
if __name__ == "__main__":
client = RemoteRunnable("http://localhost:8000/lanchainServer")
print(client.invoke({'language': '意大利文', 'text': '我喜欢编程,可是谁又知道我内心是否真的真的喜欢呢?'}))
运行后的结果如下:

至此。一个Langchain程序的服务部署就完成了。当然实际项目中可能还需要一些细化的地方,这里试试探究整个核心流程。