用 LangChain 开发的智能体从“本地能跑“到“生产可用“

发布时间:2026/9/24 1:26:36

用 LangChain 开发的智能体从“本地能跑“到“生产可用“ 用 LangChain 开发的智能体从本地能跑到生产可用核心要解决的是服务化、状态持久化、可观测性和成本控制四个问题。下面按实际工程路径给你梳理一套完整的部署方案。一、部署前的必要准备1. 状态持久化最重要开发时你通常把对话历史存在内存里ConversationBufferMemory但生产环境一旦服务重启或扩容记忆就全丢了。上线前必须换成数据库持久化。推荐方案表格场景方案说明单会话短期记忆Redis速度快适合对话缓存TTL 自动过期多实例共享状态Postgres AsyncPostgresCheckpointerLangGraph 原生支持K8s 多副本共享状态长期知识记忆向量数据库Milvus/Pinecone/WeaviateRAG 场景跨会话检索如果你用LangGraph构建的 Agent强烈建议从第一天就接入PostgresCheckpointer这样即使 Pod 重启用户对话也能断点续传。2. 设置硬性边界Agent 最大的生产风险是无限循环和Token 费用失控。上线前必须加这三道保险Python# 1. 最大迭代次数防止死循环 agent_executor AgentExecutor( agentagent, toolstools, max_iterations15, # 超过15轮强制停止 max_execution_time30, # 超过30秒超时 early_stopping_methodgenerate ) # 2. 工具调用重试上限防止费用爆炸 from tenacity import retry, stop_after_attempt, wait_exponential retry(stopstop_after_attempt(3), waitwait_exponential(multiplier1, min4, max10)) def call_external_api(...): ...3. 输出校验Agent 的返回结果不稳定下游如果期待 JSON 却收到一段自然语言整个链路就崩了。用 Pydantic 做结构化输出校验Pythonfrom pydantic import BaseModel, Field class AgentOutput(BaseModel): answer: str Field(description最终回答) sources: list[str] Field(description参考来源) confidence: float Field(description置信度, ge0, le1)二、服务化封装把 Agent 变成 APILangChain 本身不是 Web 框架你需要用FastAPI把它包装成 REST 服务。这是目前业界最主流的做法。最小可用示例Python# api.py from fastapi import FastAPI, HTTPException from fastapi.middleware.cors import CORSMiddleware from fastapi.responses import StreamingResponse from pydantic import BaseModel import uuid import uvicorn app FastAPI(titleLangChain Agent API) # CORS生产环境请限制具体域名 app.add_middleware( CORSMiddleware, allow_origins[*], allow_credentialsTrue, allow_methods[*], allow_headers[*], ) # 预加载核心组件服务启动时一次性加载 from langchain_openai import ChatOpenAI from langgraph.prebuilt import create_react_agent from langgraph.checkpoint.postgres import PostgresSaver import os llm ChatOpenAI(modelgpt-4o, temperature0) tools [...] # 你的工具集 # Postgres 持久化 conn_string os.getenv(POSTGRES_URI) checkpointer PostgresSaver.from_conn_string(conn_string) checkpointer.setup() # 初始化表结构 agent create_react_agent(llm, tools, checkpointercheckpointer) # API 接口 class ChatRequest(BaseModel): message: str session_id: str | None None app.post(/chat) async def chat(req: ChatRequest): session_id req.session_id or str(uuid.uuid4()) config {configurable: {thread_id: session_id}} try: response await agent.ainvoke( {messages: [(human, req.message)]}, configconfig ) return { session_id: session_id, response: response[messages][-1].content } except Exception as e: raise HTTPException(status_code500, detailstr(e)) app.post(/chat/stream) async def chat_stream(req: ChatRequest): 流式输出提升用户体验 session_id req.session_id or str(uuid.uuid4()) config {configurable: {thread_id: session_id}} async def event_generator(): async for chunk in agent.astream( {messages: [(human, req.message)]}, configconfig ): if agent in chunk and messages in chunk[agent]: yield fdata: {chunk[agent][messages][-1].content}\n\n yield data: [DONE]\n\n return StreamingResponse( event_generator(), media_typetext/event-stream ) app.get(/health) async def health(): return {status: ok, agent: ready} if __name__ __main__: uvicorn.run(app, host0.0.0.0, port8000)关键设计点预加载LLM 和 Agent 在启动时初始化不要每次请求都重新创建异步接口用ainvoke/astream而非invoke支持并发会话隔离通过thread_id区分不同用户配合 Postgres Checkpointer 实现有状态对话三、容器化Docker 部署把上面的服务打包成 Docker 镜像这是上云前的标准步骤。dockerfile# Dockerfile FROM python:3.11-slim WORKDIR /app # 安装依赖 COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 复制代码 COPY . . # 非 root 用户运行安全最佳实践 RUN useradd -m -u 1000 appuser chown -R appuser:appuser /app USER appuser EXPOSE 8000 CMD [uvicorn, api:app, --host, 0.0.0.0, --port, 8000, --workers, 4]txt# requirements.txt langchain0.3.0 langgraph0.2.0 langchain-openai0.2.0 fastapi0.115.0 uvicorn[standard]0.32.0 psycopg[binary]3.2.0 redis5.0.0 pydantic2.9.0 python-dotenv1.0.0 tenacity9.0.0构建并运行bashdocker build -t my-langchain-agent . docker run -d \ -p 8000:8000 \ -e OPENAI_API_KEYsk-xxx \ -e POSTGRES_URIpostgresql://user:passhost:5432/db \ my-langchain-agent四、生产部署的几种方式根据你的团队规模和流量选择不同方案方式 1单服务器直接部署适合初创/测试直接用 Docker Compose 在一台云服务器上跑yaml# docker-compose.yml version: 3.8 services: agent: build: . ports: - 8000:8000 environment: - OPENAI_API_KEY${OPENAI_API_KEY} - POSTGRES_URIpostgresql://postgres:postgresdb:5432/agent_db - REDIS_URIredis://redis:6379 depends_on: - db - redis db: image: postgres:15-alpine environment: POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_DB: agent_db volumes: - pgdata:/var/lib/postgresql/data redis: image: redis:7-alpine volumes: - redisdata:/data volumes: pgdata: redisdata:方式 2Kubernetes 部署适合中高流量yaml# k8s-deployment.yaml apiVersion: apps/v1 kind: Deployment metadata: name: langchain-agent spec: replicas: 3 selector: matchLabels: app: langchain-agent template: metadata: labels: app: langchain-agent spec: containers: - name: agent image: your-registry/my-langchain-agent:latest ports: - containerPort: 8000 env: - name: OPENAI_API_KEY valueFrom: secretKeyRef: name: api-secrets key: openai-key - name: POSTGRES_URI valueFrom: secretKeyRef: name: api-secrets key: postgres-uri resources: requests: memory: 1Gi cpu: 500m limits: memory: 2Gi cpu: 1000m --- apiVersion: v1 kind: Service metadata: name: langchain-agent-service spec: selector: app: langchain-agent ports: - port: 80 targetPort: 8000 type: ClusterIP配合HPA自动扩缩容bashkubectl autoscale deployment langchain-agent --cpu-percent70 --min3 --max10方式 3Serverless / 云函数适合低频、突发流量如果你的 Agent 调用量不大用 Serverless 更省钱表格平台方式Vercel前端 Next.js Edge Function 调用 Agent APIAWS Lambda用 Mangum 把 FastAPI 包成 Lambda 函数阿里云函数计算直接部署容器镜像腾讯云云函数类似方案Serverless 的注意事项冷启动时 LLM 初始化慢建议加预置并发状态必须用外部数据库Redis/Postgres不能存内存。方式 4LangGraph Platform官方托管如果你不想自己运维 K8sLangChain 官方提供了LangGraph Platform企业版支持一键部署 LangGraph 应用自带自动扩缩容、监控、断点续传等能力。五、生产环境必须做的五件事1. 可观测性接入 LangSmithAgent 的调试比传统软件难 10 倍——你不知道它为什么调了 3 次工具还没出结果。LangSmith 可以捕获每一次 Agent 的完整执行链路trace包括每次 LLM 调用、工具调用、Token 消耗。Pythonimport os os.environ[LANGCHAIN_TRACING_V2] true os.environ[LANGCHAIN_API_KEY] ls-xxx os.environ[LANGCHAIN_PROJECT] production-agent注意高流量生产环境200 req/day建议关闭 LangSmith 实时追踪或采样上报否则性能开销明显。2. 限流与成本控制Agent 的 Token 费用可能比你想象的高得多。在 API 网关层加限流Python# FastAPI 限流示例 from slowapi import Limiter, _rate_limit_exceeded_handler from slowapi.util import get_remote_address limiter Limiter(key_funcget_remote_address) app.state.limiter limiter app.post(/chat) limiter.limit(10/minute) # 每IP每分钟10次 async def chat(req: ChatRequest, request: Request): ...同时设置预算告警监控单日 Token 消耗超过阈值自动告警。3. 安全加固表格风险防护措施Prompt 注入输入过滤 输出校验用langchain_core.prompts的防御模板PII 泄露日志和 Trace 中脱敏手机号、身份证号正则替换API Key 泄露用 K8s Secret / 阿里云 KMS / AWS Secrets Manager 管理越权调用每个工具内部校验用户权限不要依赖 Agent 自觉4. 评估体系上线前准备一套测试集定期回归Python# 用 LangSmith 做批量评估 from langsmith import Client from langchain.smith import RunEvalConfig client Client() eval_config RunEvalConfig( evaluators[ qa, # 问答正确性 criteria, # 自定义标准 embedding_distance # 语义相似度 ] ) client.run_on_dataset( dataset_nameagent_test_set, llm_or_chain_factorylambda: agent, evaluationeval_config )5. 优雅降级当 LLM API 超时或限流时Agent 不能崩Pythonfrom tenacity import retry, stop_after_attempt, wait_exponential, retry_if_exception_type from openai import RateLimitError retry( retryretry_if_exception_type((RateLimitError, TimeoutError)), stopstop_after_attempt(3), waitwait_exponential(multiplier1, min2, max10) ) def safe_llm_call(...): return llm.invoke(...)六、部署 checklist表格检查项状态□ 状态持久化已接入 Postgres/Redis□max_iterations和max_execution_time已设置□ 输出已用 Pydantic 做结构化校验□ API 已用 FastAPI 封装支持异步和流式□ 已打包 Docker 镜像□ 环境变量/API Key 已用 Secret 管理□ LangSmith 追踪已接入采样模式□ 限流和预算告警已配置□ 测试集评估通过□ 健康检查/health接口已提供总结LangChain Agent 的部署没有银弹但有清晰的演进路径本地开发→ 用内存状态快速迭代测试部署→ Docker 单服务器 Postgres 持久化生产上线→ K8s 多副本 Redis/Postgres LangSmith 监控 限流降级大规模生产→ 考虑 LangGraph Platform 或自建更精细的调度系统核心原则就一条Agent 不是确定性程序而是有行为的系统——你需要的是可观测性、状态持久化和边界控制而不是传统软件的那套监控思维。
延伸阅读

更多相关文章

2026/9/24 17:36:02

高效文件命名与整理:提升数字生产力的核心技巧

1. 从混乱到秩序:为什么文件命名是数字时代的第一生产力 你可能有过这样的经历:在电脑里翻找了十分钟,只为找一个上周刚做好的PPT,文件名是“最终版.pptx”,结果发现文件夹里躺着“最终版_修改版.pptx”、“最终版_最终…

2026/9/24 5:22:14

Linux进程管理:从ps/top命令到系统性能深度排查实战

1. 从“黑盒子”到“透明人”:理解Linux进程的本质如果你刚接触Linux,可能会觉得系统后台像是一个黑盒子,只知道它在运行,却不知道里面具体在忙些什么。而一旦你开始学习ps、top这些命令,就像是获得了一双透视眼&#…

2026/9/21 15:52:10

SAP HANA 2.0 Express Edition 虚拟机环境搭建与配置实战指南

1. 项目概述:为什么选择SAP HANA 2.0 Express Edition 如果你正在寻找一个功能强大、但又不想在初期投入巨额许可费用的内存数据库来学习、开发原型或者搭建小型应用,那么SAP HANA 2.0 SPS (Support Package Stack) Express Edition 几乎是你绕不开的一个…

2026/9/24 22:17:06

Nydus镜像加速实战:容器启动从分钟级降到秒级

我们会遇到一个共同的问题:镜像体积大、层数多,docker pull全量拉下来要几分钟,解压又要等半天,尤其生产环境一扩容,新节点拉镜像的耗时直接被拉满,服务迟迟起不来。Nydus 就是专门解决这个痛点的镜像加速方…

2026/9/24 22:17:06

函数长度与抽象层次:Clean Code 中长函数重构的实战指南

上周给后端组做代码评审时,遇到一个 300 多行的下单函数。写它的同事责任心很强,在函数头顶留了一大段注释,把"为什么不拆"的理由列了四条。我当时没急着表态,把函数从头到尾读了两遍,然后回了一句&#xff…

2026/9/24 22:17:06

Matlab高效计算任意三点夹角的完整指南

很多搞过几年Matlab的人可能都有这种感觉:几何计算本身不难,但真到处理实际数据时,经常被一些“小问题”卡住。比如给你三个点的坐标,让你算以某个点为顶点的夹角,听起来不就是初中数学吗?可真写起代码来&a…

2026/9/24 22:17:06

亚马逊ACOS从62%降至24%的实战优化流程

1. 先把"38分"和"62%"这两个数字拆开看1.1 一场深夜的广告数据复盘那天晚上本来只想看一眼广告后台就睡觉,结果越看越清醒。ACOS 62%,意味着每产生1美元的销售额,有0.62美元烧给了广告平台。广告费比利润还高&#xff0c…

2026/9/24 22:17:06

手写迷你Tomcat:彻底搞懂Servlet容器与HTTP请求处理原理

作为一个写了八年 Java 的开发者,我见过太多人把 Tomcat 当黑匣子用——把 war 包往里一扔,启动脚本一跑,应用起来了就完事。直到有一天线上出现一个诡异的连接问题,排查到最后才发现是对 Tomcat 的线程模型理解有偏差&#xff0c…

2026/9/24 22:12:05

基于TraeCode与RAG构建本地Markdown知识库实战指南

1. 为什么我要用 TraeCode 搭一套自己的 Wiki 知识库先说结论:我折腾个人知识库这件事,前后换过不下五套方案,从最早的纯文件夹加 Markdown,到后来上 Obsidian 双链,再到自己写脚本调 LLM 做摘要,最后稳定下…

2026/9/24 20:24:47

GAMP 5 基于风险的计算机化系统验证:软件分类与审计追踪实践

简介:《A Risk-Based Approach to Compliant GxP Computerized Systems》即业内熟知的GAMP 5指南,面向制药企业质量与IT合规人员、验证工程师及计算机化系统管理者,用于解决GxP法规环境下系统合规性难以科学落地的问题。文档以风险管理为主线…

2026/9/23 12:06:55

安全托管MSSP实战:从静态防御到人机协同的攻防运营与应急响应

简介:这份PPT围绕互联网业务安全托管服务展开,面向企业安全负责人、IT运维人员及关注MSSP/MSS选型的读者,重点回应传统安全过度依赖人工、碎片化静态防御难以对抗产业化攻击等痛点。资源共1个pptx文件,包体约30.63MB,以…

2026/9/24 0:00:21

基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程

简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为…

2026/9/24 0:00:21

单细胞注释实战:基于Scanpy的标记基因与参考映射流程解析

简介:一份基于单细胞RNA测序数据的细胞类型注释算法研究Python毕业设计源码,针对计算机相关专业正在做毕设或需要项目实战的学习者,可用于课程设计与期末大作业。项目代码完整、经导师指导评审通过,可直接运行,覆盖数据…

2026/9/24 0:00:21

C#源生成器实战:用增量生成器替代反射,告别AOT崩溃

第一次在项目里被反射卡住,是在一个老旧的WinForms模块里:几十个类依赖PropertyChanged通知,运行时反射读属性、发通知,每次启动慢半拍不说,一上.NET Native/AOT裁剪模式几乎全面崩盘。后来我把这段逻辑全部改成C#源生…

2026/9/22 16:34:32

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/22 20:01:30

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/22 13:25:41

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
咨询二维码