基于LangChain构建多智能体协同系统:从需求到代码的AI团队实战 最近在技术圈里关于“AI Agent”智能体的讨论越来越热。很多开发者都体验过单任务的AI助手比如写代码、改Bug但当一个复杂项目需要多个AI角色如产品经理、架构师、程序员、测试员协同工作时如何高效地组织和管理它们就成了新的挑战。这背后涉及的核心技术正是“多智能体协同”。虽然我们无法体验未公开的企业内部产品但“多智能体协同”本身是一个极具潜力的技术方向。本文将从一个开发者的视角手把手带你构建一个简易的“多智能体协同”原型系统。我们将使用主流的Python语言借助LangChain这类成熟框架模拟一个软件需求到代码交付的协同流程。通过这个实战项目你不仅能理解多智能体协同的核心概念还能获得一套可运行、可扩展的代码为你的AI应用开发打开新思路。1. 背景与核心概念什么是多智能体协同在深入代码之前我们有必要厘清几个关键概念。智能体Agent是什么在AI语境下一个智能体可以理解为一个具备感知、决策和执行能力的自治程序。它通常由以下几部分组成核心大脑LLM一个大语言模型负责理解和生成语言进行推理。工具Tools智能体可以调用的外部能力比如执行代码、搜索网络、查询数据库。记忆Memory用于存储对话历史或任务上下文使智能体具备连续对话的能力。执行逻辑Orchestration决定何时思考、何时调用工具、如何解析结果的逻辑流程。多智能体协同Multi-Agent Collaboration则是指多个这样的智能体为了完成一个共同的目标通过通信、协商、分工等方式进行合作。这模拟了人类团队的工作模式每个智能体扮演特定角色发挥其专长。为什么需要多智能体协同突破单一模型的能力上限一个模型可能不擅长所有事。让擅长规划的智能体做设计让擅长代码的智能体做实现效果更佳。分解复杂任务将“开发一个网站”这样的宏大任务分解为“产品设计”、“技术选型”、“前端开发”、“后端开发”、“测试”等子任务分派给不同智能体。减少幻觉与错误通过智能体间的相互校验和讨论如代码审查可以提高最终输出的准确性和可靠性。接下来我们将搭建一个模拟“微型软件项目交付”的多智能体系统。2. 环境准备与版本说明本项目基于Python实现使用LangChain作为智能体编排框架。LangChain提供了构建智能体所需的核心抽象和工具能极大简化开发流程。环境要求操作系统Windows 10/11, macOS, 或 Linux (如 Ubuntu 20.04)。本文演示在 macOS/Linux 环境下进行。Python版本 3.8 或更高。推荐使用 3.9 以获得最佳兼容性。包管理工具pip(Python自带) 或conda。关键依赖库及版本说明版本号是项目稳定的关键以下版本经过测试能保证示例顺利运行。请尽量保持一致。langchain0.1.0 langchain-openai0.0.5 openai1.12.0 python-dotenv1.0.0重要前提API密钥本项目需要使用大语言模型的API例如OpenAI的GPT-4或GPT-3.5-Turbo。你需要准备一个有效的OPENAI_API_KEY。安全提示API密钥是敏感信息务必通过环境变量管理切勿直接硬编码在代码中。项目结构预览在开始前我们先规划好项目目录保持代码清晰。multi_agent_project/ ├── .env # 存储环境变量如API密钥 ├── requirements.txt # 项目依赖列表 ├── main.py # 主程序入口 ├── agents/ # 智能体模块目录 │ ├── __init__.py │ ├── product_manager.py # 产品经理智能体 │ ├── architect.py # 架构师智能体 │ └── developer.py # 开发者智能体 └── utils/ # 工具函数目录 └── __init__.py3. 核心组件与原理拆解在编写完整系统前我们需要理解LangChain中构建智能体的几个核心概念。3.1 智能体Agent的构成在LangChain中一个智能体通常由以下部分组成LLM语言模型是智能体的“大脑”。Tools工具列表。智能体可以决定调用哪个工具来处理当前问题。AgentExecutor智能体的执行引擎。它负责循环运行“LLM思考 - 选择工具 - 执行工具 - 观察结果”这个过程直到得出最终答案。3.2 工具Tools的定义工具是智能体与外界交互的桥梁。定义一个工具非常简单主要是一个包含name、description和_run方法的类。description至关重要LLM通过它来决定是否以及何时调用该工具。3.3 多智能体协同的两种模式流水线模式Pipeline智能体A完成任务后将结果传递给智能体BB继续处理依次类推。适合流程清晰、顺序执行的任务。讨论模式Discussion/Debate多个智能体围绕一个主题同时发表意见通过多轮讨论达成共识。适合方案设计、评审等需要脑暴的场景。我们的实战项目将采用流水线模式模拟一个简化的软件开发流程产品经理 - 架构师 - 开发者。4. 完整实战构建多智能体协同交付系统让我们开始编写代码。请跟随步骤一步步创建文件和代码。4.1 初始化项目与安装依赖首先创建项目目录并进入。mkdir multi_agent_project cd multi_agent_project创建并激活Python虚拟环境强烈推荐以避免包冲突。python -m venv venv # Windows venv\Scripts\activate # macOS/Linux source venv/bin/activate创建requirements.txt文件并填入之前提到的依赖。# requirements.txt langchain0.1.0 langchain-openai0.0.5 openai1.12.0 python-dotenv1.0.0安装依赖。pip install -r requirements.txt创建.env文件来安全地存储你的API密钥。请将your_openai_api_key_here替换为你自己的密钥。# .env OPENAI_API_KEYyour_openai_api_key_here重要确保.env文件已被添加到.gitignore中防止密钥被意外提交到代码仓库。4.2 创建基础工具与工具类在utils目录下我们创建一个简单的工具例如一个“代码执行器”的模拟工具。在实际应用中你可以连接真实的编译器、数据库等。# utils/code_executor.py import subprocess import sys from langchain.tools import BaseTool from typing import Type class CodeExecutorTool(BaseTool): name code_executor description 用于执行一段Python代码字符串并返回结果。输入应为有效的Python代码。 args_schema: Type None # 对于简单工具可以不用严格的schema def _run(self, code: str) - str: 执行代码的主要逻辑 try: # 注意在生产环境中执行未知代码有极大安全风险 # 此处仅为演示在沙箱或严格受控环境下进行。 result subprocess.run( [sys.executable, -c, code], capture_outputTrue, textTrue, timeout10 ) if result.returncode 0: return f执行成功\n{result.stdout} else: return f执行失败\n{result.stderr} except subprocess.TimeoutExpired: return 错误代码执行超时。 except Exception as e: return f工具内部错误{str(e)} async def _arun(self, code: str) - str: 异步执行本例中暂不实现 raise NotImplementedError(此工具不支持异步执行。)4.3 实现产品经理智能体产品经理智能体的职责是将模糊的用户需求转化为清晰的产品需求文档PRD或用户故事。# agents/product_manager.py from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain.prompts import PromptTemplate from langchain.tools import Tool import os from dotenv import load_dotenv # 加载环境变量 load_dotenv() class ProductManagerAgent: def __init__(self): # 初始化LLM使用GPT-3.5-turbo以控制成本可根据需要换为GPT-4 self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.7, # 温度稍高鼓励创造性 api_keyos.getenv(OPENAI_API_KEY) ) # 产品经理的工具箱 # 这里可以定义专属工具例如“查询市场数据”、“分析用户画像” # 本例中我们假设它主要依靠LLM的分析能力暂不添加外部工具。 self.tools [] # 构建一个高度定制的提示词模板引导AI扮演产品经理 prompt_template PromptTemplate.from_template( 你是一位资深产品经理。请根据以下用户输入的需求撰写一份简洁的产品需求描述。 描述需要包括 1. 核心功能点不超过3个。 2. 目标用户。 3. 主要的用户流程或使用场景。 请用清晰、有条理的段落格式输出。 用户需求{input} 产品需求描述 ) # 使用LangChain的LCELLangChain Expression Language方式构建链 self.chain prompt_template | self.llm def process(self, user_request: str) - str: 处理用户需求返回产品需求描述 print(f[产品经理] 收到需求: {user_request}) response self.chain.invoke({input: user_request}) prd response.content print(f[产品经理] 产出PRD:\n{prd}\n) return prd if __name__ __main__: # 简单测试 agent ProductManagerAgent() test_request 我想要一个个人博客网站可以写文章、分类并且有简单的评论功能。 result agent.process(test_request) print(result)4.4 实现架构师智能体架构师智能体接收产品需求并输出技术方案包括技术栈选型、系统模块划分等。# agents/architect.py from langchain_openai import ChatOpenAI from langchain.prompts import PromptTemplate import os from dotenv import load_dotenv load_dotenv() class ArchitectAgent: def __init__(self): self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.3, # 温度较低要求输出更确定、更结构化 api_keyos.getenv(OPENAI_API_KEY) ) prompt_template PromptTemplate.from_template( 你是一位技术架构师。请根据产品需求设计一个可行的技术方案。 方案需要包括 1. **推荐技术栈**前端、后端、数据库分别用什么技术并简述理由。 2. **系统模块划分**列出主要的后端服务模块或前端组件。 3. **API设计要点**列出核心的API端点Endpoint及其功能例如GET /api/posts。 4. **数据存储设计**说明主要的数据表或集合及其关键字段。 请用Markdown列表的形式组织答案确保清晰。 产品需求 {product_requirement} 技术方案 ) self.chain prompt_template | self.llm def process(self, prd: str) - str: 根据PRD生成技术方案 print(f[架构师] 收到PRD开始设计技术方案...) response self.chain.invoke({product_requirement: prd}) design_doc response.content print(f[架构师] 产出技术方案:\n{design_doc}\n) return design_doc4.5 实现开发者智能体开发者智能体是最复杂的它需要根据技术方案真正地生成代码。我们将为它配备之前定义的CodeExecutorTool让它具备“思考-编码-验证”的能力。# agents/developer.py from langchain_openai import ChatOpenAI from langchain.agents import AgentExecutor, create_react_agent from langchain.prompts import PromptTemplate from langchain.tools import Tool import os from dotenv import load_dotenv # 假设我们将之前写的工具放在项目根目录的 tools 模块下 import sys sys.path.append(.) from utils.code_executor import CodeExecutorTool load_dotenv() class DeveloperAgent: def __init__(self): self.llm ChatOpenAI( modelgpt-3.5-turbo, temperature0.2, # 写代码要求精确温度设低 api_keyos.getenv(OPENAI_API_KEY) ) # 初始化工具 self.code_executor CodeExecutorTool() # 开发者可以使用的工具列表 self.tools [ Tool( nameself.code_executor.name, funcself.code_executor._run, descriptionself.code_executor.description, ) ] # 使用ReAct模式的提示词模板 react_prompt PromptTemplate.from_template( 你是一个全栈开发者。请根据技术架构方案完成一个核心功能的代码实现。 你必须遵循以下步骤 1. 思考分析方案确定现在要实现哪个具体功能。 2. 行动编写实现该功能的Python代码。如果需要验证代码逻辑可以调用code_executor工具来运行代码片段。 3. 观察查看工具返回的结果判断代码是否正确。 4. 重复1-3步直到你认为核心功能已正确实现。 5. 最终输出完整的、可运行的代码文件内容。 技术架构方案 {technical_design} 你只需要实现一个最核心的模块即可例如一个博客系统的Post模型类和对应的创建、查询函数。 现在开始你的任务。当你需要运行代码时请使用工具。 思考我应该从哪里开始首先我需要理解架构然后选择实现数据模型层。 ) # 创建ReAct智能体 self.agent create_react_agent(self.llm, self.tools, react_prompt) self.agent_executor AgentExecutor(agentself.agent, toolsself.tools, verboseTrue, handle_parsing_errorsTrue) def process(self, technical_design: str) - str: 根据技术方案生成并验证代码 print(f[开发者] 收到技术方案开始编写代码...) # 注意这里为了演示我们限制了最大迭代步数。实际任务可能更复杂。 result self.agent_executor.invoke({ input: f请基于以下技术方案实现一个核心模块的代码。\n技术方案{technical_design}, technical_design: technical_design }) final_code result.get(output, 代码生成过程中出现错误。) print(f[开发者] 任务完成。最终输出\n{final_code}\n) return final_code4.6 组装主流程实现智能体协同现在我们有了三个各司其职的智能体。最后一步是在main.py中创建主控流程让它们像流水线一样工作。# main.py import os from dotenv import load_dotenv from agents.product_manager import ProductManagerAgent from agents.architect import ArchitectAgent from agents.developer import DeveloperAgent def main(): # 1. 加载环境变量 load_dotenv() if not os.getenv(OPENAI_API_KEY): print(错误请在 .env 文件中设置 OPENAI_API_KEY) return # 2. 初始化三个智能体 print(初始化智能体团队...) pm_agent ProductManagerAgent() arch_agent ArchitectAgent() dev_agent DeveloperAgent() # 3. 模拟用户输入 user_request input(请输入你的软件需求例如我想要一个个人博客网站\n) if not user_request.strip(): user_request 我想要一个个人博客网站可以写文章、分类并且有简单的评论功能。 print(f使用默认需求{user_request}) print(\n *50) print(开始多智能体协同交付流程...) print(*50 \n) # 4. 流水线开始产品经理 - 架构师 - 开发者 # 阶段一产品经理分析需求 prd pm_agent.process(user_request) # 阶段二架构师设计技术方案 technical_design arch_agent.process(prd) # 阶段三开发者实现代码 final_code dev_agent.process(technical_design) # 5. 输出最终结果 print(\n *50) print(协同交付流程结束) print(*50) print(\n最终生成的代码片段已在上方输出。) # 在实际应用中你可以将 final_code 写入文件 # with open(generated_module.py, w) as f: # f.write(final_code) if __name__ __main__: main()4.7 运行与验证现在让我们运行这个系统看看效果。确保你在项目根目录下并且虚拟环境已激活。确保.env文件中的OPENAI_API_KEY已正确设置。运行主程序python main.py程序会提示你输入需求。你可以输入自己的需求或者直接按回车使用默认的博客网站需求。观察控制台输出。你会看到三个智能体依次被调用并打印出它们的“思考”过程和产出。产品经理会输出一段需求描述。架构师会输出一个包含技术栈、模块、API要点的Markdown列表。开发者会启动一个ReAct循环它可能会尝试编写一个Post类甚至调用code_executor工具来运行一段测试代码最后输出生成的代码。预期效果你将看到一个完整的、自动化的从需求到代码的微型流程。虽然生成的代码是基础片段但整个多智能体协同的框架已经搭建完成。5. 常见问题与排查思路在实现和运行上述系统时你可能会遇到以下问题问题现象常见原因解决思路导入错误ModuleNotFoundError: No module named langchain依赖未安装或不在当前Python环境。1. 确认已激活虚拟环境 (venv\Scripts\activate或source venv/bin/activate)。2. 在项目根目录下运行pip install -r requirements.txt。运行时报错AuthenticationError或Invalid API KeyAPI密钥未设置或无效。1. 检查.env文件是否存在且OPENAI_API_KEY的值正确无误注意不要有多余空格。2. 在终端中运行echo $OPENAI_API_KEY(Linux/macOS) 或echo %OPENAI_API_KEY%(Windows) 确认环境变量已加载。3. 在OpenAI官网检查API密钥是否有效且有余额。智能体执行时间过长或卡住LLM响应慢或ReAct智能体陷入了循环。1. 检查网络连接。2. 在初始化AgentExecutor时设置max_iterations和max_execution_time参数来限制执行时间例如AgentExecutor(..., max_iterations5, max_execution_time30)。3. 将模型从gpt-3.5-turbo切换到响应更快的模型。code_executor工具执行代码时报安全错误或超时操作系统权限限制或执行的代码本身有危险操作如无限循环。1.重要此工具仅为演示在生产中切勿直接执行未经验证的代码。考虑使用Docker沙箱等隔离环境。2. 在_run方法中我们已通过subprocess的timeout参数做了基本防护。架构师或开发者的输出不符合预期提示词Prompt不够精确或LLM的temperature参数设置不当。1. 仔细优化提示词模板给出更具体、更结构化的指令。2. 调整temperature需要创造性时调高如0.7需要确定性输出时调低如0.2。3. 尝试使用能力更强的模型如gpt-4。多个智能体间传递的信息丢失或格式混乱上一个智能体的输出可能包含多余标记或格式影响下一个智能体的解析。1. 在每个智能体的process方法中可以对输出进行简单的清洗和格式化。2. 设计一个统一的数据结构如JSON在智能体间传递信息而不仅仅是纯文本。6. 最佳实践与工程建议将多智能体系统从演示原型推向生产环境需要考虑更多工程化细节。6.1 智能体设计最佳实践角色定义清晰像我们示例中那样为每个智能体赋予明确、单一的角色和职责范围。避免让一个智能体做太多事。工具专业化为智能体配备高质量、高可靠性的工具。工具的描述description要精确这直接决定了LLM调用工具的准确性。上下文管理对于长对话或复杂任务合理管理对话历史Memory至关重要。可以使用ConversationBufferMemory或ConversationSummaryMemory来保存上下文避免信息丢失。6.2 系统架构与性能异步处理如果智能体任务耗时较长应考虑使用异步框架如asyncio来并行执行多个智能体或任务提升系统吞吐量。状态持久化将智能体的执行状态如对话历史、中间结果保存到数据库如Redis、PostgreSQL以便在系统重启或失败后能够恢复。熔断与降级当依赖的LLM API或外部工具服务不稳定时系统应具备熔断机制避免级联失败并可以提供降级方案如返回缓存结果。6.3 提示词工程结构化输出要求LLM以特定格式如JSON、Markdown列表、XML输出便于后续程序化解析。这在智能体协作中尤其重要。少样本学习Few-Shot在提示词中提供一两个高质量的输入输出示例能显著提升智能体完成任务的质量和一致性。思维链Chain-of-Thought鼓励智能体“一步一步思考”将推理过程展示出来。这不仅能让输出更可靠也便于调试。6.4 安全与可控性输入输出过滤对用户输入和智能体输出进行严格的过滤和审查防止注入攻击、敏感信息泄露或生成有害内容。权限控制为不同的智能体分配不同的工具调用权限。例如一个“只读分析智能体”不应该有调用“删除数据库”工具的权限。人工审核环节在关键决策点如发布代码、执行数据库操作设置“人工审核”智能体或流程确保最终操作的安全可控。6.5 监控与评估日志记录详细记录每个智能体的输入、输出、工具调用记录和耗时。这是调试和优化系统的基础。评估指标定义评估多智能体系统效果的指标如任务完成率、步骤数、人工干预频率、最终结果质量评分等。可解释性设计系统时就要考虑可解释性。智能体的“思考过程”如ReAct中的Thought/Action/Observation应该被记录和可视化方便开发者理解系统行为。通过这个实战项目我们搭建了一个多智能体协同系统的骨架。从产品经理到开发者每个角色都通过代码具象化。虽然它离一个成熟的“AI办公平台”还有很远的距离但核心的编排、通信、专业化分工的理念已经得到体现。你可以在此基础上为智能体添加更多强大的工具连接数据库、调用外部API、生成图表设计更复杂的协作模式如讨论、投票、评审甚至引入“管理者”智能体来动态分配任务。多智能体系统的魅力在于其模块化和可扩展性每一个改进都能让整个系统变得更聪明、更强大。