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/10/26 2:39:20 阅读更多 →
快速开始: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/10/24 0:31:57 阅读更多 →
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/10/24 8:46:57 阅读更多 →

最新新闻

Electron桌面应用开发实战:从环境搭建到打包发布全流程

Electron桌面应用开发实战:从环境搭建到打包发布全流程

做前端这些年,我大部分时间都在跟浏览器标签页打交道,直到第一次把桌面应用跑起来,才发现原来自己一直被限制在地址栏和刷新按钮围起来的框框里。Electron这个词,最开始是在某段时间频繁出现在同事的讨论里,一个用HTML…

2026/10/27 17:33:32 阅读更多 →
滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

滑盖智能锁T109深度解析:结构原理、安装调试与故障排查

简介:亚太天能T109滑盖智能锁产品说明书是一份PDF格式的官方技术文档,主要面向智能锁安装人员、终端用户及售后维护者,帮助快速掌握产品安装、配置与常见故障处理。全包仅1个PDF文件,大小4.37MB,内容结构清晰&#xff…

2026/10/27 4:06:49 阅读更多 →
PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

PMSM弱磁控制原理与Simulink建模:高速AGV驱动系统设计指南

上个月我在调试一台高速AGV的驱动系统,整车要求空载跑到8m/s,电机转速已经拉到额定点,驱动器的输出电压也顶到了母线电压极限附近。再往上踩速度指令,转速纹丝不动,三相电流反而开始震荡。那会儿我的第一反应就是&…

2026/10/27 7:21:53 阅读更多 →
C++核心知识点:从内存管理到STL的实战指南

C++核心知识点:从内存管理到STL的实战指南

C 这门语言我前前后后折腾了十几年,用它写过嵌入式驱动、做过游戏服务端,也搭过基础组件库。每次看到新人一头扎进"C 核心知识点"这个搜索词,我其实挺感慨的——这门语言的难点从来不是语法多,而是知识点之间的耦合太深…

2026/10/27 18:20:50 阅读更多 →
T109滑盖智能锁怎么装?安装调试与故障排查全攻略

T109滑盖智能锁怎么装?安装调试与故障排查全攻略

简介:亚太天能T109滑盖智能锁产品说明书以PDF格式发布,适合智能锁用户、安装人员与售后维修人员阅读。内容围绕T109系列指纹密码刷卡锁展开,先介绍前面板、后面板、锁体、机械钥匙、电池盒盖等部件名称与功能,再给出完整安装步骤&…

2026/10/27 6:20:47 阅读更多 →
LLM知识降熵:从信息垄断到理解权下放

LLM知识降熵:从信息垄断到理解权下放

你有没有过这种经历:翻开源码注释、论文摘要或者一份专业报告,每个字都认识,连在一起却像天书。想找人聊聊,身边要么没人懂,要么懂的懒得跟你解释。后来我试着把同一段内容丢给一个大语言模型,几秒钟之后&a…

2026/10/27 4:06:50 阅读更多 →

日新闻

周新闻

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 13:55:19 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 7:21:50 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/27 19:19:37 阅读更多 →