作者:互联网 时间: 2026-09-01 18:51:55
AI 创作历史搜索:向量召回之外,还要保留时间线的重点在于把前置条件、操作顺序和容易误判的地方分清楚。
AI 创作工具里的历史记录通常增长很快。用户生成过的标题、草稿、图片提示词、改写版本和废弃方向都会堆在一起。向量搜索能找到语义相近内容,但它解决不了全部问题。创作历史里,时间、来源、版本和状态同样重要。

例如用户想找“上周那个更克制的版本”,这里的关键词可能并不准确。系统需要同时理解时间范围、编辑动作和语气差异。只做向量召回,可能返回语义相近但时间不对的结果。只做全文检索,又会漏掉表达不同但意图相近的内容。因此搜索层应该是混合模型,而不是单一索引。
一个轻量但有效的方案,是同时维护结构化索引、全文索引和向量索引。结构化索引回答“什么时候、哪个项目、什么状态”。全文索引回答“包含哪些词”。向量索引回答“语义上接近什么”。最后再用重排层把结果合并。
flowchart TDA[创作事件] --> B[结构化字段]A --> C[全文索引]A --> D[向量索引]E[搜索请求] --> F[意图解析]F --> BF --> CF --> DB --> G[候选集合]C --> GD --> GG --> H[重排与去重]H --> I[结果解释]结果解释很关键。用户应该看到某条记录为什么出现:因为同项目、同时间、语义接近,还是包含关键词。没有解释,混合搜索会显得随机。创作工具需要给人可控感,而不是让系统像黑盒一样猜。
多路召回最大的问题是重复结果和慢查询。不要等所有召回都完成再响应。可以给每路查询设置超时,先返回稳定结果,再用渐进式方式补充。下面示例展示一个基本聚合器。
type SearchHit = { id: string; score: number; reason: string };async function withTimeout<T>(task: Promise<T>, ms: number): Promise<T | null> {return Promise.race([task,new Promise<null>((resolve) => setTimeout(() => resolve(null), ms)),]);}export async function hybridSearch(query: string, adapters: SearchAdapters): Promise<SearchHit[]> {if (!query.trim()) throw new Error("empty query");const results = await Promise.all([withTimeout(adapters.keyword(query), 300),withTimeout(adapters.vector(query), 500),withTimeout(adapters.timeline(query), 200),]);const merged = new Map<string, SearchHit>();for (const list of results.filter(Boolean) as SearchHit[][]) {for (const hit of list) {const prev = merged.get(hit.id);merged.set(hit.id, prev ? { ...hit, score: Math.max(prev.score, hit.score), reason: `${prev.reason};${hit.reason}` } : hit);}}return [...merged.values()].sort((a, b) => b.score - a.score).slice(0, 20);}这里没有追求复杂排名,而是先保证稳定性。搜索是高频交互,超过一秒就会破坏创作节奏。把慢召回限制住,比一次返回“理论最优”更重要。
创作历史会带来存储和隐私压力。不是每一次模型响应都值得永久保存。系统可以提供保留策略:只保存被编辑过的结果、只保存进入项目的结果、自动清理未收藏候选。默认策略应该克制,避免把用户的每一次试探都变成永久记录。
向量索引也有更新成本。文本被编辑后,旧向量是否保留?如果保留,会返回过期内容;如果删除,会失去演进线索。更合理的方式是给版本设置状态,默认搜索当前版本,用户展开时再看历史版本。
还有一个边界是“相似但不相关”。创意文本常常有相近词汇,却属于不同任务。重排层应优先考虑项目、时间和用户显式标记。语义分数只能作为参考,不能取代上下文。
AI 创作历史搜索要同时处理语义、时间线和版本关系。落地时可以用结构化索引、全文索引、向量索引组成混合召回,再通过超时控制、去重和结果解释保证体验。搜索系统不应该把历史变成噪音,它应该让曾经有价值的片段,在合适的时候重新浮上来。