链载Ai

标题: dify应用:另类的关键词检索 [打印本页]

作者: 链载Ai    时间: 昨天 21:12
标题: dify应用:另类的关键词检索

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(250, 81, 81);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;">背景

在使用ragflow的时候,分片的时候,有个比较好用的功能,就是自动关键词提取功能。
ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;color: rgb(63, 63, 63);">ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;margin: 0.1em auto 0.5em;border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 8px;" title="null"/>

我们在检索的时候,可以通过调整语义和关键词的权重来检索知识。从而实现关键词+语义的互补。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">而在dify的rag中,是没有关键词的。在ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-feature-settings: normal;font-variation-settings: normal;font-size: 12.6px;text-align: left;line-height: 1.75;color: rgb(221, 17, 68);background: rgba(27, 31, 35, 0.05);padding: 3px 5px;border-radius: 4px;">dify1.2.0的时候,dify新增了一个元数据的功能,我们可以给文档设置元数据,从而在检索的时候,通过元数据作为关键词,可以过滤一部分内容。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">但是该功能是文档级别的,并不能匹配到分段内容。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">我们先看下我接下来的检索实验。

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;display: table;padding: 0.3em 1em;color: rgb(255, 255, 255);background: rgb(250, 81, 81);border-radius: 8px;box-shadow: rgba(0, 0, 0, 0.1) 0px 4px 6px;">dify中的检索实验

ingFang SC", "Hiragino Sans GB", "Microsoft YaHei UI", "Microsoft YaHei", Arial, sans-serif;font-size: 14px;letter-spacing: 0.1em;color: rgb(63, 63, 63);">在dify中一共有三中模式。

知识库配置

为了减少干扰,我使用同一个文档,同一个向量模型,4个知识库做测试。

知识库1:bge-m3-向量检索

知识库2:bge-m3- 全文检索

知识库3:bge-m3-混合-权重

知识库4:bge-m3-混合-rerank

测试文档

## 案例1:风寒感冒

- **症状描述**:鼻塞流清涕、畏寒无汗、头痛、咳嗽白痰、舌淡苔白

- **理论依据**:《伤寒论》太阳病理论,寒邪束表致卫阳被遏。大椎为诸阳之会可散寒解表,风门为风邪出入门户,合谷属阳明经通调肺气

- **配穴方案**:大椎、风门、合谷

- **操作流程**:先灸大椎20分钟至潮红,再灸风门15分钟,最后灸合谷10分钟。每日1次,连续3天


## 案例2:脾胃虚寒型胃痛

- **症状描述**:胃脘冷痛、喜温喜按、食少便溏、四肢不温、舌淡胖有齿痕

- **理论依据**:《针灸甲乙经》"中脘主腹胀不通",配合胃经合穴足三里健运脾土,神阙温补元阳

- **配穴方案**:中脘、足三里、神阙

- **操作流程**:神阙隔姜灸5壮,中脘悬灸25分钟,足三里双穴各灸15分钟。饭前操作,隔日1次


## 案例3:寒凝血瘀型痛经

- **症状描述**:经前小腹冷痛拒按、经血紫暗有块、得热痛减、面色青白

- **理论依据**:《妇人大全良方》寒客胞宫理论,关元为任脉与三阴经交会穴,三阴交统调阴经,次髎温通胞宫

- **配穴方案**:关元、三阴交、次髎

- **操作流程**:经前3天开始灸,关元灸30分钟,三阴交双穴各15分钟,次髎20分钟。每日1次至经期第2天

分片设置


分片规则统一如上图。

检索结果

在我的分片内容中有健运脾土这个


向量检索中,能召回到

在全文检索中,反而没有召回到,这就让我有点惊讶(先问了下chatgpt,后续研究下这里的代码)


混合检索-rerank也召回到了

混合-权重也召回到了。

这只是我测试的一个词,而在实际使用的时候,检索效果依赖具体 query 与文本 embedding 的相似度,因此具备不确定性。 而全文检索整个知识库就没有几个文档,就得2~3秒的,性能不高。后续得自己看下源码。

于是我就在想如何加上关键词,让检索更精准。

关键词设置

于是我想到了父子分段的子分段。

我是不是可以在整理数据的时候,提取出关键词,然后将关键词作为子分段,反正父子检索式检索到内容以后,会把整个父分段作为上下文。

于是我让大模型生成关键词,然后添加进去。

子分段作为独立的关键词,并向量化存储,然后检索的时候,理论上应提升检索召回率,但仍依赖 embedding 的语义表达,不能等同于精确匹配

我看了代码,没对query做改写。为啥score这么低?

然后我就问了下chatgpt,回答如下:

这细节上的点,还得深入研究下,看下源代码,以及做更多的样本测试。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5