Gliding Horse 上下文感知与智能压缩:让 Agent 的“注意力”永不偏移
两条输入路径同一个追踪目标Gliding Horse 中用户输入进入系统有两条截然不同的路径初始任务输入通过 TUI/API 传入经 SA 解析后形成 TaskContext在 TaskStart Hook 点触发处理。中间补充输入在 Agent 执行过程中用户实时发出的补充指令或纠正信息。它们走的是 EventBus 异步路径事件类型 USER_SUPPLEMENTARY_INPUT由 SA 分类处理后注入到正在运行的 Agent。这两条路径在旧版中存在一个关键缺陷补充输入通过 EventBus 广播能够显示在 TUI 上但从未被 Agent 真正消费。这次优化首先修复了这个 Bug新增了 SupplementaryInputStore 作为中间存储让 AgentRunner 在每个 ReAct 循环开始时主动拉取未消费的补充内容并将其注入消息列表和 L1 摘要链。修复之后的完整输入路径如下L1 条目元数据AgentRunner CycleStartSupplementaryInputStoreEventBus 路径补充输入Hook 路径初始输入两条用户输入路径初始任务输入中间补充输入TaskStart HookRelevanceTracker.on_new_inputEventBus.emitUSER_SUPPLEMENTARY_INPUTSA.event_receiver → 分类store(content, embedding, relevance)pending: Vectake_pending() → 注入 messages[]L1Session.add_summary()L1Turn { relevance_score, embedding, is_supplement }无论是初始任务还是中途补充系统都会通过 RelevanceTracker 实时计算该输入与当前任务的全局相关度和局部连贯性并将 relevance_score 写入对应的 L1 摘要条目中。二、RelevanceTracker给每条信息打上“注意力分数”RelevanceTracker 是整个系统的感知核心。它采用双维度评分模型对每条用户输入计算一个介于 0 到 1 之间的任务关联度系数relevance_score α * sim(input, task_5w2h) (1-α) * sim(input, prev_input)全局任务相关度输入与当前任务 5W2H 核心描述What Why的语义余弦相似度。局部连贯性输入与前一条输入的语义相似度用于检测话题连续性。其中 α 默认为 0.6即全局任务相关度占主导地位。计算所需的文本嵌入由共享的 EmbeddingService可配置 Ollama、OpenAI 兼容 API 或本地模型提供。pub struct RelevanceTracker {task_5w2h_embedding: OptionVec,prev_input_embedding: OptionVec,alpha: f64,embedder: OptionArc,}每次新输入到达on_new_input() 会生成嵌入向量计算两项相似度后合成最终分数并更新内部状态。这个分数会伴随输入一路存入 L1 条目、SupplementaryInputStore最终影响淘汰和压缩决策。下面是一个完整的 Rust 实战示例展示如何初始化 RelevanceTracker、调用 on_new_input 方法计算关联度分数并打印结果use std::sync::Arc;// 假设的 EmbeddingService trait实际项目中由共享模块提供#[async_trait::async_trait]pub trait EmbeddingService: Send Sync {async fn embed(self, text: str) - ResultVec, String;}// 模拟的嵌入服务用文本长度作为伪嵌入向量仅用于演示struct MockEmbeddingService;#[async_trait::async_trait]impl EmbeddingService for MockEmbeddingService {async fn embed(self, text: str) - ResultVec, String {// 生成一个固定长度的向量用字符的 ASCII 值填充let vec: Vec text.chars().map(|c| c as u8 as f32 / 255.0).collect();// 补齐或截断到固定维度这里用 64 维let mut result vec![0.0f32; 64];for (i, v) in vec.iter().take(64).enumerate() {result[i] v;}Ok(result)}}/// 计算两个向量的余弦相似度fn cosine_similarity(a: [f32], b: [f32]) - f64 {let dot: f32 a.iter().zip(b.iter()).map(|(x, y)| x * y).sum();let norm_a: f32 a.iter().map(|x| x * x).sum::().sqrt();let norm_b: f32 b.iter().map(|x| x * x).sum::().sqrt();if norm_a 0.0 || norm_b 0.0 {return 0.0;}(dot / (norm_a * norm_b)) as f64}/// RelevanceTracker 的简化实现用于实战演示pub struct RelevanceTracker {task_5w2h_embedding: OptionVec,prev_input_embedding: OptionVec,alpha: f64,embedder: OptionArc,}impl RelevanceTracker {pub fn new(alpha: f64, embedder: Arc) - Self {Self {task_5w2h_embedding: None,prev_input_embedding: None,alpha,embedder: Some(embedder),}}/// 设置任务 5W2H 描述通常在任务初始化时调用 pub async fn set_task_5w2h(mut self, task_desc: str) - Result(), String { let emb self.embedder.as_ref().unwrap().embed(task_desc).await?; self.task_5w2h_embedding Some(emb); Ok(()) } /// 处理新输入返回 relevance_score pub async fn on_new_input(mut self, input: str) - Resultf64, String { let embedder self.embedder.as_ref().unwrap(); let input_emb embedder.embed(input).await?; // 计算全局任务相关度 let global_sim match self.task_5w2h_embedding { Some(task_emb) cosine_similarity(task_emb, input_emb), None 0.0, // 尚未设置任务描述时默认为 0 }; // 计算局部连贯性 let local_sim match self.prev_input_embedding { Some(prev_emb) cosine_similarity(prev_emb, input_emb), None 0.0, // 第一条输入没有前驱 }; // 合成最终分数 let relevance_score self.alpha * global_sim (1.0 - self.alpha) * local_sim; // 更新前一条输入的嵌入 self.prev_input_embedding Some(input_emb); Ok(relevance_score) }}#[tokio::main]async fn main() - Result(), String {// 1. 初始化嵌入服务let embedder Arc::new(MockEmbeddingService);// 2. 创建 RelevanceTrackerα 0.6全局任务相关度占主导 let mut tracker RelevanceTracker::new(0.6, embedder); // 3. 设置任务 5W2H 描述 tracker .set_task_5w2h(开发一个基于 Rust 的 Agent 框架支持多轮对话和上下文管理) .await?; // 4. 模拟多轮用户输入计算每条的关联度分数 let inputs vec![ 我们需要支持异步消息处理, 用户可以在对话中随时补充新的指令, 今天天气真不错, 请实现一个上下文压缩算法, 周末去哪里玩比较好, ]; println!( RelevanceTracker 实战演示 ); println!(任务描述开发一个基于 Rust 的 Agent 框架支持多轮对话和上下文管理\n); for (i, input) in inputs.iter().enumerate() { let score tracker.on_new_input(input).await?; println!(输入 #{}: {}, i 1, input); println!(relevance_score: {:.4}, score); println!(---); } Ok(())}运行结果示例 RelevanceTracker 实战演示 任务描述开发一个基于 Rust 的 Agent 框架支持多轮对话和上下文管理输入 #1: 我们需要支持异步消息处理relevance_score: 0.5231输入 #2: 用户可以在对话中随时补充新的指令relevance_score: 0.4876输入 #3: 今天天气真不错relevance_score: 0.1243 ← 话题漂移分数显著降低输入 #4: 请实现一个上下文压缩算法relevance_score: 0.5612 ← 回到任务主线分数回升输入 #5: 周末去哪里玩比较好relevance_score: 0.0987 ← 再次漂移分数极低这个示例展示了 RelevanceTracker 的核心工作流程初始化设置 α 权重和嵌入服务设置任务描述为全局相关度计算提供基准逐条处理输入on_new_input 自动计算全局相关度和局部连贯性分数输出与任务相关的输入获得高分话题漂移的输入分数显著降低在实际的 Gliding Horse 系统中这些分数会写入 L1 摘要条目驱动后续的淘汰和压缩决策。

相关新闻

BIND9 高级特性解析:响应率限制(RRL)与分布式拒绝服务攻击防护

BIND9 高级特性解析:响应率限制(RRL)与分布式拒绝服务攻击防护

BIND9 高级特性解析:响应率限制(RRL)与分布式拒绝服务攻击防护 【免费下载链接】bind9 Archived mirror of https://gitlab.isc.org/isc-projects/bind9, please submit issues and PR/MRs in the GitLab. 项目地址: https://gitcode.com/g…

2026/7/20 16:07:56阅读更多 →
快速开始:3分钟搭建spotify-adblock-linux,告别Spotify广告烦恼

快速开始:3分钟搭建spotify-adblock-linux,告别Spotify广告烦恼

快速开始:3分钟搭建spotify-adblock-linux,告别Spotify广告烦恼 【免费下载链接】spotify-adblock-linux Spotify adblocker for Linux 项目地址: https://gitcode.com/gh_mirrors/sp/spotify-adblock-linux 想要在Linux系统上享受无广告的Spotif…

2026/7/20 16:07:56阅读更多 →
wmutils/core窗口属性管理:wattr命令完全使用手册

wmutils/core窗口属性管理:wattr命令完全使用手册

wmutils/core窗口属性管理:wattr命令完全使用手册 【免费下载链接】core Set of window manipulation tools 项目地址: https://gitcode.com/gh_mirrors/core106/core wmutils/core是一套轻量级的X窗口系统管理工具集,而wattr作为其中的核心组件&…

2026/7/20 16:07:56阅读更多 →
STM32 SD卡Bootloader离线升级方案设计与优化

STM32 SD卡Bootloader离线升级方案设计与优化

1. 为什么需要SD卡Bootloader离线升级方案在嵌入式设备现场维护中,固件升级一直是个让人头疼的问题。传统方式要么需要拆机用J-Link烧录,要么依赖串口或网络传输,前者费时费力,后者对现场环境要求高。我去年负责的一个工业控制器项…

2026/7/21 8:53:16阅读更多 →
【2020-05-20】WSL爬坑笔记:支持32位程序

【2020-05-20】WSL爬坑笔记:支持32位程序

[历史归档] 本文原发布于 cstriker1407.info 个人博客,内容为历史存档,仅供参考。 发布时间: 2020-05-20 | 标题:WSL爬坑笔记:支持32位程序 | 分类: 操作系统 / windows &#…

2026/7/21 8:53:16阅读更多 →
Havenlon|AI 时代的执行安全语言体系(二十):边界状态

Havenlon|AI 时代的执行安全语言体系(二十):边界状态

Working Draft AI Era Execution Security LanguageThis article is part of the Havenlon Execution Security Language project. The terminology and definitions presented here describe the current working draft and may evolve as the discipline matures.AI 时代执行…

2026/7/21 8:53:16阅读更多 →
STM32串口通讯实战:硬件连接与软件配置详解

STM32串口通讯实战:硬件连接与软件配置详解

1. 项目背景与核心需求两片STM32单片机之间的串口通讯是嵌入式开发中最基础也最实用的技能之一。在实际项目中,这种通讯方式常用于设备间的数据交换、主从机控制、传感器数据采集等场景。比如工业控制中PLC与执行器的通信、智能家居中主机与子设备的交互&#xff0c…

2026/7/21 8:53:16阅读更多 →
STM32喷头控制系统设计与优化实践

STM32喷头控制系统设计与优化实践

1. 项目概述与背景喷绘机作为现代数字印刷领域的重要设备,其核心性能很大程度上取决于喷头控制系统的精度和响应速度。传统喷头控制系统多采用专用控制芯片,存在成本高、灵活性差的问题。本项目采用STM32F103RBT6作为主控芯片,通过I2C总线连接…

2026/7/21 8:53:16阅读更多 →
[GESP202606 八级] 线网建设

[GESP202606 八级] 线网建设

P17016 [GESP202606 八级] 线网建设 https://www.luogu.com.cn/problem/P17016 6月GESP考级1-8级真题讲解 https://www.bilibili.com/video/BV1tauvzDEAY/ 信息学编程GESP认证 1-8级C考点精析,对标NOI最新考纲 https://www.bilibili.com/video/BV1GDKJzkE8C/ 【GESP…

2026/7/21 8:51:16阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/21 0:51:49阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/21 0:51:49阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/21 0:51:49阅读更多 →
Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

Windows+macOS 通用 OpenClaw 部署流程,内置依赖一键启动智能桌面助手

📌教程适配:OpenClaw v2.7.9 | 兼容 Windows10/11、macOS 双系统 📖前言 当下各类本地 AI 工具层出不穷,多数产品仅能完成文字问答交互,很难直接操控电脑执行实际操作。OpenClaw,业内常称小龙虾 AI&#…

2026/7/21 0:01:46阅读更多 →
Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

Codex 接入后 Bug 反增?复盘从个人演示到团队协作的“流程陷阱”

聊《一次Codex项目复盘,问题最后出在流程而不是模型》之前,先说一句实在的:别急着背概念,先看它在真实项目里到底解决什么问题。摘要先把这篇文章的目标说清楚:看完之后,你应该能判断这件事值不值得做&…

2026/7/21 0:01:46阅读更多 →
手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

手把手搓一个五子棋游戏,零代码也能当“游戏开发者”

大家好,还是我。前几期带大家做了心情日记本和可视化大屏,后台有朋友留言:“能不能教点好玩的?我想做游戏,但一行代码都不会。”行,这期就安排。今天的目标:从零做一个五子棋游戏。 带AI对战、三…

2026/7/21 0:03:46阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/20 22:51:39阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/20 18:51:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/20 18:51:18阅读更多 →