【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 提供…...

基于ASP.NET+ SQL Server实现(Web)医院信息管理系统
医院信息管理系统 1. 课程设计内容 在 visual studio 2017 平台上,开发一个“医院信息管理系统”Web 程序。 2. 课程设计目的 综合运用 c#.net 知识,在 vs 2017 平台上,进行 ASP.NET 应用程序和简易网站的开发;初步熟悉开发一…...

visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
电脑插入多块移动硬盘后经常出现卡顿和蓝屏
当电脑在插入多块移动硬盘后频繁出现卡顿和蓝屏问题时,可能涉及硬件资源冲突、驱动兼容性、供电不足或系统设置等多方面原因。以下是逐步排查和解决方案: 1. 检查电源供电问题 问题原因:多块移动硬盘同时运行可能导致USB接口供电不足&#x…...
大语言模型如何处理长文本?常用文本分割技术详解
为什么需要文本分割? 引言:为什么需要文本分割?一、基础文本分割方法1. 按段落分割(Paragraph Splitting)2. 按句子分割(Sentence Splitting)二、高级文本分割策略3. 重叠分割(Sliding Window)4. 递归分割(Recursive Splitting)三、生产级工具推荐5. 使用LangChain的…...
【Go】3、Go语言进阶与依赖管理
前言 本系列文章参考自稀土掘金上的 【字节内部课】公开课,做自我学习总结整理。 Go语言并发编程 Go语言原生支持并发编程,它的核心机制是 Goroutine 协程、Channel 通道,并基于CSP(Communicating Sequential Processes࿰…...
AspectJ 在 Android 中的完整使用指南
一、环境配置(Gradle 7.0 适配) 1. 项目级 build.gradle // 注意:沪江插件已停更,推荐官方兼容方案 buildscript {dependencies {classpath org.aspectj:aspectjtools:1.9.9.1 // AspectJ 工具} } 2. 模块级 build.gradle plu…...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
深入理解Optional:处理空指针异常
1. 使用Optional处理可能为空的集合 在Java开发中,集合判空是一个常见但容易出错的场景。传统方式虽然可行,但存在一些潜在问题: // 传统判空方式 if (!CollectionUtils.isEmpty(userInfoList)) {for (UserInfo userInfo : userInfoList) {…...
云原生周刊:k0s 成为 CNCF 沙箱项目
开源项目推荐 HAMi HAMi(原名 k8s‑vGPU‑scheduler)是一款 CNCF Sandbox 级别的开源 K8s 中间件,通过虚拟化 GPU/NPU 等异构设备并支持内存、计算核心时间片隔离及共享调度,为容器提供统一接口,实现细粒度资源配额…...

向量几何的二元性:叉乘模长与内积投影的深层联系
在数学与物理的空间世界中,向量运算构成了理解几何结构的基石。叉乘(外积)与点积(内积)作为向量代数的两大支柱,表面上呈现出截然不同的几何意义与代数形式,却在深层次上揭示了向量间相互作用的…...