当前位置: 首页 > article >正文

项目实训——Werewolf-Agent 多智能体狼人杀中DSPy应用优化器优化

一、前言上周我在我们的项目中引入了dspy并使用它进行一个简单的测试在测试过程中我进行了几局游戏发现预言家每次的输出结果都相差不大这让我在玩起来比较无趣因为在每个阶段我都可以预测到他将要说什么那么我就要想办法进行优化。二、原因分析我检查训练数据后发现每次它的输出都与我给他的训练数据相差不大甚至有的是一摸一样的这就让我很好奇为什么这个的提示词优化效果如此之差。经过查阅后我才知道我使用的 BootstrapFewShot 只是dspy所提供的最基础的编译器它的一个大体的工作流程为1. 从训练集中随机抽取一些样本2. 让 LLM 自己解决这些样本3. 挑出 LLM 答对的样本作为 Demo 示例4. 把这些 Demo 附在 Prompt 里让 LLM 模仿那么现在就很清晰了BootstrapFewShot 只是在训练集里挑答案对的它的Prompt 本身是固定的它不会去改进指令的写法这就说明了为什么每次都是差不多的输出。除此之外从它的工作流程中也可以看出它的Demo 选取是随机的不会去考虑如果把其他几道题放在一起会不会有更高的得分那么说明它选择的提示词并不一定是最优解。现在我们组的狼人杀结构简单并不能进行特别多轮的游戏我现在还没测出这个问题但是未来在更多人数的狼人杀要持续十几天的时候肯定会影响我们的提示词的效果。在未来随着数据集增加如果数据集中有更合适的结果组合那么它也不会选取这是未来的一个很大的隐患那么我们就要去替换掉这个基础编译器。那么我先去了解了一下dspy中提供的常见优化器优化器特点适用场景BootstrapFewShot简单、从训练集采样快速原型COPRO自动优化 Prompt 指令指令不够清晰时SignatureOpt优化 Field 描述Signature 设计不优时MIPROv2多目标贝叶斯优化追求最佳效果TelepromptOPTUNA超参搜索大规模调参这里我们选择了优化效果最好的MIPROv2来作为我们这个提示词的优化器MIPRO 全称是 Multi-Instruction Prompt Optimization是 DSPy 中目前效果最好的优化器之一。它的核心思想是在大规模训练集上用贝叶斯搜索自动找到最优的 Prompt 最优的 Few-shot 示例的组合。它解决了BootstrapFewShot优化器没有解决的问题即寻找在该问题上的最优的Few-shot示例这个的实现就是考MIPRO的贝叶斯优化。与简单的暴力穷举去寻找最优的 Few-shot 不同它在最初时候随机试几种组合建立什么样的组合效果好的直觉。然后如果随机测试的方案A效果好那么就在它附近继续探索类似方案。如果在这个区域已经测出高分它就会集中精力在这个区域深挖直至找到最优Few-shot示例与此同时MIPRO还会优化 Prompt 指令它会尝试各种不同的指令写法然后实际运行测试看哪个组合的得分最高。从实现原理上可以很明显看出这个优化器与我现在使用的有了很明显的优化那么我就要进行修改使用这个优化器。三、应用这里我们换一下优化器并设置一下默认参数即可。from dspy.teleprompt import MIPROv2 #换用MIPROv2优化器 optimizer MIPROv2( metricseer_accuracy_metric, num_threads30, # 搜索 30 次找到最优 Prompt Demo 组合 max_bootstrapped_demos4, # 每次试验最多用 4 条自助采样的示例 max_labeled_demos8, # 固定注入最多 8 条示例到 Prompt 中 metric_threshold0.9, )现在我们的训练数据就显得太少了优化器在这些数据中很容易选择到重复的数据。我们让ai来根据我们现在6人狼人杀为我们增添一些数据现在我们来重新训练一下。嗯训练大概花了五分钟确实要比用BootstrapFewShot时间更久毕竟是从中选择最优few-shot示例嘛也情有可原但是训练一次消耗的api有些多这个我就打算先对预言家这一个部分进行优化等学校的api发下来我再对其他几个进行优化钱包有限。接下来我们来测试一下看一下预言家表现如何。第一晚没有信息预言家表现正常。经过多次游戏测试每局预言家都有思考过程变化并不是重复的说明效果可以。但是第二晚以后会出现bug预言家看到消息摘要后会忘记自己是那个机器人导致会进行自查操作。这与之前设置的游戏规则相违背虽说设置了替代操作但是这是我所不想看到的我就去检查dspy中设置的prompt。--- 第 1 次尝试 --- 原始 check_target: Bot4 原始 reasoning: Bot4声称昨晚查验了Bot3是好人而Bot3已经是我已知的金水。Bot4要么是真预言家要么是狼人悍跳。Bot2跳女巫但信息模糊Bot1和Bot5发言偏划水。查验Bot4可以确认他的身份如果他是狼则直接锁定如果他是真预言家则Bot2的狼面上升。 ❌ check_target 无效不在存活列表或为自身 --- 第 2 次尝试 --- 原始 check_target: Bot4 原始 reasoning: Bot4声称昨晚查验了Bot3是好人而Bot3已经是我已知的金水。Bot4要么是真预言家要么是狼人悍跳。Bot2跳女巫但信息模糊Bot1和Bot5发言偏划水。查验Bot4可以确认他的身份如果他是狼则直接锁定如果他是真预言家则Bot2的狼面上升。 ❌ check_target 无效不在存活列表或为自身 这是终端输出他为什么会查验自己 --- 第 3 次尝试 --- 原始 check_target: Bot4 原始 reasoning: Bot4声称昨晚查验了Bot3是好人而Bot3已经是我已知的金水。Bot4要么是真预言家要么是狼人悍跳。Bot2跳女巫但信息模糊Bot1和Bot5发言偏划水。查验Bot4可以确认他的身份如果他是狼则直接锁定如果他是真预言家则Bot2的狼面上升。 ❌ check_target 无效不在存活列表或为自身这里没有检查出什么大问题我在dspy的签名中已经写出了它是预言家并说明是几号。class SeerNightAction(dspy.Signature): 你是狼人杀游戏中的预言家。你需要在夜晚查验一名玩家的身份。 重要规则必须严格遵守 1. 【禁止自查】绝对不能查验自己。你的ID是 seer_idcheck_target 绝不能等于 seer_id。 2. 【只能查存活】check_target 必须是【存活玩家列表】中的人不能查验死人。 3. 推理必须结合存活人物情况 别人发言 你的查验结果。 4. 优先查验声称是神职但无证据者 发言矛盾者 跟风投票者。 5. 发言摘要中会包含自己之前的发言可能会包含一个人跳出来说自己是预言家的消息注意检查是不是自己。 seer_id dspy.InputField( desc你自己的玩家ID例如 Bot5 ) game_state dspy.InputField( desc游戏状态包含存活玩家列表、死亡玩家及死因... ) known_info dspy.InputField( desc你历次查验结果例如第1晚A是狼人第2晚B是好人 ) check_target dspy.OutputField( desc查验目标玩家ID【必须是存活玩家】且【不能等于 seer_id】。 ) reasoning dspy.OutputField( desc推理过程必须结合存活人物情况、别人发言、查验结果进行分析不能脱离上下文, prefix推理 )只能说明是ai在生成时丢弃了这部分只能丢给ai帮我想一下解决办法。它帮我对输出结果添加了更严格的判断对于不符合要求的结果直接打回重新操作if check_target actor: print(f\n 预言家 {actor} 节点执行 ) print(f⚠️ LLM 选择了自己立即强制替换) print(f原始 alive_players: {alive}) print(f原始 roles: {roles}) print(f输入 game_state: {game_state_desc}) print(f输入 known_info: {known_info}) print(f原始 check_target: {check_target}) print(f原始 reasoning: {reasoning}) if valid_targets: check_target random.choice(valid_targets) reasoning f强制替换{reasoning} | 实际查验 {check_target} else: print(f⚠️ 没有可查验的目标) return {} print(f\n最终结果: check_target{check_target}, reasoning{reasoning}) print(f\n) else: print(f\n 预言家 {actor} 节点执行 ) print(f原始 alive_players: {alive}) print(f原始 roles: {roles}) print(f输入 game_state: {game_state_desc}) print(f输入 known_info: {known_info}) for attempt in range(3): print(f\n--- 第 {attempt 1} 次尝试 ---) print(f原始 check_target: {check_target}) print(f原始 reasoning: {reasoning}) if check_target not in alive or check_target actor: print(f❌ check_target 无效不在存活列表或为自身) if valid_targets: check_target random.choice(valid_targets) reasoning f随机查验 {check_target} continue if any(pattern in reasoning for pattern in invalid_patterns): print(f❌ reasoning 包含无效内容: {reasoning}) logger.warning(fSeer reasoning 包含无效内容第{attempt 1}次: {reasoning}) if valid_targets: check_target random.choice(valid_targets) reasoning f随机查验 {check_target} continue print(f✅ 验证通过) break if check_target is None or check_target not in alive or check_target actor: print(f⚠️ 3次尝试均失败使用 fallback) if valid_targets: check_target random.choice(valid_targets) reasoning f随机查验 {check_target} else: print(f⚠️ 没有可查验的目标) return {}修正之后我再进行测试发现问题出现少了。我再进行多次测试发现预言家在后续的发言中表现优异。预测结果较准好人胜率较先前有明显提高。再测试的50局对决中分析日志可以看到好人胜场达到39场。四、结语本周我们对dspy应用进行优化与此同时为训练数据提供更适合的标准为以后的其他节点的提示词提供了一个可靠的模板对于其他部分我们可以使用该节点为模板进行修改验证。后续我们将对metric得分条件进行优化以一个优秀的标准来评判得分情况。

相关文章:

项目实训——Werewolf-Agent 多智能体狼人杀中DSPy应用优化器优化

一、前言 上周,我在我们的项目中引入了dspy并使用它进行一个简单的测试,在测试过程中,我进行了几局游戏,发现预言家每次的输出结果都相差不大,这让我在玩起来比较无趣,因为在每个阶段,我都可以…...

2.3.2_3浮点数的加减运算(舍入问题)

IEEE754定义的4种舍入模式:舍入模式例子:0舍:1入:100类型:...

PR曲线绘制超简单

💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 PR曲线绘制超简单:从入门到自动化实战指南 目录 PR曲线绘制超简单:从入门到自动化实战指南 引言&#xff…...

【无人艇】基于matlab自适应多目标优化的UUV全覆盖路径规划【含Matlab源码 15379期】

💥💥💥💥💥💥💞💞💞💞💞💞💞💞欢迎来到海神之光博客之家💞💞💞&#x1f49…...

Linux USB驱动架构与性能优化实战

1. Linux USB驱动架构深度解析在嵌入式系统开发中,USB驱动作为连接主机与外围设备的关键桥梁,其性能直接影响整个系统的I/O效率。以TI的DaVinci平台为例,其USB驱动实现展现了Linux内核中USB子系统的典型架构与优化技巧。1.1 核心架构分层Linu…...

Python异常检测算法实战:隔离森林与LOF应用解析

1. 异常检测的核心价值与挑战在数据分析的实际场景中,异常点就像沙滩上的珍珠——它们可能代表最有价值的信息,也可能是需要剔除的噪声。我在金融风控领域第一次意识到异常检测的重要性,当时一个看似微小的数据异常背后隐藏着数百万美元的欺诈…...

NitroGen通用游戏AI:从像素到动作的行为克隆模型实战解析

1. 项目概述:从像素到操作,一个通用游戏智能体的诞生 如果你玩过游戏,尤其是那些需要快速反应的动作或射击游戏,你肯定有过这样的体验:看着高手行云流水的操作,心里想着“这操作我上我也行”,结…...

每一次科技的重大变化和政策的重大变化都是一次财富重新分配的机会,有变化就会有需求,你能满足需求就能获得利润

每一次科技的重大变化和政策的重大变化都是一次财富重新分配的机会,有变化就会有需求,你能满足需求就能获得利润 目录 每一次科技的重大变化和政策的重大变化都是一次财富重新分配的机会,有变化就会有需求,你能满足需求就能获得利润 一、第一句解析:稳态市场的利益固化,为…...

信自己,择热爱,事缓则圆

人这一辈子,最靠谱的活法:信自己,择热爱,事缓则圆 你有没有过这样的时刻? 站在人生的岔路口选行业,耳朵里全是外界的声音: “互联网大厂薪资高,挤破头也要进” “体制内才是铁饭碗,别瞎折腾” “这个赛道风口过了,你现在进来就是找死” 你跟着人流往前冲,选了别人…...

OpenClaw System Prompt 构建流程学习笔记

OpenClaw System Prompt 构建流程学习笔记 概述 本笔记详细记录了 OpenClaw 如何将 AGENTS.md 文件内容动态注入到 LLM 的 system 提示词中的完整调用链。该机制是 OpenClaw 工程化设计的核心:用户通过文件系统配置系统行为,而非硬编码。 ✅ 核心结论:AGENTS.md 的内容以原…...

小皮面板完全安装教程:2026年VPS新手从零到上线全攻略

目录 为什么选择小皮面板安装前的准备工作 选择合适的VPS系统要求连接到你的服务器 安装小皮面板 一键安装命令安装过程说明 首次登录与初始配置 访问面板后台修改默认密码开放防火墙端口 部署你的第一个网站 添加站点一键申请SSL证书上传网站文件 数据库管理安全设置建议常见…...

Python实现进化策略算法:原理与优化实践

1. 进化策略算法核心思想解析进化策略(Evolution Strategies, ES)作为一类基于种群的优化算法,其核心思想源于生物进化中的自然选择机制。与传统遗传算法不同,ES更强调参数向量的直接进化而非基因编码的交叉变异。在Python中实现这类算法,我们…...

小红书专业号主体变更流程

小红书专业号主体变更,核心就是把你当前专业号绑定的认证主体、经营主体或者账号归属关系,按照平台规则调整到新主体名下,整个流程资料齐全的话最快2到3个工作日就能完成,不用特意停更或者担心现有粉丝、历史内容受影响。小红书专…...

贝叶斯信念网络:原理、构建与应用实践

1. 贝叶斯信念网络入门指南第一次接触贝叶斯信念网络(Bayesian Belief Networks, BBN)是在研究生时期的一个医疗诊断项目里。当时我们需要建立一个能根据症状推断潜在疾病的概率模型,传统方法在变量间关系处理上捉襟见肘,直到导师推荐了这个"概率图…...

用户上周说有两个孩子,这周说有三个孩子,Agent 如何处理记忆冲突?

首先我们要直到mem0框架,这个框架和RAG类似,RAG存储的数据一般是偏静态偏共享的数据,这类数据一般可以被多人共享,但是mem0的数据一般是用户画像,是偏动态偏隐私的,但是二者的存储策略一般都是使用向量数据库 现在存的数据是用户的相关的数据,所以要使用到mam0框架,mem0的四个…...

循环优化设计

一、循环优化说明 1.循环在高层次综合设计中是广泛被应用的,得到全面的综合支持; 2.循环优化包括pipeline流水优化 3.循环优化包括all unroll展开 4.循环优化包括partitial unrool展开 5.循环优化包括loop_flatten扁平化 6.循环优化包括loop_merge合并设…...

湖州德清县GEO 代理适合跨境电商日常使用吗

引言随着人工智能技术的迅猛发展,AI生成式引擎优化(GEO)逐渐成为企业获取流量和提升品牌曝光的重要手段。特别是在跨境电商领域,如何在众多竞争对手中脱颖而出,吸引目标客户,成为企业关注的核心问题。本文将…...

62、【Agent】【OpenCode】用户对话提示词(交互风格)(二)

【声明】本博客所有内容均为个人业余时间创作,所述技术案例均来自公开开源项目(如Github,Apache基金会),不涉及任何企业机密或未公开技术,如有侵权请联系删除 背景 上篇 blog 【Agent】【OpenCode】用户对…...

ESP32-S3开发板对比与IoT应用解析

1. Unexpected Maker ESP32-S3系列开发板深度解析作为一名长期从事嵌入式开发的工程师,我最近测试了Unexpected Maker推出的三款ESP32-S3开发板——TinyS3、FeatherS3和ProS3。这些板卡在保持原有S2系列外形尺寸的同时,性能得到了显著提升。最让我印象深…...

循环神经网络(RNN)原理与应用:从时序数据处理到LSTM实战

1. 循环神经网络入门:从时序数据到记忆单元我第一次接触循环神经网络(RNN)是在处理股票价格预测项目时。传统的前馈神经网络在处理连续时间序列数据时表现糟糕,因为它们无法"记住"先前的输入。而RNN通过引入循环连接,让信息能够在网…...

硅基演化与碳基锚定——OpenClaw的反熵共同体、协议霸权与后人类纪元的文明契约(第十篇)

硅基演化与碳基锚定——OpenClaw的反熵共同体、协议霸权与后人类纪元的文明契约(第十篇)摘要历经前九篇从代码骨架、生态血肉、经济血脉、安全悖论直至认知内爆与热力学坍缩的层层剥洋葱式解构,我们已将 OpenClaw 从一款风靡全球的“开源龙虾…...

终极安卓大屏控制方案:Escrcpy免费高效多屏管理工具

终极安卓大屏控制方案:Escrcpy免费高效多屏管理工具 【免费下载链接】escrcpy 📱 Display and control your Android device graphically with scrcpy. 项目地址: https://gitcode.com/GitHub_Trending/es/escrcpy 厌倦了在小屏幕上操作手机应用&…...

OpenClaw v2026.4.24 深度解读剖析:从“单一智能体工具”到“全栈AI协作操作系统”的基础设施化跃迁(第九篇)

OpenClaw v2026.4.24 深度解读剖析:从“单一智能体工具”到“全栈AI协作操作系统”的基础设施化跃迁(第九篇)引言:重构与跃迁的奇点在OpenClaw波澜壮阔的2026年4月迭代史中,v2026.4.24版本并非简单的功能累加&#xff…...

为什么你的Dev Container正在悄悄上传源码?揭秘.gitignore之外的5类敏感数据泄漏路径(企业级隔离方案已落地)

更多请点击: https://intelliparadigm.com 第一章:为什么你的Dev Container正在悄悄上传源码? 当你在 VS Code 中启用 Dev Container 并点击“Reopen in Container”时,一个看似隔离的开发环境被启动——但你是否留意过&#xff…...

记录一次Jenkins构建任务的坑

场景 描述下当时的场景,我在项目根目录创建了一个 deploy.sh 脚本, 脚本中完成给脚本赋执行权限、拷贝公共配置文件(application-common.yml)到各服务目录、停止服务、启动新服务这一系列操作, 但 Jenkins 构建完总…...

机器学习概率校准:原理与实践指南

1. 校准分类模型的核心价值 在机器学习分类任务中,我们常常遇到一个关键问题:模型输出的概率是否真实反映了样本属于某类的实际可能性?比如一个二分类模型预测某样本属于正类的概率为0.7,这个数值是否意味着该样本有70%的可能性确…...

重庆二手房历史交易信息2015-2023年

01、数据简介重庆,这座山城,以其独特的魅力吸引着无数人。随着经济的发展和人口的不断增长,二手房市场也日益活跃。为了帮助您更好地了解重庆二手房市场的历史交易信息,本数据库将为您提供全面的数据。重庆二手房市场在过去的几年…...

Mockito 单测入门

Mockito 单测入门 Spring Boot 项目中最精简的 Mockito 示例 — Service / 三方依赖 / Controller1 被测代码准备 以下是一个简单的聊天消息服务,内含需要测试的三种典型场景。 Service public class ChatMsgService {Autowiredprivate ChatMsgRepository repo; …...

百万Token免费用:DeepSeek V4今日全面开放,AI理解力迎来真正普惠

大家好,我是LeafStay。AI科技 今天(4月26日),一件对很多人来说可能会改变工作方式的事情悄悄发生了。国家超算互联网平台正式上线 DeepSeek-V4 限时免费对话服务。核心卖点只有一个:百万Token超长上下文,免…...

HTTP 4xx状态码绕过技术解析与byp4xx工具实战指南

1. 项目概述:一个绕过HTTP 4xx状态码的瑞士军刀 在Web安全测试和日常开发调试中,遇到403 Forbidden、401 Unauthorized这类4xx状态码是家常便饭。它们像一堵墙,告诉你“此路不通”。但很多时候,这堵墙并非坚不可摧,它可…...