1. 项目概述
今天我要分享一个基于LangGraph框架构建的智能代理系统实战项目。这个项目原本是Google Gemini团队提供的快速入门示例,但我对其进行了本地化改造,将API调用替换成了通义千问的接口,使其更适合国内开发者使用。
这个项目的核心在于利用LangGraph框架搭建一个具备自我反思和迭代优化能力的智能代理系统。不同于传统的单次查询-响应模式,这个系统能够在执行任务后自动评估结果质量,发现知识缺口,并主动发起后续查询来完善答案。这种设计模式在复杂问题解决场景中特别有价值,比如市场调研、竞品分析、技术方案评估等需要多轮信息收集和验证的任务。
2. 核心架构解析
2.1 Reflexion范式实现
Reflexion(反思)范式是这个项目最核心的设计理念。简单来说,就是让AI在执行任务后能够"自我反省",评估当前结果的充分性,并决定是否需要进一步行动。
在代码实现上,主要体现在以下几个关键节点:
web_research节点:负责执行实际的网络搜索任务reflection节点:分析搜索结果,判断是否充分(is_sufficient)evaluate_research节点:根据反思结果决定下一步行动 - 要么回到搜索环节补充信息,要么进入最终答案生成
这种设计模式的学术基础来自Shinn等人2023年发表的Reflexion论文。其核心思想是通过语言反馈循环来持续优化代理行为,类似于人类解决问题时的迭代思考过程。
提示:在实际应用中,反思节点的设计需要特别注意评估标准的合理性。过于宽松会导致信息不足,过于严格则可能陷入无限循环。
2.2 虚拟多智能体协作架构
虽然整个系统运行在单个LangGraph实例中,但从逻辑上模拟了多角色协作的工作模式:
| 角色类型 | 对应节点 | 职责 |
|---|---|---|
| 规划者(Planner) | generate_query, reflection | 制定查询策略和分析结果 |
| 执行者(Worker) | web_research | 执行具体的搜索任务 |
| 路由控制器(Router) | evaluate_research | 决定下一步流程走向 |
| 合成器(Synthesizer) | finalize_answer | 生成最终答案 |
这种"单智能体多角色"的设计既保留了多智能体系统的协作优势,又避免了分布式系统带来的复杂性,非常适合中小规模的知识处理任务。
3. 环境准备与部署
3.1 基础环境配置
首先需要准备Python 3.8+的运行环境。推荐使用conda创建独立的虚拟环境:
conda create -n langgraph-demo python=3.9 conda activate langgraph-demo然后安装核心依赖库:
pip install langgraph langchain qianwen-sdk3.2 通义千问API配置
由于项目中将原版的Gemini API替换为了通义千问,需要先获取API密钥:
- 登录阿里云控制台,进入机器学习平台PAI
- 创建API密钥并记录下AccessKey ID和Secret
- 在项目根目录创建
.env文件,添加以下内容:
QIANWEN_ACCESS_KEY=your_access_key QIANWEN_SECRET_KEY=your_secret_key3.3 项目结构解析
下载项目代码后,主要关注以下几个核心文件:
├── config/ # 配置文件目录 │ └── qianwen.yaml # 通义千问API配置 ├── agents/ # 智能体实现 │ └── research_agent.py # 研究型智能体 ├── graphs/ # LangGraph定义 │ └── research_graph.py # 研究流程图 └── main.py # 主入口文件4. 核心代码解析
4.1 研究型智能体实现
在research_agent.py中定义了核心的智能体类:
class ResearchAgent: def __init__(self, llm): self.llm = llm # 通义千问LLM实例 def generate_query(self, state): """生成搜索查询""" prompt = f"""基于以下问题生成搜索查询: 问题:{state['question']} 当前已知信息:{state.get('collected_info', '无')} 请生成3个最相关的搜索关键词""" response = self.llm(prompt) return {"queries": response} def web_research(self, state): """执行网络搜索""" queries = state["queries"] # 实际项目中这里会调用搜索引擎API results = simulate_web_search(queries) return {"web_research_result": results} def reflection(self, state): """反思搜索结果充分性""" prompt = f"""评估以下信息是否足够回答问题: 问题:{state['question']} 搜索结果:{state['web_research_result']} 请判断是否已获得足够信息(是/否),并说明理由""" response = self.llm(prompt) is_sufficient = "是" in response.split()[0] return {"is_sufficient": is_sufficient, "reflection": response}4.2 LangGraph流程定义
research_graph.py中定义了完整的工作流:
from langgraph.graph import Graph def create_research_graph(agent): workflow = Graph() # 定义节点 workflow.add_node("generate_query", agent.generate_query) workflow.add_node("web_research", agent.web_research) workflow.add_node("reflection", agent.reflection) workflow.add_node("finalize_answer", agent.finalize_answer) # 设置入口点 workflow.set_entry_point("generate_query") # 定义边 workflow.add_edge("generate_query", "web_research") workflow.add_edge("web_research", "reflection") # 条件边 def decide_next_step(state): if state["is_sufficient"]: return "finalize_answer" return "generate_query" workflow.add_conditional_edges( "reflection", decide_next_step, {"finalize_answer": "finalize_answer", "generate_query": "generate_query"} ) workflow.add_edge("finalize_answer", END) return workflow.compile()5. 实际应用与优化建议
5.1 典型使用场景
这个框架特别适合以下类型的任务:
- 深度市场调研:自动收集并整合多方信息
- 技术方案评估:多角度验证技术可行性
- 学术文献综述:系统性地搜集相关研究
- 竞品分析:持续跟踪竞争对手动态
5.2 性能优化技巧
- 查询优化:在generate_query节点添加查询去重和相关性过滤
- 结果缓存:对常见问题的搜索结果建立本地缓存
- 并行搜索:对多个查询词同时发起搜索请求
- 反思阈值:设置最大迭代次数避免无限循环
5.3 常见问题排查
问题1:系统陷入无限反思循环
- 检查reflection节点的判断逻辑是否合理
- 添加最大迭代次数限制
- 在state中记录历史查询,避免重复
问题2:搜索结果质量不稳定
- 优化查询生成策略,添加示例few-shot
- 引入多个搜索引擎源交叉验证
- 添加结果可信度评分机制
问题3:API调用超限
- 实现请求速率限制
- 添加指数退避重试机制
- 考虑使用本地模型作为fallback
6. 扩展与进阶
6.1 多数据源集成
除了基本的网络搜索,可以扩展集成:
- 数据库查询
- 企业内部知识库
- 第三方API服务
- 本地文档检索
def retrieve_data(self, state): """多源数据检索""" results = {} for source in ["web", "database", "api"]: if source == "web": results.update(self.web_research(state)) elif source == "database": results.update(self.query_database(state)) # 其他数据源... return {"multi_source_results": results}6.2 可视化监控
添加对工作流执行过程的可视化监控:
- 记录每个节点的执行时间和资源消耗
- 可视化反思决策过程
- 生成执行路径图
class Monitor: def __init__(self): self.logs = [] def log_node_execution(self, node_name, state): entry = { "timestamp": datetime.now(), "node": node_name, "state": state } self.logs.append(entry) def generate_report(self): # 生成可视化报告...6.3 评估指标体系
建立系统的评估体系:
- 答案准确性
- 响应时间
- 资源消耗
- 迭代次数
- 用户满意度
def evaluate_performance(run_id): metrics = { "accuracy": calculate_accuracy(run_id), "latency": get_latency(run_id), "iterations": count_iterations(run_id), "cost": estimate_cost(run_id) } return metrics在实际部署这个系统时,我发现几个关键点值得特别注意。首先是反思节点的设计需要平衡严格度和效率 - 太宽松会导致信息不足,太严格又会大幅增加响应时间。经过多次测试,我发现结合定量指标(如结果数量)和定性评估(LLM判断)的效果最好。
另一个重要经验是关于错误处理。最初的版本没有充分考虑API调用失败的情况,后来添加了自动重试和降级处理机制后,系统稳定性显著提升。建议在production环境中至少实现三级fallback策略。