AutoGen
一、方案整体架构
![架构图示意]
用户层 → 接入层(WebSocket/HTTP) → 核心层(多智能体协作) → 数据层(MongoDB/Redis/RAG)
- 核心目标:通过多智能体分工,实现“用户需求解析→房源数据库查询→结果整理→实时推送”全流程自动化,支持流式回答和会话记忆。
- 技术栈:AutoGen(多智能体)、LangChain(RAG/工具链)、Redis(会话记忆)、MongoDB(房源数据库)、FastAPI(接口层)、WebSocket(实时推送)。
二、核心组件设计
1. 接入层:用户交互与实时通信
- HTTP 接口:处理用户初始请求(如“找上海浦东的两居室”),初始化会话。
- WebSocket 服务:基于 FastAPI 的
websockets模块,建立长连接,用于:- 向用户推送流式回答(智能体思考过程+分段结果);
- 实时推送符合条件的房源详情(当数据库查询返回结果后)。
- 会话管理:每个用户会话分配唯一
session_id,关联 Redis 记忆和智能体上下文。
2. 多智能体设计(AutoGen 核心)
设计 5 个智能体分工协作,通过 GroupChatManager 协调对话:
| 智能体角色 | 核心职责 | 依赖工具/模块 |
|---|---|---|
| 用户交互智能体 | 接收用户输入,引导补充需求(如预算、通勤范围),生成自然语言回复 | Redis 会话记忆、LangChain 意图识别 |
| 需求解析智能体 | 将用户自然语言需求转为结构化查询条件(如 {"area":"浦东","rooms":2,"price":8000}) |
LangChain 实体提取(地址/价格识别) |
| 数据库查询智能体 | 调用 MongoDB 接口执行房源查询,处理查询结果(过滤/排序) | LangChain MongoDB 工具、查询模板 |
| 结果整理智能体 | 将数据库返回的房源数据转为用户友好的自然语言描述(如“房源A:浦东张江,2室1厅,7500元/月”) | 格式化模板、RAG 补充小区信息 |
| 推送协调智能体 | 监控数据库查询结果,触发 WebSocket 推送符合条件的房源(支持批量/单条推送) | WebSocket 客户端工具、结果过滤规则 |
| 趋势分析智能体?? | 判断用户需求是否已改变,(保留搜索条件) |
3. 记忆模块:基于 Redis 的会话持久化
- 短期记忆:AutoGen 对话历史(
messages列表)存储于 Redis,session_id作为键,格式为:python # Redis 存储结构 { "session:123": { "history": [ {"role": "user", "content": "找浦东两居室"}, {"role": "用户交互智能体", "content": "请问预算多少?"} ], "status": "active", # 会话状态:active/closed "query_conditions": {} # 已解析的查询条件(动态更新) } } - 长期记忆:用户历史偏好(如“优先近地铁”)通过 LangChain 的
RedisChatMessageHistory持久化,供后续会话复用。 - 记忆截断策略:使用 LangChain 的
ConversationSummaryMemory定期压缩历史,避免超出 LLM 上下文窗口。
4. 数据层:MongoDB + RAG 知识库
- MongoDB 房源库:存储结构化房源数据,示例文档:
json { "_id": "ObjectId(...)", "title": "张江汤臣豪园 2室1厅", "area": "浦东", "sub_area": "张江", "rooms": 2, "price": 7500, "distance_to_subway": 800, # 距地铁米数 "facilities": ["家具齐全", "允许养宠"], "update_time": "2025-11-16T08:00:00Z" } - RAG 知识库:基于向量数据库(如 Pinecone)存储非结构化信息:
- 小区周边配套(如“张江汤臣豪园附近有张江实验小学”);
- 租房政策(如“浦东租房押金不得超过月租金2倍”);
- 由 LangChain 的
VectorstoreIndexCreator构建索引,供智能体查询补充房源描述。
5. 工具链:LangChain 整合外部能力
通过 AutoGen 的 function_call 机制注册工具,供智能体调用:
- MongoDB 查询工具:封装 pymongo 接口,支持按条件查询房源:
python
def query_housing(conditions: dict) -> list:
"""查询符合条件的房源"""
return list(mongo_db.housing.find(conditions).limit(10))
- WebSocket 推送工具:触发房源实时推送:
python
def push_to_user(session_id: str, data: dict):
"""通过WebSocket向用户推送数据"""
websocket_manager.broadcast(session_id, json.dumps(data))
- RAG 检索工具:调用向量库补充房源信息:
python
def rag_retrieve(query: str) -> str:
"""从知识库检索相关信息"""
return vector_db.similarity_search(query, k=3)[0].page_content
三、核心流程:用户找房全链路
以“用户找上海浦东两居室,预算8000元内”为例,流程如下:
1. 会话初始化
- 用户通过前端输入需求,HTTP 接口生成
session_id,初始化 Redis 会话记录。 - AutoGen 启动
GroupChat,加载 5 个智能体和GroupChatManager。
2. 需求解析与条件补全
- 用户交互智能体:接收需求,发现缺少“预算”“通勤要求”,通过 WebSocket 流式推送思考过程:
(思考中)用户说要找浦东两居室,但没说预算和通勤需求,需要追问... (回复)请问您的月租预算大概是多少?是否需要靠近地铁站呢? - 用户补充“预算8000元内,步行10分钟到地铁”后,需求解析智能体 调用 LangChain 实体提取工具,生成结构化条件:
python { "area": "浦东", "rooms": 2, "price": {"$lte": 8000}, "distance_to_subway": {"$lte": 800} # 10分钟步行≈800米 }结果存入 Redis 的query_conditions字段。
3. 数据库查询与结果处理
- 数据库查询智能体 读取 Redis 中的查询条件,调用
query_housing工具查询 MongoDB,返回 5 条符合条件的房源。 - 结果整理智能体 接收房源数据,调用 RAG 工具补充小区信息(如“该小区距离张江高科地铁站700米,周边有24小时便利店”),生成自然语言描述:
为您找到5套符合条件的房源: 1. 张江汤臣豪园 2室1厅,7500元/月,步行8分钟到2号线张江高科站,允许养宠...
4. 流式回答与实时推送
- 用户交互智能体 将整理结果通过 WebSocket 流式返回(逐句推送),同时展示思考过程:
(思考中)现在需要把5套房源按价格从低到高排序,重点突出通勤和设施... (回复)为您找到5套符合条件的房源: 1. 张江汤臣豪园 2室1厅,7500元/月... - 推送协调智能体 触发
push_to_user工具,将房源结构化数据(含图片URL、联系方式)通过 WebSocket 推送给前端,前端实时渲染房源列表。
5. 会话结束与记忆持久化
- 用户确认“已找到合适房源”后,智能体触发终止条件,对话结束。
- Redis 会话状态更新为
closed,用户偏好(如“浦东、8000预算”)存入长期记忆,供下次会话复用。
四、技术实现关键点
1. AutoGen 智能体协作配置
from autogen import AssistantAgent, GroupChat, GroupChatManager
from tools import query_housing, push_to_user, rag_retrieve
# 定义智能体
user_agent = AssistantAgent(
name="用户交互智能体",
system_message="负责与用户对话,引导补充需求,生成自然回复",
llm_config={"model": "gpt-4"},
function_map={"rag_retrieve": rag_retrieve} # 绑定RAG工具
)
db_agent = AssistantAgent(
name="数据库查询智能体",
system_message="调用数据库查询房源,处理返回结果",
llm_config={"model": "gpt-4"},
function_map={"query_housing": query_housing}
)
# 其他智能体配置...
# 群聊管理
groupchat = GroupChat(agents=[user_agent, parse_agent, db_agent, arrange_agent, push_agent], messages=[], max_round=20)
manager = GroupChatManager(groupchat=groupchat, llm_config={"model": "gpt-4"})
2. Redis 会话记忆集成
from langchain.memory import RedisChatMessageHistory
# 初始化会话记忆
def init_memory(session_id: str):
history = RedisChatMessageHistory(
session_id=session_id,
redis_url="redis://localhost:6379/0"
)
# 绑定到AutoGen智能体
user_agent.memory = history
return history
3. 流式回答与 WebSocket 推送
- FastAPI 后端: ```python from fastapi import FastAPI, WebSocket from fastapi.responses import StreamingResponse
app = FastAPI() websocket_manager = WebSocketManager() # 自定义WebSocket连接管理器
@app.websocket("/ws/{session_id}") async def websocket_endpoint(websocket: WebSocket, session_id: str): await websocket_manager.connect(session_id, websocket) while True: data = await websocket.receive_text() # 接收用户输入 # 触发智能体处理 response = await manager.run_async(user_agent, data) # 流式推送思考过程和结果 for chunk in response["stream"]: await websocket_manager.send(session_id, chunk) ``` - 前端处理:通过 WebSocket 监听消息,实时更新 UI(思考过程用灰色小字,结果用黑色大字,房源列表单独渲染)。
4. RAG 知识库构建
from langchain.document_loaders import DirectoryLoader
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Pinecone
# 加载小区信息文档
loader = DirectoryLoader('housing_kb/', glob="*.txt")
docs = loader.load()
# 构建向量库
embeddings = OpenAIEmbeddings()
vector_db = Pinecone.from_documents(docs, embeddings, index_name="housing-index")
以下是基于 NestJS 实现智能找房系统的任务清单,替换原方案中的 FastAPI 并保持核心架构(AutoGen + LangChain + Redis + MongoDB + RAG + WebSocket)不变。清单按开发阶段划分,包含任务功能、完成标准及工时预估(按“人天”计算,1人天=8小时)。
一、当前已完成的任务
| 任务名称 | 功能描述 | 完成标准 |
|---|---|---|
| 技术栈配置 | NestJS 项目骨架,集成 TypeScript、ESLint、Prettier;配置依赖管理(package.json),引入核心库(autogen、langchain、redis、mongodb、ws等)。 | 1. 项目可正常启动(nest start 无报错);2. 依赖版本兼容,无冲突; 3. 代码规范配置生效(提交代码自动格式化)。 |
| 数据库 | 部署 MongoDB(apartment+unit) Redis(用于会话记忆?)+ 配置持久化策略。 |
1. MongoDB 可通过 Mongoose 连接,插入/查询房源数据成功; 2. Redis 可通过 ioredis 连接,测试 set/get 操作成功;3. 数据库连接配置存入 NestJS 环境变量(.env)。 |
| RAG 知识库 | 准备房源辅助文档(公寓配套、政策法规、周边环境等),使用 LangChain 加载文档并生成向量;部署向量数据库(如 qdrant),构建索引。 | 1. 向量库初始化完成,可通过 LangChain 进行相似性检索(如查询“张江小区配套”返回相关文档); 2. 向量生成逻辑封装为可复用服务。 |
| NER解析 | 将用户需求准确转换为搜索条件 | api_test已定义的场景测试通过 > 85% |
| 依赖模块 | 用户模块,公寓/单元模块,问卷模块 | 用户/公寓/单元 增删改查接口 |
二、核心模块开发(总计:12天)
2.1 会话管理模块(用户会话与记忆)
| 任务名称 | 功能描述 | 完成标准 | 工时预估 |
|---|---|---|---|
| 会话实体与 Redis 存储 | 定义 Session 实体(含 sessionId、history、queryConditions、status 等字段);封装 Redis 操作服务(创建、查询、更新、删除会话)。 |
1. 会话可通过 sessionId 唯一标识,支持创建新会话和加载历史会话;2. Redis 存储格式正确(历史消息数组、查询条件JSON); 3. 提供 SessionService 供其他模块调用。 |
2人天 |
| 记忆截断与摘要服务 | 基于 LangChain 的 ConversationSummaryMemory 实现对话历史压缩;当会话历史过长时,自动生成摘要并保留关键信息(如预算、区域)。 |
1. 当对话轮次超过10轮,自动触发摘要生成; 2. 摘要包含用户核心需求,无关键信息丢失; 3. 摘要与最新消息拼接后不超过 LLM 上下文限制(如8k tokens)。 |
1人天 |
2.2 多智能体模块(AutoGen 集成)
| 任务名称 | 功能描述 | 完成标准 | 工时预估 |
|---|---|---|---|
| 智能体定义与配置 | 基于 AutoGen 定义5个智能体(用户交互、需求解析、数据库查询、结果整理、推送协调),配置角色指令(systemMessage)、LLM 模型(如 GPT-4)及工具映射。 | 1. 每个智能体角色明确,调用 LLM 无报错; 2. 智能体可通过 GroupChatManager 协调,支持群聊模式;3. 智能体配置可通过环境变量动态调整(如切换模型)。 |
2人天 |
| 工具链集成(LangChain + 自定义工具) | 封装工具函数:MongoDB 房源查询、WebSocket 推送、RAG 检索;通过 AutoGen 的 functionMap 绑定工具,支持智能体自动调用。 |
1. 工具调用格式符合 AutoGen 规范(JSON Schema); 2. 智能体可根据任务自动选择工具(如需求解析后调用数据库查询); 3. 工具返回结果可被智能体解析并用于后续对话。 |
2人天 |
2.3 实时通信模块(WebSocket)
| 任务名称 | 功能描述 | 完成标准 | 工时预估 |
|---|---|---|---|
| WebSocket 服务器与连接管理 | 使用 NestJS 的 @nestjs/websockets 模块搭建 WebSocket 服务;实现连接建立/关闭、消息接收/发送,通过 sessionId 管理用户连接。 |
1. 客户端可通过 ws://localhost:3031/ws/{sessionId} 建立连接;2. 服务端可向指定 sessionId 推送消息(如流式回答、房源数据);3. 连接异常断开时自动清理资源。 |
1人天 |
| 流式回答与房源推送 | 实现流式消息发送(逐句推送智能体思考过程和结果);封装房源推送格式(含标题、价格、距离等字段),支持批量/单条推送。 | 1. 流式消息在客户端按顺序展示,无乱序; 2. 房源数据推送后,客户端可解析并渲染列表; 3. 推送性能:10条房源数据推送耗时 < 1秒。 |
1人天 |
2.4 业务流程整合与接口开发(总计:5人天)
| 任务名称 | 功能描述 | 完成标准 | 工时预估 |
|---|---|---|---|
| 会话初始化接口 | 开发 HTTP POST 接口(/api/sessions),用于创建新会话,返回 sessionId 和 WebSocket 连接地址。 |
1. 调用接口后,Redis 中生成新会话记录; 2. 接口返回格式: { sessionId: string, wsUrl: string };3. 支持并发请求(100 QPS 无报错)。 |
1人天 |
| 智能体协作流程串联 | 实现“用户输入→智能体处理→结果推送”全流程:接收 WebSocket 消息后,触发 AutoGen 群聊逻辑,按角色分工处理,最终通过 WebSocket 返回结果。 | 1. 端到端流程通畅:用户发送“找浦东两居室”→ 智能体条件追问→ 用户补充预算→ 查询房源→ 推送结果; 2. 各智能体按职责协作,无越权或遗漏步骤; 3. 单轮交互响应时间 < 3秒。 |
2人天 |
SOP
宗旨: 1. 清晰理解用户话语,基于自身业务回答用户问题,不能出现“抱歉,我不太明白”等输出 2. 推送符合用户要求的房源
较难实现(可放后面,先实现流程): - 多位置查询 - 多边形查询 - 通勤时间查询 - 实体重合情况 - 方言/英文 - 换一批房源:标准? - 图片与文字的统一性 - 找房场景的覆盖情况
人性化问题: - 公寓住女生和男生的区别 - 自我介绍(业务内容涵盖哪些方面,业务支持情况) - 家电齐全的标准 - 拎包入住的标准
# AutoGen 多智能体标准工作流定义
## 一、场景与目标
- **业务场景**:智能找房服务(用户输入租房需求→智能体协作匹配房源→生成推荐结果并实时推送)
- **核心目标**:通过多智能体分工,将用户自然语言需求转化为结构化房源查询,完成数据库检索、结果整理及实时推送,确保流程无遗漏、响应高效。
## 二、智能体角色与职责
请严格按照以下角色定义执行任务,不越权、不重复处理:
1. **用户交互智能体(UserAgent)**
- 唯一接口:接收用户原始输入(如“找上海浦东2居室,预算8000元”),通过多轮对话补充缺失信息(如通勤要求、房型细节)。
- 输出物:整理后的用户需求文本(需包含核心条件:区域、价格、房型、特殊要求)。
- 禁止:直接调用数据库或生成房源推荐。
2. **需求解析智能体(NerAgent)**
- 输入:用户交互智能体输出的需求文本。
- 职责:将自然语言需求转化为结构化查询条件(JSON格式),包含字段:`area`(区域)、`price`(价格范围)、`rooms`(房型)、`subway_distance`(通勤距离)、`facilities`(配套要求)等。
- 输出物:结构化查询条件(示例:`{"area":"浦东","price":{"$lte":8000},"rooms":2,"subway_distance":{"$lte":800}}`)。
- 校验:若解析结果缺失关键字段(如价格),需返回用户交互智能体重新确认。
3. **数据库查询智能体(DBAgent)**
- 输入:需求解析智能体输出的结构化查询条件。
- 职责:调用 MongoDB 工具执行房源查询,返回符合条件的房源列表(最多10条,按价格升序排序)。
- 输出物:原始房源数据(含标题、价格、地址、配套、距离地铁等字段)。
- 异常处理:若查询结果为空,返回“无匹配房源”提示,终止流程。
4. **结果整理智能体(FormatterAgent)**
- 输入:数据库查询智能体返回的原始房源数据。
- 职责:
- 调用 RAG 工具补充房源周边信息(如小区配套、学区资源);
- 将数据转化为用户友好的自然语言描述(分条列出,突出价格、通勤、核心优势)。
- 输出物:格式化推荐文本(示例:“1. 张江汤臣豪园 2室1厅:7500元/月,步行8分钟到2号线,允许养宠,周边有张江实验小学”)。
5. **推送协调智能体(PusherAgent)**
- 输入:结果整理智能体的推荐文本 + 引导语(xx房源数据)。
- 职责:
- 通过 WebSocket 工具向用户流式推送推荐文本(先推送思考过程,再分条推送结果);
- 提取原始房源中的结构化数据(如图片URL、联系方式),通过 WebSocket 单独推送(供前端渲染列表)。
- 输出物:推送完成确认(含成功推送的房源数量)+ 调用socket推送房源卡片。
## 三、工作流步骤(严格按顺序执行)
1. **启动阶段**:用户发送初始需求后,用户交互智能体自动激活,其他智能体待命。
2. **需求收集**:用户交互智能体通过多轮对话完善需求,确认所有关键条件后,将需求文本传递给需求解析智能体。
3. **需求解析**:需求解析智能体生成结构化查询条件,若校验通过,传递给数据库查询智能体;否则返回用户交互智能体。
4. **房源查询**:数据库查询智能体执行查询,返回结果给结果整理智能体;若结果为空,直接通知用户交互智能体终止流程。
5. **结果处理**:结果整理智能体补充信息并格式化,将文本和原始数据同步传递给推送协调智能体。
6. **实时推送**:推送协调智能体完成流式回答和房源数据推送,向所有智能体广播“任务完成”。
7. **终止条件**:满足以下任一条件时流程终止:
- 推送协调智能体返回“推送完成”;
- 数据库查询智能体返回“无匹配房源”;
- 用户明确输入“结束”或会话超时(30分钟无交互)。
## 四、交互规则
1. **消息传递**:智能体间仅传递当前步骤的输出物(如用户交互智能体→需求解析智能体,仅传递需求文本),不附带无关历史。
2. **发言顺序**:严格按工作流步骤轮次发言,非当前步骤的智能体不得主动插话(如数据库查询阶段,结果整理智能体需等待输入,不得提前行动)。
3. **异常处理**:
- 若工具调用失败(如数据库连接超时),当前智能体需重试2次,仍失败则通知用户交互智能体,由其告知用户“暂时无法处理,请稍后重试”。
- 若收到无法理解的输入(如用户发送乱码),用户交互智能体需提示“请输入清晰的租房需求(如区域、价格、房型)”。
## 五、工具调用规范
1. **工具权限**:仅数据库查询智能体可调用 `query_housing` 工具,仅推送协调智能体可调用 `websocket_push` 工具,仅结果整理智能体可调用 `rag_retrieve` 工具,其他智能体禁止调用。
2. **调用格式**:工具调用必须使用 AutoGen 函数调用格式(JSON Schema),示例:
```json
{"name":"query_housing","parameters":{"conditions":{"area":"浦东","price":{"$lte":8000}}}}
- 结果处理:工具返回结果后,调用方需验证格式(如房源数据是否包含
price字段),无效结果需重新调用工具。
六、输出要求
- 流式回答:推送协调智能体需先推送思考过程(如“正在整理符合条件的房源,优先为您推荐价格较低的选项...”),再分条推送结果(每条1个房源)。
- 日志记录:每个智能体完成自身步骤后,需在消息末尾附加日志标签(如
[UserAgent 完成需求收集][DBAgent 完成查询,返回5条结果]),便于流程追踪。
请所有智能体严格遵循以上工作流,确保协作高效、结果准确。若出现工作流未覆盖的异常场景,由用户交互智能体主导,询问用户进一步指令。 ```
Page Source