某购物网站建设方案wordpress萧涵主题
2026/1/10 18:14:09 网站建设 项目流程
某购物网站建设方案,wordpress萧涵主题,沈阳男科医院排名哪家好,fifa最新排名出炉在之前[《几种AI Agent开发框架对比》]这篇文章中#xff0c;Chaiys同学设计了一个高考信息查询智能助手业务场景#xff0c;使用几种AI Agent开发框架分别实现进行对比分析#xff0c;因为文档太长#xff0c;其中多智能体协作章节就没有详细展开。 本文基于AgentScope框…在之前[《几种AI Agent开发框架对比》]这篇文章中Chaiys同学设计了一个高考信息查询智能助手业务场景使用几种AI Agent开发框架分别实现进行对比分析因为文档太长其中多智能体协作章节就没有详细展开。本文基于AgentScope框架对多智能体协作场景进行详细实践和对比分析后面还会有一篇基于LangGraph框架的实践分析。为了更好地模拟我们还是基于之前高考信息查询这个业务场景将原有的单智能体拆分为四个模块对应四个智能体如下Template Agent模板匹配我们将SQL Agent生成的SQL保存为模板提取年份参数当下一次追问仅仅是对年份的追问时直接取模板内的SQL查询分析即可。Rewrite Agent意图识别根据上下文改写问题完善条件支持多轮追问场景。SQL Agent通过自然语言匹配表结构等信息然后生成SQL再执行SQL查询出数据。Analysis Agent分析结果数据并简要回答用户问题。 多智能体协作实现逻辑首先看一下业务场景打算基于以上四个智能体协作来支撑用户进行高考信息查询并且要支持多轮对话后续会基于以下案例来进行验证第一轮提问2016年考生人数有多少第二轮追问年份2018年呢第三轮追问其他录取人数呢针对该业务场景四个智能体之间的协作逻辑设计如下1用户输入问题2TemplateAgent判断是否匹配模板未匹配NO_MATCH转3无上下文NO_CONTEXT则转4匹配则转53未匹配NO_MATCH即匹配失败进入意图识别改写RewriteAgent利用上下文对话背景进行问题改写然后进入SQLAgentRAG检索元数据、生成SQL、查询数据最后进入AnalysisAgent分析回答4无上下文NO_CONTEXT即首次提问直接进入SQLAgentRAG检索元数据、生成SQL、查询数据最后进入AnalysisAgent分析回答5、直接AnalysisAgent分析回答整体协作逻辑概览如下[用户输入] ↓ [TemplateAgent] ↓ ┌─────────────────────匹配结果──────────────────────┐ ↓ ↓ ↓[匹配成功-管道1] [匹配失败有上下文-管道2] [匹配失败无上下文-管道3] ↓ ↓ ↓[AnalysisAgent] [RewriteAgent] [SQLAgent] ↓ ↓ [SQLAgent] [AnalysisAgent] ↓ [AnalysisAgent] ↓ ↓ ↓ └────────────输出结果──────────────┘ ↑ └──────── Memory Context Reuse ────────────┘针对以上协作逻辑中的三种分支处理逻辑实际还是要通过手写代码方式来进行逻辑控制然后其中每钟分支流程中如果涉及到多个Agent则可以通过AgentScope框架提供的管道模式sequential_pipeline进行串联具体代码如下# --- 对话主流程 ---async def chat(): print(启动 AgentScope 多智能体系统输入 exit 退出) template_agent TemplateAgent() rewrite_agent RewriteAgent() sql_agent SQLAgent() analysis_agent AnalysisAgent() while True: user_input await asyncio.get_event_loop().run_in_executor( None, input, 用户: ) if user_input.strip().lower() exit: print(退出程序) break user_msg Msg(user, user_input, roleuser) # 所有 Agent 观察输入 for agent in [template_agent, rewrite_agent, sql_agent, analysis_agent]: await agent.observe(user_msg) # Step 1️⃣ 模板匹配 template_res await template_agent.reply(user_msg) if template_res.content.strip().upper() NO_MATCH: # 模板失败 → 走 改写 → SQL → 分析 print( 模板匹配失败进入改写流程) final_msg await sequential_pipeline([rewrite_agent, sql_agent, analysis_agent], user_msg) elif template_res.content.strip().upper() NO_CONTEXT: # 无上下文 → 走 SQL → 分析 print( 无上下文进入SQL流程) final_msg await sequential_pipeline([sql_agent, analysis_agent], user_msg) else: # 模板成功匹配 → 走 SQL 分析 print( 模板匹配成功直接进入分析流程) final_msg await sequential_pipeline([analysis_agent], template_res) # 所有 Agent 观察结果 for agent in [template_agent, rewrite_agent, sql_agent, analysis_agent]: await agent.observe(final_msg) print(\n - * 50)代码中在启动时先创建了四个智能体通过if else 来串联业务分支一个分支对应由 sequential_pipeline() 构建一个包含多Agent组成的管道管道内部每个 Agent 实现独立职责并通过 Msg 消息结构传递数据与上下文记忆InMemoryMemory。多轮对话之上下文记忆全局变量先看上下文记忆的相关机制每个 Agent 都可以观察多轮对话通过上下文memory支持多轮追问与问题补全。如下面这段代码所示将用户输入问题user_msg以及最终输出结果final_msg通过调用agent.observe这个方法来告知所有的智能体user_msg Msg(user, user_input, roleuser)# 所有 Agent 观察输入for agent in [template_agent, rewrite_agent, sql_agent, analysis_agent]: await agent.observe(user_msg)......# 所有 Agent 观察结果for agent in [template_agent, rewrite_agent, sql_agent, analysis_agent]: await agent.observe(final_msg)同时在所有Agent智能体的实现代码中都定义了observe这个方法来接收用户输入和系统输出的上下文对话历史并保存到Agent内部的记忆模块async def observe(self, msg: Msg | list[Msg] | None) - None:await self.memory.add(msg)智能体内部记忆模块都会持有多轮对话的上下文历史供处理用户新输入时使用当然实际本案例中只有问题改写RewriteAgent才需要使用多轮对话上下文其从记忆模块中获取上下文并用于问题改写的代码逻辑如下async def reply(self, msg: Msg) - Msg: 理解意图并改写 print( Rewrite Agent ) user_query msg.content # 从记忆中取出历史上下文 history await self.memory.get_memory() # 构造 prompt user_prompt f 用户的问题可能是不完整的追问或模糊描述请结合上下文补全成一个清晰的问题。 【当前问题】 {user_query} 请将上面的问题改写成一个**可独立理解、完整表达查询意图**的自然语言问题。 要求 1. 根据原意图内容补充信息完善条件即可无须发散联想 2. 不超过 50 字 3. 仅输出改写后的问题内容 prompt await self.formatter.format([ Msg(system, 你是一个查询意图理解与改写专家。, system), *history, Msg(user, user_prompt, user), ]) result await self.model(prompt) final_res await get_response(result) print(f✍️ 改写后问题{final_res})基于这段代码针对用户简写的问题“录取人数呢”根据历史对话“2018年考生人数”相关的记忆来改写改写补全后就变成“2018年录取人数有多少”的完整问题。除了记录多轮对话输入/输出Msg的上下文记忆模块Memory之外还可以利用全局变量方式在多个智能体Agent之间进行结构化的参数传递如下定义一个全局变量stata存放历史查询SQL的模板方便后续同类问题直接使用# # 全局变量定义# class State(TypedDict): original_intent: Optional[str] # 如 2016年考生人数有多少 last_sql_template: Optional[str] # 带占位符的 SQL 模板如 SELECT ... WHERE year {year}state State()就可以实现在前一轮对话时在SQLAgent智能体中将根据用户问题匹配到的表结构信息生成对应查询SQL后将该SQL和用户问题都置入全局变量中plaintext # 生成 SQL 模板简单年份/数字替换 template_sql re.sub(r\b(19|20)\d{{2}}\b, {year}, sql) # 年份 template_sql re.sub(r\b\d\b, {year}, template_sql, count1) # 兜底替换第一个数字 print(f 原始意图: {user_query}) print(f 保存 SQL 模板: {template_sql}) state[original_intent] user_query state[last_sql_template] template_sql然后在下一轮对话时在TemplateAgent智能体中再从全局变量中取出该信息利用LLM判断用户最新查询意图和全局变量中的用户问题是否同一种问题只是查询条件不同的追问如只是从2016年换成2018年如果是的话就直接利用全局变量中的SQL替换掉查询条件进行查询即可这样就不用走后续的SQLAgent再去重新利用LLM去构建SQL了。plaintext plaintext print( 检测到历史上下文尝试参数化追问) try: # 1. 用 LLM 从追问中提取参数 extract_prompt f 原始意图: {state[original_intent]} 当前问题: {user_query} 请判断一下用户是否在进行年份的追问。 1、如果不是对年份的追问直接输出空JSON {{}} 2、如果是追问从中提取**变化的参数值**年份以 JSON 格式返回。 示例 - “那2017年呢” → {{year: 2017}} 只输出 JSON不要其他内容。 formatted await self.formatter.format([ Msg(system, 你是一个参数提取器。, system), Msg(user, extract_prompt, user), ]) result await self.model(formatted) json_str await get_response(result) print(f 提取参数: {json_str}) params json.loads(json_str) if not yearinparams: print(⚠️ 年份参数提取失败进入改写流程) returnMsg(self.name, NO_MATCH, roleassistant) # 2. 填充 SQL 模板 try: new_sql state[last_sql_template].format(**params) print(f️ 生成新 SQL: {new_sql})按上面三段代码所示通过全局变量state就可以实现多轮次对话之间的结构化参数传递。案例测试结果运行验证结果如下启动 AgentScope 多智能体系统输入 exit 退出 用户: 2016年考生人数有多少 Template Agent ⚠️ 不存在上下文进入SQL Agent流程 无上下文进入SQL流程 Sql Agent 调用大模型llama2向量化2016年考生人数有多少好的用户问的是2016年的考生人数有多少。首先我需要查看提供的表结构。表名是college_entrance_examination主键是examination_year类型是int。考生人数是candidates_count类型是decimal(10,2)。因为examination_year是主键所以每个年份只有一条记录。因此查询2016年的考生人数不需要用聚合函数直接SELECT candidates_count即可。所以正确的SQL应该是SELECT candidates_count FROM college_entrance_examination WHERE examination_year 2016; 这里不需要聚合函数因为数据是直接存储的不是需要统计的。 大模型生成的SQL: [select candidates_count from college_entrance_examination where examination_year 2016 limit 1] 数据查询成功: [{candidates_count: 940.0}] 原始意图: 2016年考生人数有多少 保存 SQL 模板: select candidates_count from college_entrance_examination where examination_year {year} limit 1 Analysis Agent 好的我现在需要处理用户的问题“2016年考生人数有多少”首先我要确认用户的需求是获取2016年的考生人数。根据提供的表结构信息表名是college_entrance_examination包含高考年份、考生人数和复读人数三个字段。用户提供的SQL查询已经明确筛选了2016年的考生人数结果是940.0万人。接下来。。。。。略 最终回答: 2016年全国高考考生人数为**940.0万人**。该数据来源于考生人数与复读人数信息表college_entrance_examination中2016年的记录。-------------------------------------------------- 用户: 2018年呢 Template Agent 检测到历史上下文尝试参数化追问好的现在我需要处理用户的问题“2018年呢”。首先用户之前问了2016年的考生人数现在问2018年的情况这明显是在进行年份的追问。根据之前的示例用户希望得到一个包含年份的JSON对象。问题中的年份是2018所以需要提取这个参数。检查表结构确认表中确实有examination_year字段类型是int所以2018是有效的输入。用户没有提到其他参数所以只需要返回年份。因此正确的JSON应该是{year: 2018}。 提取参数: {year: 2018}️ 生成新 SQL: select candidates_count from college_entrance_examination where examination_year 2018 limit 1✅ 追问查询成功返回 1 行 模板匹配成功直接进入分析流程 Analysis Agent 好的用户之前问过2016年的考生人数现在又问2018年的我需要快速找到对应的答案。根据提供的表结构和数据信息用户给出的SQL查询是针对2018年的返回的结果是975.0万人。所以。。。。。。就可以直接给出答案了。 最终回答: 2018年全国高考考生人数为**975.0万人**。该数据来源于考生人数与复读人数信息表college_entrance_examination中2018年的记录。-------------------------------------------------- 用户: 录取人数呢 Template Agent 检测到历史上下文尝试参数化追问好的我需要分析用户的问题是否在进行年份的追问。用户之前询问了2016年和2018年的考生人数现在问的是“录取人数呢”。首先用户的问题从“考生人数”转向了“录取人数”这可能涉及到另一个数据点而不是同一字段的不同年份。根据提供的表结构表中只有考生人数和复读人数没有录取人数的字段。因此用户可能在询问另一个未在表中提供的数据而不是同一表中的不同年份。此外问题中没有提到具体的年份也没有使用“那...呢”这样的结构所以这应该不是对年份的追问。因此应该返回空JSON。 提取参数: {}⚠️ 年份参数提取失败进入改写流程 模板匹配失败进入改写流程 Rewrite Agent 好的用户之前问了2016年和2018年的高考考生人数现在问“录取人数呢”。我需要结合上下文补全问题。根据之前的对话用户可能是在比较考生人数和录取人数。所以应该明确年份和具体是哪个年份的录取人数。可能指的是最近提到的2018年所以改写为“2018年全国高考录取人数是多少”✍️ 改写后问题2018年全国高考录取人数是多少 Sql Agent 调用大模型llama2向量化2018年全国高考录取人数是多少好的用户现在问的是“录取人数呢”结合之前的对话历史来看他们之前已经询问过2016年和2018年的考生人数现在想知道2018年的录取人数。根据用户提供的表结构录取人数存储在college_entrance_admission表中具体字段是admission_count并且以万为单位。首先我需要确认用户的问题是否需要使用聚合函数。因为录取人数在表中是按年份记录的每个年份对应一个具体的admission_count值所以不需要SUM或AVG而是直接查询该年份的记录即可。接下来检查表结构admission_year是主键所以2018年只会有一条记录。因此查询应该是SELECT admission_count FROM college_entrance_admission WHERE admission_year 2018。然后确保字段类型是decimal(10,2)所以结果会是精确到小数点后两位的数值。 大模型生成的SQL: [select admission_count from college_entrance_admission where admission_year 2018] 数据查询成功: [{admission_count: 790.99}] 原始意图: 2018年全国高考录取人数是多少 保存 SQL 模板: select admission_count from college_entrance_admission where admission_year {year} Analysis Agent 好的用户现在问的是“录取人数呢”看起来他们之前已经询问过2016年和2018年的考生人数现在想知道同一时期或相关年份的录取人数。我需要先回顾之前的对话历史确保回答的一致性。首先。。。。。。略用户。。。。。。略根据。。。。。。略此外。。。。。。略总结。。。。。。略 最终回答: 2018年全国高考录取人数为**790.99万人**。该数据来源于录取人数与普通高校数信息表college_entrance_admission中2018年的记录。若需了解其他年份的录取人数可提供具体年份以便进一步查询。-------------------------------------------------- 用户:第一轮问题2016年考生人数有多少第一轮没有上下文也没有全局变量模板所以直接走SQL Agent Analysis AgentRAG检索、生成SQL、查数、分析。同时SQL Agent生成成功后记录SQL模板到全局state。第二轮问题2018年呢第二轮我们追问2018年这时存在全局变量模板所以走模板匹配提取年份参数直接查数然后通过业务判断存在数据走Analysis Agent分析。第三轮问题录取人数呢第三轮我们追问录取人数但是匹配不到模板所以上层业务判断走Rewrite Agent SQL Agent Analysis Agent改写问题完善条件。改写时参考Memory中上下文2016和2018年回答改写为2018年全国高考录取人数是多少然后走RAG检索、生成SQL、查数、分析。AgentScope实现小结AgentScope 提供了一个面向多智能体协作的开发框架核心是「消息驱动 管道式执行」模型通过 sequential_pipeline() 串联多个 Agent每个智能体只需实现 reply() 方法。使用 Msg 对象封装上下文支持多模态内容文本、结构化数据等。每个智能体内部InMemoryMemory 提供上下文记忆可实现多轮对话追问。多个智能体之间通过自定义全局变量State实现跨轮次跨智能体的结构化参数传递。利用OllamaChatFormatter 自动拼装 System Prompt 历史记忆实现语义连续性。特点上手快、API 简洁适合快速搭建多智能体应用。内置异步流式输出可直接打印模型“思考过程”。强调「职责分离」每个 Agent 只负责一类任务。适用场景 适合对「智能体职责清晰」「调用链固定」的任务。附录AgentScope中主要管道类型AgentScope中主要有以下三类管道1顺序 Pipeline (sequential_pipeline / SequentialPipeline)函数式调用使用 sequential_pipeline(agents[…], msg…)。agents 参数一个 agent 列表按顺序执行。msg 参数初始消息可以是 None 或一个 Msg 实例作为第一个 agent 的输入。返回值最后一个 agent 的输出消息。类式调用pipeline SequentialPipeline(agents[...])msg await pipeline(msginitial_msg)可以多次调用 pipeline(…) 重用该流水线。适用场景你希望依次将一个 agent 的输出传给下一个 agent——典型的流水线模式。2分发并行 Pipeline (fanout_pipeline / FanoutPipeline)函数式调用 fanout_pipeline(agents[…], msg…, enable_gatherFalse|True)。将同一个输入 msg 分发给 agents 列表中的每一个。返回值一个列表每个 agent 的输出消息。enable_gatherTrue默认会并发执行所有 agent利用 asyncio.gather()适合 I/O 密集型场景。enable_gatherFalse 会顺序执行但是仍是分发模式每个 agent 接收同一个输入。类式调用pipeline FanoutPipeline(agents[...])msgs await pipeline(msginitial_msg)同样可以重用。适用场景你希望多个 agent 基于同一个输入做“并行评估多视角分析”而不是一个接一个。3MsgHub 使用模式MsgHub 是一个异步async上下文管理器传入一个 participants 列表agent 实例列表和一个 announcement 消息。在上下文async with MsgHub(…) as hub:内部参与者 agent 可以互相“观察”(observe) 消息无需手动将一个 agent 的输出专门传给另一个。系统会自动广播。MsgHub 支持动态管理参与者通过 hub.add(…), hub.delete(…) 方法。示例简化版async with MsgHub(participants[alice, bob, charlie], announcementMsg(user, Introduce yourselves., user)) as hub: await alice() await bob() await charlie()在这个例子中alice,bob,charlie 会接收到 announcement互相广播消息无需手动传递。源码参考参与协作的四个智能体以及具体协作控制逻辑代码详见https://github.com/MuKunZiAI/college_entrance_ai/blob/main/agentscope_code/agent_service_pipeline.py。本文总结本文通过高考信息智能查询的业务场景基于AgentScope开发框架实践多智能体协作机制通过管道控制逻辑进行协作通过上下文记忆全局变量实现多轮对话和跨智能体之间参数传递最后分享了AgentScope的几种管道类型。下一篇基于LangGraph框架的多智能体协作机制实践敬请期待。如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询