请输入密码以查看内容。
保留原有分段方式,但计算每个段落的“干扰率”(标题/大纲对检索结果的影响程度),对高干扰率段落进行特殊处理,减少标题和大纲对检索结果的不当影响。
// 1. 维护单一素材库索引
素材库 = 创建向量索引(所有段落) // 完整格式: "标题\n大纲\n正文"
// 2. 检索实现
function 查询(用户输入):
初步结果 = 素材库.检索(用户输入, top_k=10) // 多取一些用于重排
// 计算干扰率
for 结果 in 初步结果:
标题, 大纲, 正文 = 分离组成部分(结果.文本)
干扰率 = 计算干扰率(标题 + 大纲, 正文, 用户输入)
结果.干扰率 = 干扰率
干扰率阈值 = 1.3
for 结果 in 初步结果:
if 结果.干扰率 > 干扰率阈值:
结果.调整后分数 = 结果.原始分数 / 结果.干扰率
else:
结果.调整后分数 = 结果.原始分数
排序后结果 = 按(调整后分数)排序(初步结果)
return 排序后结果.top(5)
示例段落(分段 3):
***
拆分:
计算(示例假设值):
用户查询:"事业单位领导人员管理规定\n二、任职资格"
结果 | 原始分数 | 说明 |
---|---|---|
分段4 | 0.88 | 与“任职资格”直接相关 |
分段3 | 0.84 | 任职条件相关 |
分段2 | 0.76 | 总则部分 |
接口:POST http://example.com:8080/ai/chat/autoReference
请求体:
{
"searchWord": "人工智能技术\n二、人工智能的发展历程",
"interference": 1.01
}
返回(节选):
{
"success": true,
"data": [
{
"标题+大纲+正文": [{ "score": 0.8789253, "id": "2149793922940857", "content": "..." }],
"正文": [{ "score": 0.866995, "id": "21497939229408532", "content": "..." }],
"计算干扰值": [{ "interferenceRatio": 1.0090, "fullContentScore": 0.87149847 }],
"最后取5个": [{ "score": 0.86370814, "id": "21497939229408515" }]
}
]
}
不改变原有数据存储结构,在检索过程中动态处理段落,解决短段落问题并提升语义完整性。
用户查询:企业管理制度规范岗位要求详细说明
识别原文章节(示意)并合并:
最终检索排序:
利用父子分段结构建立层次化索引:父分段(合并短段)作为高层入口,子分段保留细粒度信息。
获取所有子分段
父分段集合 = []
已合并IDs = set()
阈值 = 200
for i in range(len(子分段)):
p = 子分段[i]
if p.字数 < 阈值:
group = [p]
j = i + 1
while j < len(子分段) and 主题相关(p, 子分段[j]) and 子分段[j].字数 < 阈值:
group.append(子分段[j]); j += 1
if len(group) > 1:
父文本 = 合并(group) // 仅首段保留标题+大纲
父分段集合.add(父文本)
标记已合并
i = j - 1
检索索引用: 父分段 + 未合并子分段
父分段 = 子分段1(标题+大纲+正文) + “\n” + 子分段2(正文) + …
阈值 200 字:分段7 与 分段8 合并 → 父分段 A。
结构:
向量索引:
检索向量集 = { 分段1..6, 父分段A, 分段9 }
父子映射 = { 父分段A: [分段7, 分段8] }
检索示例:"企业管理制度规范\n一、任期规定"
对子分段差值策略:
预处理式优化:在入库前完成分段、排版分析与语义合并,提高索引底座质量。
方案 | 改动范围 | 实施周期 | 优点 | 风险/成本 |
---|---|---|---|---|
方案一 | 检索后置重排 | 短 | 快速上线,侵入低 | 阈值调优依赖实验 |
方案二 | 检索流程动态重组 | 中 | 兼顾完整性与实时性 | 运行期额外计算 |
方案三 | 新增层次索引 | 中偏长 | 多粒度检索灵活 | 维护双索引复杂度 |
方案四 | 数据重入库 | 长 | 基础质量最高 | 改造面大,上线成本高 |
注:文中示例分值均为假设值,仅用于说明计算流程。