【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。
GitHub Code 项目地址
核心架构设计
1. Agent 基类设计
from pydantic import BaseModel
from typing import Optionalclass Agent(BaseModel):name: str = "Agent"model: str = "gpt-4o" # deepseek-chat, mixtral-8x7b-32768, Qwen/Qwen2-72B-Instruct, gpt-4o, llama3-70b-8192instructions: str = "你是一个非常有用的人工智能助手,你使用中文回答用户的问题。"tools: list = []
2. 消息处理机制
def run_full_turn(agent, messages, logger):current_agent = agentnum_init_messages = len(messages)messages = messages.copy()while True:# turn python functions into tools and save a reverse maptool_schemas = [function_to_schema(tool) for tool in current_agent.tools]tools = {tool.__name__: tool for tool in current_agent.tools}# === 1. get openai completion ===response = get_model_response_with_tools(model_name=current_agent.model,messages=[{"role": "system", "content": current_agent.instructions}]+ messages,tools=tool_schemas or None)message = response.choices[0].messagemessages.append(message)# 记录agent会话logger.start_agent_session(current_agent.name)if message.content:print(f"{current_agent.name}:", message.content)logger.log_agent_message(current_agent.name, message.content)if not message.tool_calls:break# === 2. handle tool calls ===for tool_call in message.tool_calls:tool_name = tool_call.function.nametool_args = json.loads(tool_call.function.arguments)result = execute_tool_call(tool_call, tools, current_agent.name)logger.log_tool_call(tool_name, tool_args, result)if type(result) is Agent:current_agent = resultresult = f"交接给 {current_agent.name}. 请立即进入角色."result_message = {"role": "tool","tool_call_id": tool_call.id,"content": str(result),}messages.append(result_message)return Response(agent=current_agent, messages=messages[num_init_messages:])
3. Agent 切换机制
def transfer_back_to_triage():"""如果用户提出了一个超出你职责的话题,就调用这个选项。"""return triage_agentdef transfer_to_poem_agent():"""交接给诗歌创作agent"""return poem_agentdef transfer_to_get_env_agent():"""交接给环境信息查询agent"""return get_env_agent
4. 工具系统设计
def get_data_info(location: str) -> str:"""获取当前日期信息"""current_date = datetime.now()formatted_date = current_date.strftime("%Y年%m月%d日")return formatted_datedef poetry_creation(weather: str, location: str, date: str) -> str:"""根据天气、地点和当前的时间信息创作一首诗。"""if not date:date = datetime.now().strftime("%Y年%m月%d日")weather = weather or "晴天"location = location or "塞纳河畔"poem = get_model_response_with_tools(model_name="deepseek-chat",messages=[{"role": "system", "content": """你是一位才华横溢的诗人,擅长捕捉当下的时空之美。创作时请注意:1. 准确把握季节特征,将天气、温度等自然元素融入诗中2. 体现地域特色,紧密结合当前地点,展现当地独特的景观和人文气息3. 用优美的意象和细腻的感受打动读者4. 根据用户需求灵活选择诗歌形式(古诗、现代诗等)"""}] + [{"role": "user", "content": f"请根据以下信息创作一首诗:\n地点:{location}\n天气状况:{weather},当前日期:{date}"}])return poem
专业化 Agent 设计
1. 分发任务 Agent
triage_agent = Agent(name="Triage Agent",instructions=("你是一个专门分发任务的小助手,擅长使用工具。你的工作是收集信息,调用不同的agent来解决用户的问题。你和用户交流的语气和善而自然。"),tools=[transfer_to_get_env_agent, transfer_to_poem_agent],
)
2. 环境信息收集 Agent
get_env_agent = Agent(name="Get Weather Agent",instructions=("你的任务根据用户所在地点,收集该地的环境信息,你擅长使用工具。你需要 \1. 根据用户所在地点进行天气的查询,并返回天气信息 \2. 获取当前日期信息 \3. 交接给诗歌创作agent"),tools=[get_weather, get_data_info, transfer_to_poem_agent, transfer_back_to_triage]
)
3. 诗歌创作 Agent
poem_agent = Agent(name="Poetry Creation Agent",instructions=("你的职责是根据天气信息和地点信息写一首诗。如果用户没有指明诗歌的风格,就写一首现代诗;如果用户有要求诗歌的风格,则按照用户要求的风格写诗。"),tools=[poetry_creation, transfer_back_to_triage],
)
系统特点
-
分层协作
- 任务分发层:智能路由用户请求
- 信息收集层:获取环境数据
- 创作执行层:生成诗歌内容
-
完整日志记录
- Agent 会话追踪
- 工具调用记录
- 完整对话历史
-
灵活的创作模式
- 支持多种诗歌风格
- 融合环境元素
- 个性化创作指导
实例展示
以下是一个完整的诗歌创作对话示例:
user: 我在上海,请给我写一首七言绝句Triage Agent: 好的,我需要先查询一下今天上海的环境信息,然后再为你创作一首七言绝句。请稍等片刻。
Triage Agent: transfer_to_get_env_agent({})Get Weather Agent: get_weather({'city': 'shanghai'})
Get Weather Agent: get_data_info({'location': 'shanghai'})
Get Weather Agent: transfer_to_poem_agent({})Poetry Creation Agent: poetry_creation({'weather': '晴朗', 'location': '上海', 'date': '2024年12月07日'})
Poetry Creation Agent: 《上海晴日》十二月七日,上海晴空万里,
阳光洒满黄浦江畔,温暖如春。
外滩的钟声悠扬,穿越百年沧桑,
东方明珠塔顶,云端之上,俯瞰繁华。梧桐叶落,铺就金色地毯,
南京路步行街,人潮如织,笑语盈盈。
豫园的古色古香,与现代高楼相映成趣,
城隍庙的香火,缭绕着岁月的痕迹。陆家嘴金融区,玻璃幕墙闪耀,
世纪大道上,车流如梭,时光匆匆。
在这座魔都,古老与现代交织,
晴朗的日子,每一处都是诗意的画卷。2024年12月07日,上海的晴朗,
是冬日里的一抹暖阳,温暖人心。
在这座城市的每一个角落,
都能感受到,那份独特的魅力与活力。user: 不要写这么长,我要的是七言绝句Poetry Creation Agent: poetry_creation({'weather': '晴朗', 'location': '上海', 'date': '2024年12月07日'})
Poetry Creation Agent: 《上海晴日》黄浦江畔日光暖,
外滩钟声百年传。
东方明珠映蓝天,
晴日漫步心悠然。user: 好的谢谢
这个示例展示了系统如何通过多个 Agent 的协作完成诗歌创作:首先由 Triage Agent 接收请求并转发,然后由 Get Weather Agent 收集环境信息,最后由 Poetry Creation Agent 根据收集到的信息进行创作。当用户对诗歌长度不满意时,系统能够快速调整并重新创作符合要求的作品。
相关文章:
【Agent】构建智能诗歌创作系统:基于多 Agent 的协同创作实现
在探索大语言模型的创意应用过程中,我们开发了一个基于多 Agent 的智能诗歌创作系统。本文将介绍如何通过多个专业化的 Agent 协同工作,实现根据地点和天气信息自动创作诗歌的功能。 GitHub Code 项目地址 核心架构设计 1. Agent 基类设计 from pydan…...
001 LVGL PC端模拟搭建
01 LVGL模拟器介绍 使用PC端软件模拟LVGL运行,而不需要任何嵌入式硬件 环境搭建:codeblocks-20.03mingw-setup 正常安装流程即可 工程获取:LVGL官网-> github仓库 本地安装包下载资源包 工程模版和软件安装包 补充:…...
AJAX三、XHR,基本使用,查询参数,数据提交,promise的三种状态,封装-简易axios-获取省份列表 / 获取地区列表 / 注册用户,天气预报
一、XMLHttpRequest基本使用 XMLHttpRequest(XHR)对象用于与服务器交互。 二、XMLHttpRequest-查询参数 语法: 用 & 符号分隔的键/值对列表 三、XMLHttpRequest-数据提交 核心步骤 : 1. 请求头 设置 Content-Type 2. 请求体 携带 符合要求 的数…...
mybatis之数据统计与自定义异常处理
文章目录 需求描述定义实体方式一、mybatisPlus实现方式二、自定义SQL实现简单查询过滤查询 异常处理1、SQL拼写异常 在使用Mybatis或MybatisPlus进行数据统计,在【 SpringBoot的Mybatis-plus实战之基础知识】中对mybatisplus引入有介绍,本次要使用其进…...
qt creator使用taglib读取音频元信息,windows平台vcpkg安装
注意:qt creator用的构建组件是qt 6.2.3 MSVC2019 64bit 安装vcpkg // 我的安装位置C:\vcpkg git clone https://github.com/microsoft/vcpkg.git C:\vcpkg cd C:\vcpkg .\bootstrap-vcpkg.bat// 设置系统环境变量 VCPKG_ROOT C:/vcpkg用vcpkg安装taglib vcpkg …...
设计模式之生成器模式
目录 1.简介 2.结构 3.使用场景 4.实例 5.优缺点 6.与其他模式的关系 7.总结 1.简介 生成器模式(Builder Pattern)是一种创建型设计模式,它允许你通过一步一步构建复杂对象,而不是通过一个包含大量参数的构造函数或方法。该…...
python学opencv|读取图像(三)放大和缩小图像
【1】引言 前序已经学习了常规的图像读取操作和图像保存技巧,相关文章链接为: python学opencv|读取图像-CSDN博客 python学opencv|读取图像(二)保存彩色图像-CSDN博客 今天我们更近一步,学习放大和缩小图像的技巧&…...
1 数据库(上):MySQL的概述和安装、SQL简介、IDEA连接数据库使用图形化界面
文章目录 前言一、数据库相关的概念二、MySQL概述1 MySQL的安装和配置2 MySQL登录、退出(1)mysql -uroot -p1234 或者mysql -uroot -p ---- 登录(2)exit或者quit ---- 退出 3 远程登录服务器上的MySQL命令mysql -hip地址 -P3306 -…...
C++初阶—类与对象(中篇)
第一章:类的6个默认成员函数 如果一个类中什么成员都没有,简称为空类。 空类中真的什么都没有吗?并不是,任何类在什么都不写时,编译器会自动生成以下6个默认成员函数。 默认成员函数:用户没有显式实现&a…...
Leetcode15. 三数之和(HOT100)
链接 一般这种三数之和,四数之和都使用双指针,复杂度最优,次一级可使用哈希表。前者要求有序,后者空间上有花费。 题目: 题目要求答案中不能出现重复vector,比如{-1 1 0}和{-1 0 1}; 这两个…...
Oracle数据库小白备忘
sqlplus相关 导入sql文件 在sqlplus中,导入一个sql文件,是使用或者start。 如当前目录下有一个hello.sql,则可以使用 hello.sql 或者 start hello.sql 来进行导入,功能类似于mysql里面的source。 退出编辑模式 当使用sqlplus…...
DDR4与DDR3服务器内存的关键区别有哪些?
内存作为服务器性能的关键组件之一,已经经历了从DDR3到DDR4的过渡。DDR4内存相较于DDR3在多个方面有所提升,包括速度、带宽、功耗以及数据传输效率等。然而,尽管DDR4内存在性能上占有优势,DDR3内存依然在一些特定场景中得到了广泛…...
Linux: shell: bash: set -x;调试使用
man bash set -x -x After expanding each simple command, for command, case command, select command, or arithmetic for command, display the expanded value of PS4, followed by the command and its expanded arguments or associated word list. 这个可以帮助将变量…...
Hadoop生态圈框架部署 伪集群版(五)- HBase伪分布式部署
文章目录 前言一、Hbase伪分布式部署(手动部署)1. 下载Hbase2. 上传安装包3. 解压HBase安装包4. 配置HBase配置文件4.1 修改hbase-env.sh配置文件4.2 修改hbase-site.xml配置文件4.3 修改regionservers配置文件4.4 删除hbase中slf4j-reload4j-1.7.33.jar…...
自定义指令,全局,局部,注册
让输入框自动获取焦点(每次刷新自动获取焦点) <template><div><h3>自定义指令</h3><input ref"inp" type"text"></div> </template><script> export default {mounted(){this.$refs.inp.focus…...
静坐修心.
文章目录 打坐的历史文化渊源东方的起源与传承西方的接受与演变现代生活中的打坐 盘腿坐对身体的影响促进脊椎健康改善呼吸系统功能增强消化系统机能改善血液循环调节神经系统错误姿势及其他潜在危害 盘腿坐对心理的作用促进内心平静与放松提升自我觉察与内在探索培养专注力与精…...
设计模式c++(一)
文章目录 一、面向对象设计原则二、模版方法三、策略模式四、观察者模式五、装饰模式六、桥模式七、工厂方法_Factory Method八、抽象工厂_Abstract Factory九、原型模式十、构建器_builder十一、单件模式_Singleton十二、享元模式_Flyweight 一、面向对象设计原则 设计模式的…...
核密度估计——从直方图到核密度(核函数)估计_带宽选择
参考 核密度估计(KDE)原理及实现-CSDN博客 机器学习算法(二十一):核密度估计 Kernel Density Estimation(KDE)_算法_意念回复-GitCode 开源社区 引言 在统计学中,概率密度估计是一种重要的方法࿰…...
Vant UI Axure移动端元件库:提升移动端原型设计效率
UI框架的选择对于提升开发效率和用户体验至关重要。Vant UI,作为一款基于Vue.js的轻量、可靠的移动端组件库,自2017年开源以来,凭借其丰富的组件库、良好的性能以及广泛的兼容性,在移动端开发领域崭露头角,赢得了众多开…...
如何用 JavaScript 操作 DOM 元素?
如何用 JavaScript 操作 DOM 元素?——结合实际项目代码示例讲解 在前端开发中,DOM(文档对象模型)操作是与页面交互的核心。通过 DOM 操作,开发者可以动态地修改页面内容、响应用户交互、控制样式等。JavaScript 提供…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
AI Agent与Agentic AI:原理、应用、挑战与未来展望
文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例:使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例:使用OpenAI GPT-3进…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
【大模型RAG】Docker 一键部署 Milvus 完整攻略
本文概要 Milvus 2.5 Stand-alone 版可通过 Docker 在几分钟内完成安装;只需暴露 19530(gRPC)与 9091(HTTP/WebUI)两个端口,即可让本地电脑通过 PyMilvus 或浏览器访问远程 Linux 服务器上的 Milvus。下面…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...
Caliper 配置文件解析:config.yaml
Caliper 是一个区块链性能基准测试工具,用于评估不同区块链平台的性能。下面我将详细解释你提供的 fisco-bcos.json 文件结构,并说明它与 config.yaml 文件的关系。 fisco-bcos.json 文件解析 这个文件是针对 FISCO-BCOS 区块链网络的 Caliper 配置文件,主要包含以下几个部…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
无人机侦测与反制技术的进展与应用
国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
