Langchain入门到精通0x03:Langchain的服务部署

0 阅读8分钟

我们现在已经可以简单地写一个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 生态系统,可以轻松添加自定义路由和中间件

安装

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' \
  'http://localhost:8000/translate/invoke' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "question": "什么是机器学习?"
}'

流式调用

curl -X 'POST' \
  'http://localhost:8000/translate/stream' \
  -H 'accept: application/json' \
  -H 'Content-Type: application/json' \
  -d '{
  "question": "什么是机器学习?"
}'

FastAPI

上述LangServe示例代码,我们看到了FastAPI。那么FastAPI又是个什么东东?

image.png

概念

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。

image.png

对比维度FlaskStreamlitFastAPI
核心设计哲学“微内核”框架。只提供最基础的路由、模板等核心,其他一切通过扩展实现,追求极致的灵活性。“从脚本到应用”框架。将数据脚本自动转换为交互式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应用

安装

pip install fastapi uvicorn

第一个FastAPI应用

准备工作

# 开启调试
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

服务部署

#部署为服务  部署成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起来

image.png

API 文档查看

访问以下 URL 查看自动生成的交互式文档:

image.png

image.png

使用

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

image.png

客户端使用

我们也可以通过RemoteRunnable在python客户端直连并使用服务。

from langserve import RemoteRunnable

if __name__ == "__main__":
    client = RemoteRunnable("http://localhost:8000/lanchainServer")
    print(client.invoke({'language': '意大利文', 'text': '我喜欢编程,可是谁又知道我内心是否真的真的喜欢呢?'}))

运行后的结果如下:

image.png

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

源码

github