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

我们现在已经可以简单地写一个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 查看自动生成的交互式文档:

使用

我们使用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程序的服务部署就完成了。当然实际项目中可能还需要一些细化的地方,这里试试探究整个核心流程。

源码

github

相关推荐
renhongxia12 小时前
面向开放世界的具身智能泛化能力探索
人工智能·深度学习·机器学习·架构·transformer
安全渗透Hacker2 小时前
安全使用OpenClaw:从官方威胁模型出发,全面规避AI智能体风险
人工智能·安全·ai·安全威胁分析
卢_猫之使徒2 小时前
如何写一个SKill
人工智能
RuiBo_Qiu2 小时前
【LLM基础】5.prompt & context engineering
人工智能·机器学习·prompt·ai-native
San30.2 小时前
手写 Mini Cursor:基于 Node.js 与 LangChain 的开发实战
人工智能·langchain·node.js·agent
Keep_Trying_Go2 小时前
基于stable diffusion图像生成的小小demo应用(pytorch)
人工智能·stable diffusion
梨儿超2 小时前
AI 写代码靠谱吗?7 轮 QA 告诉你真相
ai编程
CIO402 小时前
AI未来--AI时代40岁IT人方向
人工智能
飞Link2 小时前
进阶时序建模:门控递归单元 (GRU) 深度解析与实战
开发语言·人工智能·rnn·深度学习·gru