很多朋友在做 AI 应用时,一开始都是从单个 Agent 聊起的,比如让它写文案、做翻译、总结文档。但一旦涉及真实业务场景,比如一场婚礼的策划,需要协调场地、预算、宾客、创意、摄影等多个方面,单个 Agent 就会手忙脚乱。这时候,多智能体(Multi-Agent)的协作价值就体现出来了。
本文将基于一个“中配”实战项目:使用 LangChain + LangGraph 构建多智能体婚礼策划系统,并用 Streamlit 快速搭建一个可视化交互界面。这不是一个简单的 Demo,而是一个具备清晰分工、状态流转、人机协作的完整工程案例。
文章会覆盖:LangChain 与 LangGraph 的关系、多智能体架构设计、四大策划 Agent 的完整实现、Streamlit 前端的对接、常见报错与排查思路、生产环境落地的工程建议。无论你是 AI 应用开发者,还是想入门 LangChain 多智能体的学习者,这篇文章都可以作为一份较为完整的实战参考。
运行环境:Python 3.10 以上均可,代码在 Windows / macOS / Linux 下兼容。
1. 项目背景:婚礼策划为什么需要多智能体
1.1 一个 Agent 的局限
先来看一个常见场景。假设你让一个 Agent 帮用户策划婚礼,你会让它做什么?
从外部看,它内部其实只有一套系统提示词(System Prompt)和一组工具。它既要处理预算计算,又要设计主题风格,还要协调供应商时间,甚至还要负责给宾客排座位。输出质量通常有三个问题:
- 上下文太长导致遗忘:前面的决策被后面的工具调用覆盖掉,用户问“刚才定的主题色是什么”,Agent 已经想不起来。
- 工具权限混乱:预算 Agent 能调用供应商库,创意 Agent 能修改预算表,职责边界不清晰,容易产生幻觉或误操作。
- 无法并行思考:真实策划场景中,预算、场地、摄影、菜单需要并行调研和计算,单个 Agent 只能串行完成,速度慢且产出效率低。
1.2 婚礼策划的本质是多人协作
我们把真实婚礼策划师的工作方式拆开看,会发现这从来不是一个人干的活。
一个成熟的婚礼策划团队通常包含:
- 婚礼策划师:总控全局,制定主题和整体进度;
- 预算管理师:分配预算,控制每一项支出;
- 场地与供应商专员:负责酒店、摄影、花艺、甜品、音乐等资源;
- 宾客关系专员:统计人数、座位安排、接送和住宿安排。
多智能体系统本质上就是把这个团队搬进代码里。每个 Agent 只负责一件事,它们通过共享状态(State)进行信息传递,由一个协调者(Router 或 Supervisor)决定下一步让谁执行,最终汇总成一份完整的婚礼策划案。
1.3 LangGraph:比 LangChain 更适合多智能体编排
LangChain 是当前非常流行的 LLM 应用开发框架,它提供了模型封装、Prompt 管理、工具调用、RAG 等基础能力。而 LangGraph 是 LangChain 团队推出的低层级编排框架,专门用于构建有状态、可循环、可控制的 Agent 图。
两者关系可以用一句话概括:
LangChain 提供“零件”,LangGraph 负责把“零件”组装成一条可以无限循环、有记忆、有条件跳转的生产线。
在多智能体项目中,我们需要的不只是“调用一次 LLM 返回结果”,而是:
- 多个 Agent 之间可以多次跳转;
- 每个 Agent 都能读取全局状态;
- 支持条件判断,例如预算不足时自动切换到“预算预警”逻辑;
- 支持人工确认节点,比如最终方案输出前,允许用户调整。
这些能力如果自己手写状态机非常麻烦,而 LangGraph 的StateGraph几乎是为此设计的。
2. 系统架构设计
2.1 整体架构图
在正式开始编码前,我们先梳理整体架构。
系统主要包括 5 个模块:
用户输入(Streamlit 页面) ↓ LangGraph 编排层 ├── 1. Router 意图分发节点 ├── 2. 需求分析 Agent(需求拆解) ├── 3. 预算规划 Agent(预算分配与预警) ├── 4. 资源推荐 Agent(场地/摄影/花艺等) ├── 5. 创意策划 Agent(主题、流程、细节) └── 6. 最终方案汇总节点 ↓ Streamlit 状态显示 / 结果输出2.2 状态设计
LangGraph 多智能体协同的核心是定义好全局状态(State)。状态相当于各个 Agent 之间的共享便签本,每个 Agent 都可以读取它,并根据职责更新其中一部分字段。
这里我们需要维护的数据包括:
| 字段 | 类型 | 说明 |
|---|---|---|
user_input | str | 用户原始输入 |
requirement | str | 需求分析 Agent 输出的结构化需求 |
budget_plan | str | 预算规划 Agent 输出的预算分配 |
resource_plan | str | 资源推荐 Agent 输出的供应商与场地方案 |
creative_plan | str | 创意策划 Agent 输出的婚礼主题和流程 |
final_plan | str | 汇总后的完整方案 |
messages | list | 对话历史记录 |
current_role | str | 当前正在执行的 Agent 角色 |
通过这种状态设计,各个 Agent 之间不需要“商量”,只需要向 State 中写入自己的产出,下一个 Agent 就能读到上一个模块的结果。
2.3 任务流转逻辑
多智能体不是简单的一堆 Agent 顺序执行。我们用 LangGraph 的任务流如下:
- 用户输入需求后,Router 节点判断是否已完整收集关键信息;
- 如果缺少关键信息,Router 直接返回,要求用户补充;
- 信息完整后,
需求分析 Agent先执行,输出结构化的婚礼需求; - 随后
预算规划 Agent根据需求做预算拆分; - 接着
资源推荐 Agent结合预算和需求推荐供应商与场地; - 最后
创意策划 Agent吸收前面所有信息,生成完整的婚礼方案; - 所有 Agent 完成后,进入最终汇总节点,输出 Markdown 格式策划案。
在第 6 步结束后,我们还设计了一个“人工确认”入口,让用户在 Streamlit 界面上对提案进行修改或确认,这体现了真实业务中的人机协同思想。
3. 环境准备与依赖安装
3.1 创建虚拟环境
建议使用虚拟环境隔离项目依赖,避免污染全局 Python 环境。
python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate3.2 安装依赖
本文使用 LangChain 0.3.x 版本进行演示,并以langgraph作为编排核心,streamlit作为界面层。
pip install -U langchain langchain-openai langgraph streamlit python-dotenv如果国内网络环境不稳定,可以加上国内镜像源,比如:
pip install -U langchain langchain-openai langgraph streamlit python-dotenv -i https://pypi.tuna.tsinghua.edu.cn/simple3.3 配置环境变量
在项目根目录创建.env文件:
OPENAI_API_KEY=你的_KEY OPENAI_API_BASE=https://api.openai.com/v1 # 如果使用代理/中转,改成对应地址注意:生产环境不要将密钥硬编码在代码中,也不要上传到 Git 仓库。
3.4 验证环境
安装完成后,可以运行下面的 Python 代码验证环境是否正常:
from langchain_openai import ChatOpenAI llm = ChatOpenAI(model="gpt-4o-mini", temperature=0.7) resp = llm.invoke("请回复:环境正常") print(resp.content)如果输出了内容,说明 LangChain 与模型 API 已经打通。
4. LangChain 多智能体核心代码实现
这一节是文章的重点。我们将按照模块逐一实现。
4.1 定义全局状态和 LLM
创建state.py:
from typing import TypedDict, Annotated, List class WeddingState(TypedDict): user_input: str requirement: str budget_plan: str resource_plan: str creative_plan: str final_plan: str messages: Annotated[List[str], operator.add] current_role: str再创建llm.py:
import os from dotenv import load_dotenv from langchain_openai import ChatOpenAI load_dotenv() def get_llm(temperature: float = 0.7): return ChatOpenAI( model="gpt-4o-mini", temperature=temperature, api_key=os.getenv("OPENAI_API_KEY"), base_url=os.getenv("OPENAI_API_BASE") )4.2 编写需求分析 Agent
这个 Agent 负责将用户自由输入的自然语言需求,转化为结构化的婚礼需求描述,方便后续模块读取。
创建agents/requirement_agent.py:
from langchain_core.prompts import ChatPromptTemplate REQUIREMENT_PROMPT = ChatPromptTemplate.from_messages([ ("system", """你是一位资深的婚礼需求分析师。 你的任务是从用户的描述中提取关键信息,并整理为结构化需求。 必须包含以下字段(如果没有提到,就标注需要确认): - 婚礼日期 - 宾客人数 - 婚礼风格偏好(如中式、西式、户外、极简等) - 预算范围 - 特殊要求(如宠物观礼、无障碍设施、宗教仪式等) - 地点偏好 """), ("human", "用户需求:{user_input}") ]) def create_requirement_agent(llm): chain = REQUIREMENT_PROMPT | llm return chain4.3 编写预算规划 Agent
预算规划 Agent 需要根据需求分析结果分配预算,并标记每一项的上限。
创建agents/budget_agent.py:
BUDGET_PROMPT = ChatPromptTemplate.from_messages([ ("system", """你是一位婚礼预算管理师。请根据需求分析结果,输出分项预算表。 格式要求: ### 总预算 ### 分项预算 | 项目 | 预算金额 | 说明 | | --- | --- | --- | 建议包含项目:场地、餐饮、摄影摄像、婚礼策划、服装、花艺、甜品台、音乐、宾客礼品、应急备用金。 注意:所有分项之和不要超过总预算,若不够需提出优先级建议。 """), ("human", "需求分析结果:{requirement}") ]) def create_budget_agent(llm): chain = BUDGET_PROMPT | llm return chain4.4 编写资源推荐 Agent
资源推荐 Agent 不访问真实外部数据库,它基于自己的“知识”和预算、需求,生成假想的资源推荐清单。生产环境可以在这里挂载真实的供应商数据库工具(Tool)。
创建agents/resource_agent.py:
RESOURCE_PROMPT = ChatPromptTemplate.from_messages([ ("system", """你是一位婚礼资源整合专家。 请根据需求分析和预算规划,推荐合适的资源方案,包括: - 场地:3个候选,说明优势与适合场景 - 摄影团队:2-3个候选 - 花艺布置:2个方向 - 甜品或餐饮建议 - 应急备选方案 所有推荐必须符合预算范围,超预算时要说明原因。 """), ("human", "需求分析:{requirement}\n预算规划:{budget_plan}") ]) def create_resource_agent(llm): chain = RESOURCE_PROMPT | llm return chain4.5 编写创意策划 Agent
创意策划 Agent 承担“总导演”角色,它综合前面所有模块信息,写出一份有创意的完整婚礼策划案。
创建agents/creative_agent.py:
CREATIVE_PROMPT = ChatPromptTemplate.from_messages([ ("system", """你是一位顶级的婚礼策划师。请综合需求、预算、资源三方面信息,输出一份完整的婚礼策划案。 策划案需包含: 1. 婚礼主题与设计理念 2. 仪式流程(时间线) 3. 场地布置要点 4. 宾客体验亮点 5. 摄影与音乐氛围建议 6. 备选方案 7. 预算执行说明 请使用 Markdown 格式输出,内容要具体、可落地,避免空话套话。 """), ("human", "需求分析:{requirement}\n预算规划:{budget_plan}\n资源推荐:{resource_plan}") ]) def create_creative_agent(llm): chain = CREATIVE_PROMPT | llm return chain4.6 组装 LangGraph 状态图
现在我们进入最核心的部分:使用StateGraph把这些 Agent 编排起来。
创建graph.py:
import operator from typing import Annotated, TypedDict, List from langgraph.graph import StateGraph, END from langgraph.checkpoint.memory import MemorySaver # 允许 messages 累加 class WeddingState(TypedDict): user_input: str requirement: str budget_plan: str resource_plan: str creative_plan: str final_plan: str messages: Annotated[List[str], operator.add] async def requirement_node(state: WeddingState): from agents.requirement_agent import create_requirement_agent chain = create_requirement_agent(get_llm()) result = await chain.ainvoke({"user_input": state["user_input"]}) return {"requirement": result.content, "messages": ["需求分析完成"]} async def budget_node(state: WeddingState): from agents.budget_agent import create_budget_agent chain = create_budget_agent(get_llm()) result = await chain.ainvoke({ "requirement": state.get("requirement", "") }) return {"budget_plan": result.content, "messages": ["预算规划完成"]} async def resource_node(state: WeddingState): from agents.resource_agent import create_resource_agent chain = create_resource_agent(get_llm()) result = await chain.ainvoke({ "requirement": state.get("requirement", ""), "budget_plan": state.get("budget_plan", "") }) return {"resource_plan": result.content, "messages": ["资源推荐完成"]} async def creative_node(state: WeddingState): from agents.creative_agent import create_creative_agent chain = create_creative_agent(get_llm()) result = await chain.ainvoke({ "requirement": state.get("requirement", ""), "budget_plan": state.get("budget_plan", ""), "resource_plan": state.get("resource_plan", "") }) return {"creative_plan": result.content, "messages": ["创意策划完成"]} async def final_node(state: WeddingState): final = f""" ## 婚礼策划最终方案 ### 需求分析 {state.get('requirement','')} ### 预算规划 {state.get('budget_plan','')} ### 资源推荐 {state.get('resource_plan','')} ### 创意策划 {state.get('creative_plan','')} """ return {"final_plan": final, "messages": ["最终方案生成"]} def build_graph(): workflow = StateGraph(WeddingState) workflow.add_node("requirement", requirement_node) workflow.add_node("budget", budget_node) workflow.add_node("resource", resource_node) workflow.add_node("creative", creative_node) workflow.add_node("final", final_node) workflow.set_entry_point("requirement") workflow.add_edge("requirement", "budget") workflow.add_edge("budget", "resource") workflow.add_edge("resource", "creative") workflow.add_edge("creative", "final") workflow.add_edge("final", END) # MemorySaver 用于保存状态与对话记录 memory = MemorySaver() app = workflow.compile(checkpointer=memory) return app4.7 添加意图路由与人工确认节点
如果用户输入的信息不完整,直接进入需求分析 Agent 可能会产出大量“待确认”。我们可以在入口加入一个路由节点,先判断是否进入正式策划流程,还是需要向用户提问。
创建graph_router.py:
from langchain_core.prompts import ChatPromptTemplate ROUTER_PROMPT = ChatPromptTemplate.from_messages([ ("system", """你是婚礼策划系统的判断节点。请判断用户输入中是否包含以下关键信息: - 婚礼日期 - 宾客人数 - 预算范围 - 风格偏好 如果四项都有,只回复 VALID;否则回复 NEED_INFO,并列出缺失项。 """), ("human", "用户输入:{user_input}") ]) def should_continue(state): result = state.get("requirement", "") if "待确认" in result or "未知" in result: return "need_user_feedback" return "budget"实际项目中,更加健壮的做法是让路由节点调用 LLM 判断,然后返回VALID或NEED_INFO。这里我们简化处理,将“待确认”关键词作为判断依据。
为了让流程更完整,我们在 StateGraph 中加入一个human_feedback节点,用于暂停执行并等待 Streamlit 前端补充信息。
5. 基于 Streamlit 构建交互前端
5.1 页面整体布局
Streamlit 是 Python 生态中非常便捷的 AI 应用 UI 框架。我们用它做三个页面区域:
- 侧边栏:输入本次婚礼的用户需求;
- 主区域:展示需求分析、预算、资源、创意四个 Agent 的处理过程;
- 状态区:显示当前执行节点和中间产物。
创建app.py:
import streamlit as st from graph import build_graph st.set_page_config(page_title="多智能体婚礼策划师", layout="wide") st.title("🎉 多智能体婚礼策划师") st.caption("基于 LangChain + LangGraph + Streamlit 的多智能体协作实战项目") # 初始化会话状态 if "app" not in st.session_state: st.session_state.app = build_graph() if "thread_id" not in st.session_state: st.session_state.thread_id = "wedding-001" # 侧边栏输入 with st.sidebar: st.header("用户需求输入") user_input = st.text_area( "请输入你的婚礼需求", value="计划明年5月20日在杭州举办户外婚礼,宾客约80人,预算15万元,喜欢极简风格,希望有草坪仪式和晚宴。", height=150 ) run_btn = st.button("开始策划", type="primary") # 主区域 if run_btn: config = {"configurable": {"thread_id": st.session_state.thread_id}} final_state = st.session_state.app.invoke( {"user_input": user_input, "messages": []}, config=config ) st.session_state.final_state = final_state if "final_state" in st.session_state: state = st.session_state.final_state tabs = st.tabs(["需求分析", "预算规划", "资源推荐", "创意策划", "最终方案"]) with tabs[0]: st.markdown(state.get("requirement", "")) with tabs[1]: st.markdown(state.get("budget_plan", "")) with tabs[2]: st.markdown(state.get("resource_plan", "")) with tabs[3]: st.markdown(state.get("creative_plan", "")) with tabs[4]: st.markdown(state.get("final_plan", ""))运行应用:
streamlit run app.py浏览器会自动打开http://localhost:8501。
5.2 增加执行过程展示
为了更直观地展示多智能体之间的协作,我们可以把每一步的状态更新“流式”展示出来。Streamlit 支持st.status容器,适合展示多步执行过程。
改造核心执行部分:
if run_btn: config = {"configurable": {"thread_id": st.session_state.thread_id}} # 逐节点执行并展示进度 with st.status("多智能体协作中...", expanded=True) as status: from graph import build_graph app = st.session_state.app # 利用 invoke 的 stream_mode="updates" 逐步获取节点输出 for step in app.stream( {"user_input": user_input, "messages": []}, config=config, stream_mode="values" ): # step 是完整的 state 快照 if step.get("requirement"): st.write("✅ 需求分析完成") with st.expander("查看需求分析产物"): st.markdown(step["requirement"]) if step.get("budget_plan"): st.write("✅ 预算规划完成") with st.expander("查看预算规划产物"): st.markdown(step["budget_plan"]) if step.get("resource_plan"): st.write("✅ 资源推荐完成") with st.expander("查看资源推荐产物"): st.markdown(step["resource_plan"]) if step.get("creative_plan"): st.write("✅ 创意策划完成") with st.expander("查看创意策划产物"): st.markdown(step["creative_plan"]) status.update(label="多智能体协作完成!", state="complete")这样,用户可以在页面上清晰地看到“需求分析 → 预算规划 → 资源推荐 → 创意策划”依次完成的过程,体验上更像真实的多智能体协作系统。
6. 运行与验证
6.1 完整运行流程
在项目根目录执行:
streamlit run app.py打开浏览器后,在侧边栏输入:
计划明年5月20日在杭州举办户外婚礼,宾客约80人,预算15万元,喜欢极简风格,希望有草坪仪式和晚宴。点击“开始策划”,页面主区域会依次输出:
- 需求分析 Agent输出的结构化工单;
- 预算规划 Agent输出的分项预算表;
- 资源推荐 Agent输出的场地、摄影、花艺候选清单;
- 创意策划 Agent输出的完整婚礼流程和主题方案;
- 最终汇总方案。
6.2 预期输出示例(截取)
创意策划 Agent 的输出大致如下:
### 1. 婚礼主题与设计理念 主题推荐:「清风与白纱」 以极简风格为主线,色彩上以白色、原木色、浅绿色为主,呼应户外草坪的自然气息... ### 2. 仪式流程(时间线) - 15:00 宾客入场,草坪音乐暖场 - 15:30 主持人开场,新娘入场 - 16:00 交换戒指与誓言环节 - 16:30 合影与自由交流 - 18:00 晚宴开始实际输出会根据模型、温度参数和输入需求的不同而有所变化,但整体结构应该保持一致。
7. 常见问题与排查思路
在 LangChain 多智能体和 Streamlit 实战中,最常见的报错集中在依赖版本、API 调用、状态读取和页面缓存四类。下面整理成表格,方便快速检索。
| 问题现象 | 常见原因 | 解决思路 |
|---|---|---|
ModuleNotFoundError: No module named 'langgraph' | 未安装 langgraph 或版本过低 | 执行pip install -U langgraph,确认安装在当前虚拟环境 |
OpenAIError: The api_key client option must be set | 没有加载 .env 环境变量 | 在入口文件最前面调用from dotenv import load_dotenv; load_dotenv() |
TypeError: 'NoneType' object is not subscriptable | 读取 state 时字段不存在 | 使用state.get("字段", "")进行安全读取,避免直接下标访问 |
| Streamlit 页面点击按钮无反应 | 未正确管理st.session_state | 确认app.graph是否已缓存在 session_state 中 |
RecursionError: maximum recursion depth exceeded | LangGraph 边配置成循环且无出口 | 检查 add_edge 是否指向 END,或条件边是否正确返回 |
ValueError: Must specify at least one LLM | ChatOpenAI 初始化参数错误 | 检查 api_key、base_url、model 参数是否正确传入 |
| 输出中大量出现“待确认” | 用户输入关键信息不足,路由判断不完善 | 在 Router 节点增加结构化信息校验,或增加 human_feedback 节点 |
补充一个容易被忽略的问题:LangGraph 的多智能体是多轮复用的。如果在 Streamlit 中反复点击“开始策划”,同一个thread_id会保存历史状态,导致下一次执行可能读取到上一次中间结果。解决方案是为每次新策划生成新的 thread_id:
import uuid st.session_state.thread_id = str(uuid.uuid4())或者在提交前清空 key:
for key in ["requirement", "budget_plan", "resource_plan", "creative_plan", "final_plan"]: if key in st.session_state: del st.session_state[key]8. 进阶优化与生产落地建议
这一节梳理一下,如果要把这个项目落地到真实业务或参加竞赛,你需要额外关注哪些点。
8.1 接入真实工具:把资源推荐升级为 RAG 查询
当前资源推荐 Agent 只是基于模型知识“编”供应商方案。真实项目中,应该接入公司的供应商数据库或知识库,此时有两个思路:
(1)给 Agent 注册 Tool,用@tool装饰器实现供应商查询函数,然后将 Tool 注入 Agent。
from langchain_core.tools import tool @tool def search_venue(city: str, budget: float, guests: int) -> str: """根据城市、预算和宾客人数查询合适场地""" # 这里实际调用数据库或 API return "杭州·西溪艺术酒店:户外草坪可容纳100人,套餐价6万元,含基础布置。"(2)把供应商资料向量化,挂载到 RAG 检索器。资源推荐 Agent 先检索知识库,再结合检索结果生成方案。这种方式更适合供应商信息经常变化、需要实时更新的场景。
8.2 使用 LangGraph 的 Checkpointer 实现多轮对话记忆
前面的代码已经使用了MemorySaver,它让多智能体系统在多次调用中保留状态。生产环境建议替换为持久化存储,比如SqliteSaver、PostgresSaver或 Redis,避免服务重启后丢失对话上下文。
8.3 加入人工审核节点
婚礼策划是决策成本较高的业务。我们不能让 AI 直接替用户做决定,更稳妥的方式是:
- 每个 Agent 产出方案后,允许用户在 Streamlit 页面确认或修改;
- 修改结果写回 State,后续 Agent 读取新值;
- 最终方案输出前增加“人工确认”按钮,用户点击确认后才进入最终生成节点。
LangGraph 的interrupt_before参数可以实现“暂停在某个节点前”的效果:
app = workflow.compile( checkpointer=memory, interrupt_before=["human_feedback"] )当执行到human_feedback前,系统会暂停,等待用户输入,再调用invoke继续执行。
8.4 关注 Token 成本与响应延迟
多智能体系统调用次数远高于单 Agent。一个包含 4 个 Agent 的策划流程,至少会产生 4 次 LLM 调用,加上路由判断和汇总节点,往往超过 6 次。
建议:
- 使用
gpt-4o-mini或更便宜的模型处理中间分析任务; - 只有最终创意策划使用强模型,比如
gpt-4o或claude-sonnet; - 对 Prompt 中的历史消息做“截断”,避免太多历史上下文挤占 Token;
- 增加结果缓存,相同输入需求直接返回历史策划案。
8.5 从 LangChain 迁移到 LangGraph 的注意事项
不少读者是从 LangChain 的AgentExecutor转过来的。这里需要提醒几个关键差异:
- LangChain Agent 是“工具循环”,适合单 Agent 多工具场景;LangGraph 是“图状态机”,适合多 Agent 多角色编排。
- LangGraph 的节点函数签名是
state -> dict,返回的 dict 会自动合并到全局状态,不要尝试返回整个 state。 - 使用
add_edge和add_conditional_edges时要理清是否会产生死循环,尤其是条件边,必须保证所有分支最终都能到达 END。 - LangGraph 的调试比 LangChain 困难,建议为每个节点添加状态日志字段(如
messages中追加节点执行记录),方便定位问题。
9. 总结
这篇文章以“婚礼策划”为业务背景,完整实现了基于 LangChain、LangGraph 和 Streamlit 的中配多智能体系统。核心内容包括:
- 多智能体架构中状态共享与角色分工的设计思路;
- LangGraph 中
StateGraph、节点、边、状态流转的核心用法; - 需求分析、预算规划、资源推荐、创意策划四个 Agent 的 Prompt 与代码实现;
- Streamlit 前端如何对接多智能体执行过程,并展示各模块中间产物;
- 常见报错与生产落地方案的排查清单。
下一步,你可以尝试在现有框架上添加更多 Agent,比如“宾客座位安排 Agent”“天气预警 Agent”“音乐歌单生成 Agent”,并将资源推荐模块替换为真实的数据库查询或 RAG 检索,进一步提升系统的实用价值。
动手实践永远是学习 AI 应用开发的最好方式。把本文代码跑通之后,试着改一改每个 Agent 的 Prompt,你会发现多智能体系统的行为会发生很有趣的变化,这正是 LangChain 生态的魅力所在。