基础概念

结构化索引:AI 智能体如何回答关于文档数量的问题

结构化索引是一个小型表格,智能体根据文档中已有的字段(如标题、价格、等级、链接、图片)以及用于语义搜索的向量搜索来构建。向量搜索能找出与问题语义相似的段落,但无法进行计数、按数值过滤或分组。结构化索引则能回答这些问题,并让智能体精确引用链接或标识符,而不是从片段中重构它们。

也叫文档计数 AI知识库聚合文本转 SQL 知识库结构化 RAG混合检索按字段过滤知识库智能体统计问题

询问“你们有多少?”,智能体会基于它恰好检索到的四段文本回答。要求提供链接,它可能会给你一个真实的链接,但该链接属于另一个商品——链接可以打开,图片可以渲染,没有任何报错。以下是其发生的原因以及阻止它的方法:

每份文档都拥有自己的颜色。在左侧——即当前的检索方式——答案的标题来自一份文档,而其链接来自另一份文档,颜色差异立刻暴露了这种不匹配。在右侧,每个检索到的片段都携带其所属文档的事实,而链接根本不是链接:它是一个占位符,模型在从未见过地址的情况下将其复制。真实值在输出时被替换,因此没有任何东西会被混淆。

检索找到的是段落;它看不到整个集合

向量搜索基于相似度工作:你的问题变成空间中的一个方向,最接近它的段落会被返回。这对于“它对 X 说了什么”完全正确,而对于“有多少”、“哪些少于 200 字”或“每类有多少”在结构上则毫无用处——这些是关于整个集合的问题,而检索只查看最近的几个段落。

任何调整都无法解决这一问题。不存在一个阈值能让相似度搜索返回总数,因为总数不是一个段落。

第二个、更安静的失败:一个块不是文档

长文档被拆分成块,以便检索能找到正确的段落。但是你的标题、你的产品代码、你的链接和你的图片位于头部——这意味着它们位于第 1 块,而实际回答问题的段落可能是第 7 块。

因此,模型最终持有来自三到四个不同文档的四到五个片段,它必须弄清楚哪个链接属于哪个标题。它靠猜测。而当它猜错时,答案看起来并没有错:链接是真实的,它可以打开,图片可以渲染——它只是属于另一个商品。没有任何报错。没有人注意到。

在一个包含 4,500 个商品的目录中,20 个测试答案中有 11 个将标题与另一个文档的链接配对。使用上述占位符机制,同样的 20 个答案全部正确返回(20 of 20)。

结构化索引是什么

它是一个小表格,每行对应一份文档,基于你的文档已包含的字段构建。没有发明任何内容,也没有重写任何内容——值是一个字符一个字符地复制出来的。

有了它,智能体有两种回答方式,而不是一种:

问题由...回答
“你们有关于恐龙的东西吗?”向量搜索
“你们有多少?”表格
“关于恐龙的,适合五岁儿童的内容”表格过滤,向量搜索排序
“链接和封面图片是什么?”表格,逐字引用

你不定义字段,但你拥有最终决定权

平台会读取你的几份文档,提出字段建议,然后在保留之前针对你的整个集合验证每个字段。如果一个字段只出现在你五分之一的文档中,它会被丢弃并报告,因为基于它进行过滤会无声地省略其余部分。

你有两种类型的输入:

哪些字段必须精确。 哪个链接是发送给客户的链接,三个代码中哪一个是他们会向你引用的代码——你的数据并未说明这一点,也无法推断出来。提前命名它们,它们就会被逐字提取并逐字引用。

用自然语言进行的更正。 “还要跟踪作者,以便人们可以找到他们的其他书籍。” “我想按插画家过滤。” “删除封面链接。” 更改被提议为对现有表格的补丁,而不是重写,因此对一个字段的请求不会干扰另一个字段。询问你的文档中不包含的内容——例如从未在导出中出现的出版年份——它会告诉你,而不是添加一个空列。

它还告诉你关于你自己数据的信息

因为每个字段在被接受之前都在整个集合中进行测量,所以报告定期揭示无人知晓的事情。在一个包含数千种标题的真实目录中,它发现十分之一的标题页数为零——不是短书,而是缺失值被记录为零,这将拉低所有平均值,并在“最短”中产生大量平局。

该检查必须在某处发生。今天,它通常在客户注意到错误答案时发生。

不适用的情况

如果你的文档是散文——文章、转录稿、通信——则没有什么可以制表的,平台会拒绝构建索引,而不是构建一个由所有不同值组成的索引。这样的表格无法以任何有意义的方式进行计数或分组,拥有它只会引发它回答糟糕的问题。

向量搜索仍然是处理这些材料的正确且唯一的工具。

常见问题

为什么我的智能体无法告诉客户我有多少产品?
因为向量搜索返回的是与问题语义相似的少量段落,而少量段落无法进行计数。这不是调优问题——没有任何设置能让检索返回总数。结构化索引通过查询根据文档已有字段构建的小型表格,来回答计数、范围和分组问题,而向量搜索继续处理关于语义的问题。
智能体会编造链接或产品代码吗?
当字段标记为精确匹配时不会。这些值根本不会显示给模型:模型接收的是占位符,平台在输出时替换为存储的值。模型无法拼写错误它从未见过的 URL。这比听起来更重要——常见的故障不是编造链接,而是返回属于不同项目的真实链接,该链接打开正常且看起来正确。
可以从哪些类型的文档构建此索引?
共享机器可读标头的文档:元数据表、YAML front matter 或 Field: value 行。产品导出、目录、药品说明书、政策时间表和课程列表通常符合条件。纯文本不符合,平台会明确说明,而不是构建一个无用的表格——如果所有值都不同,则无法有意义地进行计数或分组。
我必须自己定义字段吗?
不需要。平台会读取您的部分文档并建议字段,然后在保留之前针对整个集合验证每个字段。您可以随后用自然语言添加、重命名或删除字段,并且可以预先指定哪些字段必须精确提取——标题、链接、图片、代码——因为发送给客户的是哪个链接是一个业务事实,您的数据并未说明这一点。
添加此功能会重新处理我的知识库吗?
不会重新计算嵌入。字段直接从文档中已有的文本中读取,因此构建或更改索引无需重新索引,也不会干扰已经正常工作的向量搜索。
当我添加或删除文档时,它如何保持最新?
新文档在导入时即被读取,使用已建立的规则,因此无需等待模型。索引本身在下一个需要它的查询之前按需重建——添加一千个文档不会触发一千次重建。
想看它怎么实现?检索如何决定回答内容
让它跑起来
搭建知识库

智能体需要知道的东西,绝大部分早就写下来了——在你的官网上,在你团队天天发给客户的那几份 PDF 里。从 URL 导入解决公开的那一半,上传解决剩下的一半。

Storyline

一条 storyline 是一张有向图,智能体会和每个终端用户一起沿着它走——每个节点是一步(有自己的任务、知识和工具),出口携带条件,而每个人的进度、档案和笔记都会跨会话、跨渠道保存并续接。它把一个智能体从做单点任务的助手,变成能亲自交付一套多步骤服务的智能体。

Dynamic Planner

Dynamic Planner 盯着对话:当一位用户正在办的事确实需要多步才能完成、又落在这个智能体的领域之内,而且他明显不确定该怎么往下走时,它会提出把这件事展开成一条临时 storyline——一份由清单驱动、一步一步的计划,随后由智能体每次只专注执行其中一步,进度用户看得见。规划只发生一次,且要过校验;执行是确定性的。

长文写作

长文写作是一个智能体,它通过先规划大纲、在开始之前询问所需的一切、对照你的材料和公开来源研究每个章节,然后逐个章节撰写,从而生成一份完整的多章节文档——例如备案文件、市场进入报告、尽职调查备忘录——且该工作支持断点续传。你可以在聊天旁边的画布中编辑它,通过选中文本来重写任何段落,并且保留每一个版本。