[RFC] Skill 整包索引与按技能返回搜索结果 #5005
Closed
yeshion23333
started this conversation in
RFC
Replies: 1 comment
|
本方案已实现。 |
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
状态:草案 · 范围:Skill 添加、更新、重建索引和检索
现状依据:9eeeda4e1
整个 Skill 包参与索引;专用
skills/find每个 Skill 返回包内得分最高的一条命中。例如,
SKILL.md只介绍“管理数据服务”,reference/backup.md才写了“跨地域备份恢复”。改造后,搜索这项能力可以找到该 Skill,结果直接指向backup.md。1. 前后变化
L0 是目录简介,L1 是目录概览,L2 是具体文件;索引表示内容可参与搜索。
SKILL.md正文生成;正常添加时不索引SKILL.mdskills/findskills/find返回数量limit=10表示最多 10 个不同 Skillskills/find的uri转为根目录root_uri表示所属 SkillSKILL.md,不遍历附加目录;L0 可能变成纯描述2. 整包处理规则
复用 resource 的目录遍历、文件处理和索引能力。先处理文件,再生成各级子目录摘要;普通文件建立 L2 索引。包内内容属于原 Skill,保持 skills 路径和
context_type="skill"。处理边界:
SKILL.md变更时按 Skill 规则更新主目录摘要。SKILL.md作为普通附件处理;处理范围限于包内文件。3. 检索与返回
专用
skills/find:范围和权限过滤 → 查找包内内容 → 按完整 Skill 根目录 URI 合并 → 每包取最高分 → 排序并取前limit个。专用
skills/find沿用原有的向量相似度得分。每包以最高分排序,同分按 URI 稳定排序。候选结果中不同 Skill 不足时继续查找,直到数量足够或合格候选耗尽。若处理上限导致提前结束,报告结果不完整。翻页按独立索引记录判断进度,同目录的 L0、L1 分别计数。例如,A 包命中两个文件,得分为 0.91、0.84;B 包命中概览,得分为 0.88。最终返回 A 的文件(0.91)和 B 的概览(0.88),A 只占一个位置。不同空间的同名 Skill 分别计数,合并后统一排序和截取。
返回字段
uri、level、score、abstract全部来自同一条最高分命中:uri.abstract.md;L1 指向.overview.md;L2 指向具体文件level0、1或2scoreabstract专用
skills/find的一条结果示例(省略无关字段):{ "name": "data-service", "description": "管理数据服务", "root_uri": "viking://agent/skills/data-service", "skill_md_uri": "viking://agent/skills/data-service/SKILL.md", "uri": "viking://agent/skills/data-service/reference/backup.md", "level": 2, "score": 0.91, "abstract": "跨地域备份恢复的前提、步骤和验证方法。" }接口约定
skills/findroot_uri、skill_md_uri保持原意find/searchsearch(mode="context")read_contenturi读取;专用skills/find不支持该参数skills/find的level、target_urilevel=[2]只返回文件命中。不传层级时允许 L0~L2skills/find权限filter查询,无查询文本score=0,保留索引记录 URI,不额外补 L0、L1 文件后缀ov skills find的终端卡片显示 Skill 根目录root_uri,JSON 保留实际命中字段。**兼容变化:**依赖专用
skills/find.uri获取 Skill 根目录的调用方,应改用已有的root_uri;uri现在可能指向任一层级的命中内容。4. 添加、更新、锁与失败恢复
wait=true到底有几把锁
一次更新锁住 3 处:当前 Skill 包、旧包备份、当前用户的该 Skill 隐私配置。前两处一起获取,配置随后单独获取。 所有范围都包含各自的子目录和文件;未启用隐私配置服务时,只涉及前两处。
这里的“凭证”表示谁还需要继续持锁。包处理任务先在请求内取得自己的一份,写完文件后交给后台;它与更新请求共用同一把当前包锁,可以分别释放。后台接手不会再多锁一处目录。 配置保存、恢复函数内部也复用本次配置锁的持有身份。
相对原实现,增加了当前包从写入到后台结束的持续保护,以及更新期间的备份保护;已有配置锁延长到更新请求成功或恢复收尾。底层仍使用现有路径锁。
正常更新:先获取,再交接,最后释放
图中的“请求收尾”统一指:清理旧备份和空配置目录 → 释放配置锁 → 释放请求持有的当前包、备份凭证。
flowchart TD A["解析、校验新包"] --> B["请求一起锁住:当前包 + 旧包备份"] B --> C["请求锁住隐私配置,再读取旧配置"] C --> D["备份旧文件和索引 → 清理包内旧内容 → 应用新配置"] D --> E["包处理取得当前包的另一份凭证<br/>保存新文件、主目录摘要和来源信息"] E --> F["先交接处理凭证,再入队<br/>后台开始生成摘要和索引;请求仍持锁"] F --> G{"wait 参数"} G -->|true| H["请求等待后台成功<br/>后台释放自己的包凭证"] H --> I["请求收尾,返回成功<br/>三处全部解锁"] G -->|false| J["请求收尾,返回 task_id<br/>配置和备份解锁;后台仍持有自己的包凭证"] J --> K["后台完成或失败并收尾<br/>释放最后一份包凭证,当前包解锁"]后台与请求并行,上图
wait=false分支展示后台尚未完成的情况;若后台先完成,则它先释放自己的凭证。当前包总是等双方都释放才解锁。wait=false成功返回后,后台失败通过任务状态报告,新版保留,不自动恢复旧包。更新异常:先停止本次任务,再恢复,最后解锁
以下流程用于更新的同步异常,以及
wait=true的失败、超时、请求取消或通过任务接口取消后台任务。恢复期间,请求继续持有已取得的包、备份和配置锁。flowchart TD A["更新失败、等待超时或请求取消"] --> B{"本次任务是否已入队?"} B -->|否| C["释放尚未交出的包处理凭证<br/>入队失败则先收回凭证"] B -->|是| D["保存取消状态,阻止迟到消息回写<br/>跳过未开始的工作,停止可中断的计算"] D --> E["等待已经开始的写入及任务清理退出<br/>释放后台包凭证"] C --> F["请求仍持锁<br/>清理新版,恢复旧文件、索引和原隐私配置及历史"] E --> F F --> G{"恢复成功?"} G -->|是| H["清理旧备份"] G -->|否| I["保留可用备份<br/>记录恢复失败和备份位置"] H --> J["释放配置锁,再释放请求的包、备份凭证<br/>返回错误"] I --> J恢复只针对已变更的内容;尚未修改旧包时无需还原。取消后只等写入安全退出及取消清理,不继续等剩余摘要、索引全部算完。 因此错误响应可能晚于
timeout。替换和恢复始终保留当前 Skill 根目录及锁文件,避免恢复过程中提前失去保护。warnings,失败请求保留原错误并记录清理日志服务关停
向量消费者先结束正在进行的写入并退出;Skill 后台随后释放自己的包锁凭证,不再等待尚未执行的向量消息。未完成的消息保留在队列,重启后恢复处理。
哪些操作会等待
wait=false成功返回后即可保存,无需等后台摘要和索引。include_integrity=true会按原有逻辑获取当前包锁,读取文件及校验信息后释放。更新持锁时会发生锁冲突;该读取入口的锁等待时间为 0,获取失败会报错。默认include_integrity=false不走这条加锁路径。添加只取得当前包的处理凭证,写入后交给后台;配置锁只覆盖配置保存。添加部分失败保留成功内容,等待超时只结束等待。重建沿用原入口的锁,等已提交的索引工作收尾后释放;部分失败保留成功内容并报告。更新才需要旧包备份及贯穿请求的配置锁。
文件保存、摘要和索引关联同一个任务,后台入队前创建任务并保存来源信息。取消只作用于本次 Skill 任务。保留各失败文件的明细,同一包只结算一次队列任务;所有工作收尾后全局等待结束,关闭监控统计也不影响等待。Resource、Memory 的添加处理规则不变。
专用
skills/find各页复用同一查询向量;通用搜索的过滤排序及停止规则不变。向量重建兼容旧版纯文本摘要,保留原描述及已有标签等元数据。创建 Skill 任务期间请求被取消,已经保存的任务记录也会结算为失败,正常参与过期清理。5. 启用与已有数据
skills/find按 Skill 合并,每个包占一个结果位置。验收重点:各层内容可命中且主目录规则不变;同包合并后能返回足够的不同 Skill;各接口字段与过滤一致;更新、删除无旧索引残留;失败和超时能完整恢复且迟到任务不能回写;其他 Skill、Resource、Memory 不受影响。性能验证覆盖小包、大量小文件和媒体包。
All reactions