AG2多智能体协议与FastAPI服务架构实战

📅 2026/7/15 1:14:55
AG2多智能体协议与FastAPI服务架构实战
1. 项目概述为什么用 AG2 FastAPI 搭建多智能体系统不是“炫技”而是解决真实问题的务实选择我从 2021 年开始做企业级 AI 应用落地经手过客服工单自动分派、保险理赔材料结构化提取、供应链异常协同诊断等十几个生产环境项目。早期我们试过纯 LLM 链式调用Chain-of-Thought、LangChain 的 AgentExecutor、甚至自研状态机调度器——结果都卡在同一个地方当任务需要跨角色协作、动态角色切换、带上下文约束的决策接力时系统要么逻辑爆炸难以维护要么响应延迟高到无法接受要么人在关键节点必须手动介入打断流程。直到去年底看到 AG2 的开源代码和论文我立刻在内部测试环境搭了个最小闭环让“技术文档解析员”、“合规风险扫描员”、“客户话术改写员”三个角色在一次 API 请求中完成对一份 SaaS 服务协议的联合分析——整个过程耗时 3.8 秒准确率比单 agent 提升 42%且全程无需人工插手。这让我确信AG2 不是又一个玩具框架而是为真实业务流中的多角色协同量身定制的通信协议层。它把“谁该在什么时候说什么话、基于什么上下文、向谁说、期待什么反馈”这些隐性规则变成了可声明、可调试、可审计的显式结构。而 FastAPI 则是把它从实验室推向产线的最短路径——它的依赖注入机制天然适配 AG2 的 agent 生命周期管理异步支持让多 agent 并行推理不阻塞主线程OpenAPI 自动生成则省去了 70% 的 API 文档和前端联调时间。这篇文章要讲的不是怎么“跑通 demo”而是如何用 AG2 定义清晰的角色契约、用 FastAPI 构建健壮的服务边界、用真实业务场景比如你马上会看到的“智能会议纪要生成与行动项分发”验证这套组合拳的工程价值。如果你正在被“单个大模型包打天下”的幻觉拖累或者正为“多个小模型各自为政”的混乱头疼这篇就是为你写的实操手册。2. 核心设计思路拆解AG2 的“对话即协议”哲学与 FastAPI 的“服务即接口”思维如何严丝合缝2.1 AG2 的本质不是“多 agent 框架”而是“角色间通信协议栈”很多开发者第一次接触 AG2 时会下意识把它和 LangChain 的 MultiAgentExecutor 对比这是个危险的起点。LangChain 的设计哲学是“把 agent 当作函数来编排”而 AG2 的核心突破在于它把 agent 之间的交互抽象成一套带状态的、可追溯的、有明确角色语义的对话协议。你可以把它理解成 HTTP 协议之于 Web 服务——HTTP 不关心你后端是 Python 还是 Go只规定了请求方法GET/POST、状态码200/404、头信息Content-Type这些契约AG2 同理它不关心你每个 agent 用的是 Llama3 还是 Qwen只强制约定三件事角色身份Role、消息意图Intent、上下文锚点Context Anchor。角色身份Role不是简单的字符串标签而是包含能力描述、知识边界、输出格式约束的 JSON Schema。比如meeting_summarizer角色必须声明output_schema: {summary: string, action_items: [{owner: string, task: string, deadline: date}]}。AG2 运行时会校验每个 agent 的输出是否符合其 Role 声明不符合就触发重试或降级而不是让错误数据污染下游。消息意图IntentAG2 要求每条消息必须携带intent: request_summary | validate_compliance | assign_task等语义化标签。这直接解决了传统多 agent 系统里最头疼的“消息歧义”问题——当compliance_checker收到一条含糊的“检查一下这个”消息时它不知道该查法律条款还是查公司 SOP而 AG2 强制要求发送方明确intent: check_sop_compliance接收方就能精准匹配自己的处理逻辑。上下文锚点Context Anchor这是 AG2 区别于其他框架的杀手级特性。它允许你在消息中嵌入指向原始输入片段的指针比如context_anchor: {source_id: meeting_transcript_001, start_char: 1245, end_char: 1892}。这意味着action_item_extractoragent 在生成“跟进客户反馈”这条待办时能直接关联到会议录音中张经理说“用户抱怨响应慢”的那 3.2 秒音频片段后续人工复核时点击链接就能跳转回原始上下文。我们在某银行风控项目中用这个特性把人工复核效率提升了 65%。提示AG2 的协议栈思想意味着你不需要把所有逻辑塞进一个大模型。比如在“智能会议纪要”场景中transcript_cleaner可以用 Whisper 微调模型专注语音转写纠错summarizer用 Llama3-70B 做摘要action_item_assigner用轻量级 BERT 分类器识别责任人——它们通过 AG2 协议通信互不耦合。这才是工程上可持续的架构。2.2 FastAPI 的选型逻辑为什么不是 Flask、不是 Django、更不是裸写 ASGI选 FastAPI 不是因为它“新”而是因为它在类型安全、异步性能、开发体验三个维度上与 AG2 的运行时需求形成了近乎完美的共振。类型安全即契约保障AG2 的 Role Schema 是 JSON SchemaFastAPI 的 Pydantic Model 也是 JSON Schema。这意味着你可以把 AG2 的MeetingSummarizerRole直接定义为 Pydantic 类FastAPI 的请求体校验、响应体序列化、OpenAPI 文档生成全部自动完成。我们曾用 Flask 实现过类似系统结果在 API 入参校验上写了 200 行 if-else而 FastAPI 用 3 行 Pydantic 代码就搞定且错误提示直接告诉前端“action_items[0].deadline格式错误应为 YYYY-MM-DD”。异步支持直击 AG2 痛点AG2 的核心优势是并行执行多个 agent。如果底层框架是同步的如 Flask 默认那么即使你开了 10 个线程每个 agent 的 LLM 调用仍会阻塞线程等待响应CPU 利用率永远上不去。FastAPI 原生支持async def路由配合httpx.AsyncClient调用 LLM API能让 8 个 agent 在单个事件循环中并发发起请求。实测数据显示在同等硬件下FastAPI 处理 AG2 多 agent 请求的吞吐量是 Flask 的 3.2 倍P95 延迟降低 58%。依赖注入简化 AG2 生命周期管理AG2 的 agent 实例需要共享对话历史、配置参数、缓存连接池。FastAPI 的依赖注入Depends机制让你能把AG2ConversationManager、LLMClientPool这些全局资源声明为依赖路由函数只需声明def process_meeting(conversation_mgr: Annotated[AG2ConversationManager, Depends(get_conversation_mgr)])框架自动注入、自动管理生命周期。这比在 Flask 里用g对象或全局变量安全得多也比手写单例模式清晰得多。注意不要被 FastAPI 的“Fast”二字误导。它的真正价值不在单请求速度而在高并发下的确定性表现。我们在压测中发现当并发数超过 200 时Flask 的 GIL 锁导致部分请求延迟飙升到 15 秒以上而 FastAPI 保持 P95 2.1 秒。这对需要实时响应的客服场景至关重要。2.3 二者结合的架构图不是简单拼接而是协议层与服务层的深度对齐┌─────────────────────────────────────────────────────────────────────────────┐ │ Client (Postman/Web App) │ │ POST /api/v1/meeting-process │ │ { │ │ transcript: 张经理用户反馈...李总监建议下周... , │ │ participants: [zhangbank.com, libank.com] │ │ } │ └─────────────────────────────────────────────────────────────────────────────┘ ↓ HTTP/1.1 ┌─────────────────────────────────────────────────────────────────────────────┐ │ FastAPI Service Layer │ │ • Request validation via Pydantic (checks transcript length, email format) │ │ • Dependency injection: gets AG2ConversationManager, LLM pool, cache client │ │ • Async route handler: calls AG2 engine with validated input │ │ • Response serialization: converts AG2 output to JSON with status codes │ └─────────────────────────────────────────────────────────────────────────────┘ ↓ In-process call ┌─────────────────────────────────────────────────────────────────────────────┐ │ AG2 Engine Layer │ │ • Conversation Manager: maintains state, handles timeouts, retries │ │ • Role Registry: loads MeetingSummarizer, ActionItemAssigner from config │ │ • Message Router: routes intentgenerate_summary → summarizer agent │ │ • Context Anchoring: embeds char positions from original transcript │ │ • Protocol Enforcement: validates output against Role Schema │ └─────────────────────────────────────────────────────────────────────────────┘ ↓ HTTP/1.1 async ┌─────────────────────────────────────────────────────────────────────────────┐ │ External LLM APIs (e.g., Anthropic, OpenAI) │ │ • Summarizer calls claude-3-haiku with system prompt transcript snippet │ │ • Assigner calls openai/gpt-4o-mini with few-shot examples of task parsing │ │ • All calls use connection pooling circuit breaker │ └─────────────────────────────────────────────────────────────────────────────┘这个架构的关键在于FastAPI 负责“服务边界”的一切认证、限流、日志、监控AG2 负责“智能内核”的一切角色调度、协议执行、上下文管理。两者之间没有胶水代码只有干净的函数调用。当你需要替换 LLM 供应商时只改 AG2 层的LLMClient实现当你需要增加 API 认证方式时只改 FastAPI 层的Depends(get_current_user)。这种清晰的分层是我们过去三年踩坑总结出的最可靠模式。3. 实操细节解析从零搭建“智能会议纪要生成与行动项分发”系统3.1 环境准备与依赖安装为什么必须用 Poetry 而不是 pip我们坚持用 Poetry 管理依赖原因很实际AG2 和 FastAPI 的生态里版本冲突是常态。比如pydantic2.0和fastapi0.110.0会打架httpx0.27.0又和某些 LLM SDK 不兼容。Poetry 的pyproject.toml能精确锁定每个包的版本并生成可复现的poetry.lock文件。以下是我们的最小可行配置# pyproject.toml [tool.poetry] name ag2-fastapi-demo version 0.1.0 description Production-ready AG2 FastAPI stack authors [Your Name youcompany.com] [tool.poetry.dependencies] python ^3.11 fastapi ^0.111.0 uvicorn ^0.29.0 ag2 ^0.4.2 # 注意必须用 0.4.2旧版不支持 context anchoring httpx ^0.27.0 pydantic ^2.7.0 jinja2 ^3.1.4 # 用于生成 HTML 报告 redis ^4.6.0 # 用于 AG2 对话状态缓存 [tool.poetry.group.dev.dependencies] pytest ^8.2.0 black ^24.4.2 mypy ^1.10.0 [build-system] requires [poetry-core] build-backend poetry.core.masonry.api安装命令极其简单# 创建虚拟环境并安装 poetry install # 激活环境Poetry 会自动创建 poetry shell # 启动服务后面会详细讲 poetry run uvicorn app.main:app --reload --host 0.0.0.0:8000实操心得第一次部署时我们遇到ag2和pydantic的ValidationError报错折腾了 3 小时。最后发现是 Poetry 缓存了旧版pydantic的 wheel 包。解决方案是poetry cache clear pypi --all清空缓存再poetry install。这个坑建议你提前避开。3.2 AG2 角色定义用 Pydantic Schema 实现“可执行的说明书”AG2 的角色不是写在 README 里的文字描述而是能被代码校验、被 IDE 提示、被测试覆盖的 Pydantic Model。以下是我们为“智能会议纪要”场景定义的三个核心角色全部继承自ag2.Role# ag2_roles.py from pydantic import BaseModel, Field, field_validator from typing import List, Optional, Dict, Any from datetime import date from ag2 import Role class MeetingTranscript(BaseModel): 原始会议转录文本及元数据 text: str Field(..., min_length100, max_length50000) speaker_map: Dict[str, str] Field(default_factorydict) # SPEAKER_00: zhangbank.com duration_seconds: int Field(gt30, le7200) # 30秒到2小时 class SummaryOutput(BaseModel): 摘要输出结构 executive_summary: str Field(..., min_length50, max_length1000) key_decisions: List[str] Field(default_factorylist, max_length20) unresolved_issues: List[str] Field(default_factorylist, max_length10) class ActionItem(BaseModel): 待办事项结构 owner: str Field(..., patternr^[a-zA-Z0-9._%-][a-zA-Z0-9.-]\.[a-zA-Z]{2,}$) task: str Field(..., min_length10, max_length500) deadline: Optional[date] None context_anchor: Dict[str, Any] Field(default_factorydict) # AG2 context anchor class ActionItemsOutput(BaseModel): 待办事项输出结构 action_items: List[ActionItem] Field(default_factorylist, max_length50) # AG2 角色定义 class TranscriptCleanerRole(Role): name transcript_cleaner description 清理会议转录文本中的填充词、重复语句、非人声噪音标记 field_validator(input_schema) def validate_input(cls, v): assert transcript in v, input_schema must contain transcript return v input_schema {transcript: MeetingTranscript} output_schema {cleaned_transcript: str} class MeetingSummarizerRole(Role): name meeting_summarizer description 生成会议摘要突出关键决策和未决问题 input_schema {transcript: str} # 接收 cleaner 的输出 output_schema SummaryOutput.model_json_schema() class ActionItemAssignerRole(Role): name action_item_assigner description 从摘要中提取待办事项分配给参会者并设定截止日期 input_schema { summary: SummaryOutput, participants: List[str] } output_schema ActionItemsOutput.model_json_schema()这段代码的价值在于它既是 AG2 的角色定义又是 FastAPI 的请求/响应模型。当你在 FastAPI 路由中使用SummaryOutput时IDE 能自动提示executive_summary字段当 AG2 运行时校验meeting_summarizer的输出它会用完全相同的 Pydantic 规则做校验。这种一致性消灭了 90% 的“前后端字段不一致”问题。注意context_anchor字段在ActionItem中是Dict[str, Any]因为 AG2 会动态注入具体值如{source_id: meeting_123, start_char: 456, end_char: 789}。你不需要在 Schema 中预定义AG2 会在运行时确保它存在且格式正确。3.3 FastAPI 路由实现如何让 AG2 对话在 API 中“活”起来FastAPI 路由不是简单地把 AG2 的run()方法包一层而是要处理状态管理、错误传播、可观测性这三个生产级必需环节。以下是核心路由代码已通过 200 次压力测试# app/main.py from fastapi import FastAPI, HTTPException, Depends, BackgroundTasks from fastapi.responses import JSONResponse, HTMLResponse from pydantic import BaseModel from typing import Dict, Any, Optional import logging import asyncio from ag2 import AG2Engine, ConversationManager from ag2.conversation import ConversationState from ag2.roles import TranscriptCleanerRole, MeetingSummarizerRole, ActionItemAssignerRole from ag2_roles import MeetingTranscript, SummaryOutput, ActionItemsOutput # 配置日志生产环境必须 logging.basicConfig( levellogging.INFO, format%(asctime)s - %(name)s - %(levelname)s - %(message)s, handlers[logging.StreamHandler()] ) logger logging.getLogger(__name__) # 依赖注入AG2 ConversationManager单例 class AG2Manager: def __init__(self): self.engine AG2Engine( roles[ TranscriptCleanerRole(), MeetingSummarizerRole(), ActionItemAssignerRole() ], # 生产环境必须配置 Redis 缓存对话状态 state_managerConversationManager( cache_urlredis://localhost:6379/0, ttl_seconds3600 # 对话状态缓存1小时 ) ) # 全局实例 ag2_manager AG2Manager() # Pydantic 请求模型 class MeetingProcessRequest(BaseModel): transcript: str participants: list[str] meeting_id: Optional[str] None class MeetingProcessResponse(BaseModel): meeting_id: str summary: SummaryOutput action_items: ActionItemsOutput processing_time_ms: float # 主路由 app FastAPI( titleAG2 Meeting Intelligence API, descriptionGenerate meeting summaries and action items using multi-agent collaboration, version0.1.0, docs_url/docs, redoc_urlNone ) app.post(/api/v1/meeting-process, response_modelMeetingProcessResponse) async def process_meeting( request: MeetingProcessRequest, background_tasks: BackgroundTasks ): 处理会议转录文本生成摘要和待办事项 - 输入原始转录文本、参会者邮箱列表 - 输出结构化摘要、带责任人和截止日的待办事项 - 特性支持上下文锚点失败自动重试状态持久化 start_time asyncio.get_event_loop().time() try: # 1. 输入校验FastAPI 自动完成 if len(request.transcript) 100: raise HTTPException( status_code400, detailTranscript too short (100 chars) ) # 2. 构建 AG2 输入注意这里注入 context anchor 的初始值 ag2_input { transcript: { text: request.transcript, speaker_map: {}, # 实际项目中这里会从语音识别API获取 duration_seconds: 1800 }, participants: request.participants } # 3. 调用 AG2 引擎异步 # AG2Engine.run() 返回的是 Coroutine必须 await result await ag2_manager.engine.run( conversation_idrequest.meeting_id or fmeeting_{int(start_time)}, initial_inputag2_input, # 关键设置超时避免某个 agent 卡死 timeout_seconds30.0, # 关键启用重试网络抖动时自动恢复 max_retries2 ) # 4. AG2 输出结构化AG2 保证 output 符合 Role Schema summary_data result.output.get(summary, {}) action_items_data result.output.get(action_items, {}) # 5. 计算耗时精确到毫秒 end_time asyncio.get_event_loop().time() processing_time_ms round((end_time - start_time) * 1000, 2) # 6. 构建响应FastAPI 自动序列化 Pydantic 模型 response MeetingProcessResponse( meeting_idresult.conversation_id, summarySummaryOutput(**summary_data), action_itemsActionItemsOutput(**action_items_data), processing_time_msprocessing_time_ms ) # 7. 记录成功日志含关键指标 logger.info( fMeeting processed successfully: id{result.conversation_id} ftime{processing_time_ms}ms agents{len(result.steps)} ) return response except asyncio.TimeoutError: logger.error(fAG2 processing timeout for request: {request.meeting_id}) raise HTTPException( status_code504, detailProcessing timeout. Please try again with shorter transcript. ) except Exception as e: logger.error(fAG2 processing error: {str(e)}, exc_infoTrue) raise HTTPException( status_code500, detailfInternal server error: {str(e)} ) # 健康检查端点运维必需 app.get(/health) async def health_check(): return {status: healthy, timestamp: int(asyncio.get_event_loop().time())}这段代码体现了生产级 API 的关键实践超时控制timeout_seconds30.0防止某个 agent 因 LLM API 延迟而拖垮整个请求重试策略max_retries2应对网络抖动但不过度重试避免雪崩结构化日志记录processing_time_ms和agents数量为后续性能优化提供依据错误分类TimeoutError返回 504其他异常返回 500前端可针对性处理。实操心得我们最初没加timeout_seconds结果某次 Anthropic API 临时故障导致所有请求堆积UVicorn 进程内存暴涨到 4GB。加上超时后问题立即解决。记住在分布式系统中“不设超时”等于“埋雷”。3.4 AG2 对话流程编排如何用 YAML 配置文件替代硬编码的“角色剧本”AG2 允许你用 YAML 文件定义 agent 之间的调用顺序和条件分支这比在 Python 代码里写if-elif-else更易维护、更易审计。以下是conversation_flow.yaml的内容# config/conversation_flow.yaml version: 0.4 name: meeting_intelligence_flow description: End-to-end flow for meeting transcript processing # 定义角色参与顺序 stages: - name: clean_transcript role: transcript_cleaner # 输入映射从初始输入取 transcript 字段 input_mapping: transcript: $.initial_input.transcript # 输出映射将 cleaned_transcript 传递给下一步 output_mapping: cleaned_transcript: $.output.cleaned_transcript - name: generate_summary role: meeting_summarizer # 条件分支只有当 cleaned_transcript 长度 500 时才执行 condition: $.stages.clean_transcript.output.cleaned_transcript | length 500 input_mapping: transcript: $.stages.clean_transcript.output.cleaned_transcript output_mapping: summary: $.output - name: assign_action_items role: action_item_assigner # 必须等待前两步都完成 depends_on: [clean_transcript, generate_summary] input_mapping: summary: $.stages.generate_summary.output.summary participants: $.initial_input.participants output_mapping: action_items: $.output.action_items # 全局错误处理 error_handling: # 如果任何 stage 失败尝试降级到备用逻辑 fallback_strategy: skip_and_continue # 记录失败 stage 的详细信息 log_failure_details: true这个 YAML 文件被 AG2 引擎加载后会自动生成一个有向无环图DAG引擎按拓扑序执行每个 stage。关键优势在于可热更新修改 YAML 后无需重启服务AG2 支持运行时重载可审计每次对话的执行路径都会记录在ConversationState中比如{stages: [clean_transcript, generate_summary, assign_action_items]}可测试你可以用pytest直接加载 YAML验证条件表达式是否符合预期。提示YAML 中的condition使用 JMESPath 语法非常强大。比如$.stages.clean_transcript.output.cleaned_transcript | contains(, urgent)可以检测是否需要紧急处理。我们用这个特性实现了“客户投诉自动升级”流程。4. 完整实操流程从代码编写到 Postman 测试的每一步4.1 项目目录结构为什么这样组织能减少 70% 的维护成本一个健康的 AG2FastAPI 项目目录结构必须体现“关注点分离”。以下是经过 3 个生产项目验证的结构ag2-fastapi-demo/ ├── app/ # FastAPI 应用主目录 │ ├── __init__.py │ ├── main.py # 路由定义本节重点 │ ├── dependencies.py # 依赖注入DB, Cache, LLM clients │ └── models.py # Pydantic 模型与 ag2_roles.py 解耦 ├── ag2_roles/ # AG2 角色定义独立模块可复用 │ ├── __init__.py │ ├── base.py # Role 基类和工具函数 │ ├── meeting.py # 会议相关角色本节主角 │ └── customer_support.py # 客服场景角色扩展用 ├── config/ # 配置文件YAML 流程、LLM 参数 │ ├── conversation_flow.yaml │ └── llm_config.yaml ├── tests/ # 测试必须 │ ├── test_ag2_roles.py # 角色 Schema 单元测试 │ ├── test_fastapi.py # API 端到端测试 │ └── test_conversation_flow.py # YAML 流程解析测试 ├── scripts/ # 运维脚本 │ ├── deploy.sh # 一键部署Docker Nginx │ └── load_test.py # Locust 压测脚本 ├── pyproject.toml # Poetry 依赖管理 ├── Dockerfile # 生产镜像多阶段构建 └── README.md # 部署说明含 Postman Collection 链接这个结构的核心价值在于ag2_roles/目录可以作为独立 Python 包发布到公司私有 PyPI被其他 FastAPI、Flask 甚至 Streamlit 项目复用。我们已在 4 个项目中复用meeting.py角色每次只需调整config/conversation_flow.yaml即可适配新需求无需修改一行角色代码。4.2 启动服务与环境配置避开 Docker 和 Redis 的 5 个经典陷阱本地开发启动无 Docker# 1. 确保 Redis 已启动Mac 用户用 brewLinux 用 apt brew services start redis # Mac # 或 sudo systemctl start redis-server # Ubuntu # 2. 启动 FastAPI自动重载适合开发 poetry run uvicorn app.main:app --reload --host 0.0.0.0:8000 --port 8000 # 3. 访问 http://localhost:8000/docs 查看交互式文档生产环境 Docker 启动推荐# Dockerfile FROM python:3.11-slim # 复制依赖文件利用 Docker 缓存 COPY pyproject.toml poetry.lock ./ RUN pip install poetry \ poetry config virtualenvs.create false \ poetry install --no-dev # 复制应用代码 COPY app/ ./app/ COPY ag2_roles/ ./ag2_roles/ COPY config/ ./config/ # 暴露端口 EXPOSE 8000 # 启动命令 CMD [uvicorn, app.main:app, --host, 0.0.0.0:8000, --port, 8000, --workers, 4]# docker-compose.yml生产必备 version: 3.8 services: api: build: . ports: - 8000:8000 environment: - REDIS_URLredis://redis:6379/0 - LLM_API_KEY${LLM_API_KEY} depends_on: - redis restart: unless-stopped redis: image: redis:7-alpine command: redis-server --save 60 1 --loglevel warning volumes: - redis_data:/data restart: unless-stopped volumes: redis_data:常见陷阱排查Redis 连接拒绝Docker 内部服务名是redis不是localhost。REDIS_URLredis://redis:6379/0必须这样写。Poetry 安装缓慢在Dockerfile中添加RUN poetry config virtualenvs.create false禁用虚拟环境加速构建。UVicorn workers 数量--workers 4是经验公式CPU 核心数 * 2 1。4 核机器用 9 个 worker 反而降低性能。LLM API Key 泄露绝对不要写死在代码里用os.getenv(LLM_API_KEY)并通过.env文件或 Kubernetes Secret 注入。日志丢失Docker 默认捕获 stdout/stderr但 FastAPI 的logging需要配置handlers[logging.StreamHandler()]才能输出到容器日志。4.3 Postman 测试全流程不只是“能跑”而是验证“健壮性”Postman 测试不是点几下按钮而是要覆盖正常流、边界流、异常流。以下是我们的标准测试集正常流测试Postman Collection请求POST http://localhost:8000/api/v1/meeting-processHeadersContent-Type: application/jsonBody (raw JSON){ transcript: 张经理用户反馈登录页面响应慢。李总监建议下周二前优化。王工程师我来负责预计周四完成。, participants: [zhangbank.com, libank.com, wangbank.com], meeting_id: meeting_20250828_001 }预期响应HTTP 200summary.executive_summary包含“登录页面响应慢”action_items包含王工程师的任务。边界流测试超长转录发送 45000 字符的 transcript验证max_length50000校验生效空参会者participants: []验证 AG2 的action_item_assigner是否优雅降级不报错返回空 action_items无效邮箱participants: [invalid-email]验证 FastAPI 的pattern校验返回 422。异常流测试模拟 LLM API 故障临时停掉 Anthropic 服务验证 AG2 的max_retries2是否触发以及最终返回 500 还是 504Redis 不可用docker stop redis验证ConversationManager是否 fallback 到内存缓存需在代码中实现恶意输入发送含 SQL 注入字符的 transcript验证 FastAPI 的min_length/max_length是否拦截。实操心得我们用 Postman 的Collection Runner功能一次性运行 50 个测试用例生成 HTML 报告。报告中会清晰显示哪个测试失败、失败原因、响应时间分布。这比手动点 50 次高效太多。4.4 性能压测与调优如何让单台 8 核服务器支撑 200 TPS我们用 Locust 做了 3 轮压测以下是关键数据和调优动作压测轮次并发用户TPSP95 延迟主要瓶颈调优动作第一轮默认100421240msRedis 连接池