目前,我们已经能够编写简单的 LangChain 程序,并借助 streamlit 快速搭建原型界面供产品经理使用。但坦白说,Streamlit 本质上只是一个原型验证工具,距离真正生产环境中稳定、可靠的 API 服务,还有相当一段距离。
那么核心问题来了——一个可以运行的原型,如何转化为能被真实应用调用的 API?这恰恰是许多 AI 项目从“能跑”迈向“能用”过程中最关键的一步。
LangServe
概念
LangServe 正是为了解决这一痛点而生:打通 AI 原型到生产服务的“最后一公里”。在 LangChain 中开发的复杂工作流(例如 RAG 系统、多步 Agent),借助 LangServe 几乎无需额外改动即可快速部署为企业级 API 服务。其关键特性包括:一键部署、自动生成文档、类型安全、高性能、流式传输支持、内置 Playground 交互界面,并且完全兼容 FastAPI 生态,具备极强的扩展能力。
安装
pip install langserve
示例
# 创建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访问
标准调用
curl -X 'POST' 'https://localhost:8000/translate/invoke' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"question": "什么是机器学习?"}'
流式调用
curl -X 'POST' 'https://localhost:8000/translate/stream' \
-H 'accept: application/json' \
-H 'Content-Type: application/json' \
-d '{"question": "什么是机器学习?"}'
FastAPI
上面的代码中已经出现了 FastAPI,值得花一些篇幅将其核心概念讲清楚。
概念
FastAPI 是一个用于构建 API 的现代化高性能 Web 框架。其核心设计建立在三大支柱之上:
ASGI 标准:作为 WSGI 的异步演进版本,原生支持异步处理,为高并发能力提供了坚实基础。
类型提示:充分利用 Python 的 Type Hints,只需定义好带有类型注解的 Pydantic 模型,框架即可自动完成数据验证、序列化以及文档生成。
自动 API 文档:基于 OpenAPI 标准,自动生成 Swagger UI 和 ReDoc,从此告别手动维护文档的繁琐工作。
LangServe 选择基于 FastAPI 并非偶然——它继承了 FastAPI 所有现代化的 Web 特性,同时针对 AI 工作流进行了专门优化。FastAPI 本身的表现也极具说服力:性能接近 Node.js 和 Go(归功于 Starlette 和 Pydantic)、开发效率极高(代码自动补全率提升 200%–300%)、人为错误减少约 40%、编辑器支持出色、代码可读性强。
FastAPI vs Streamlit vs Flask
打个比方:Streamlit 像智能家电——开箱即用但定制空间有限;Flask 像万能手工工具箱——灵活但每样都得亲力亲为;FastAPI 则像高度自动化的精密仪器生产车间——目标非常明确:用最少的代码,生产出性能最优、文档最清晰的 API。
| 对比维度 | Flask | Streamlit | FastAPI |
|---|---|---|---|
| 核心设计哲学 | "微内核"框架,追求极致灵活 | "从脚本到应用"框架,追求极速开发 | "现代化API"框架,追求高性能与类型安全 |
| 技术栈/协议 | WSGI, Jinja2, Werkzeug | 自定义反应式引擎 | ASGI, Pydantic, Starlette |
| 特点 | 1. 极度灵活自由;2. 庞大扩展生态;3. 适合全功能网站 | 1. 零前端代码;2. 声明式+反应式;3. 内置可视化组件 | 1. 原生异步支持;2. 自动数据验证和文档;3. 代码即文档 |
| 不足 | 1. 默认同步;2. 大型项目易混乱 | 1. 定制性受限;2. 性能差;3. 状态管理复杂 | 1. 生态较新;2. 不擅长服务端渲染 |
| 应用场景 | 全栈Web应用、高度自定义项目 | 数据科学演示、可视化仪表盘、原型验证 | 高性能API、微服务、实时通信 |
| 心智模型 | "我是导演":控制一切 | "我是编剧":写好剧情,框架负责演出 | "我是产品经理+架构师":定义规范,自动实现 |
| 一句话总结 | 自由的代价是责任 | 最快的样板间建造工具 | 现代化的专业管线系统 |
Uvicorn
Uvicorn 是用于运行 FastAPI 应用的高性能 ASGI 服务器。
安装
pip install fastapi uvicorn
第一个FastAPI应用
准备工作
# 开启调试
set_debug(True)
# 获得访问大模型客户端
client = get_lc_model_client()
# 解析返回结果
parser = StrOutputParser()
# 定义提示模版
prompt_template = ChatPromptTemplate.from_messages([
('system', '请将以下的内容翻译成{language}'),
('human', '{text}')
])
# 以链的形式调用
chain = prompt_template | client | parser
服务部署
# 部署为服务
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)
运行起来
API文档查看
访问以下 URL 即可查看自动生成的交互式文档:
- Swagger UI: https://localhost:8000/docs
- ReDoc: https://localhost:8000/redoc
使用
通过 PostMan 模拟发起一个请求,就能看到接口返回的数据。至此,AI 原型程序已成功部署到服务中——无论是 Web 页面还是移动端,都可以通过接口调用使用对应的 AI 能力。
客户端使用
此外,还可以通过 RemoteRunnable 在 Python 客户端中直接连接并使用该服务:
from langserve import RemoteRunnable
if __name__ == "__main__":
client = RemoteRunnable("https://localhost:8000/lanchainServer")
print(client.invoke({'language': '意大利文', 'text': '我喜欢编程,可是谁又知道我内心是否真的真的喜欢呢?'}))
运行后即可看到翻译结果输出。
至此,一个 LangChain 程序的服务部署流程已全部完成。实际项目中当然还有不少细节需要打磨,但核心路径就是如此——从原型到 API,再通过 API 被各种客户端调用,整个链路就此打通。
源码
GitHub 仓库
