概述
Ragflow的助理配置中,有很多参数,尽管官方文档给出了一定程度的解释,但不够详细。
本文将对各项参数进行更详细的解释说明,并进一步挖掘某些参数中隐含的潜在陷阱。
助理设置
空回复
含义:输入的问题若未能在知识库中找到匹配的chunk块,就默认输出设置的内容,默认不启用。
这个设置大多数场景都用不到,因为RAG本身就是通过知识库对原本模型回答进行“增强”,除非是要求精确的查询业务,才可能需要设置该值。
显示引文
含义:开启后,会在模型的回答中增加回答的引用提示,默认开启。
此功能还是比较实用的,但存在一个小坑,开启之后,在模型问答时,会在system prompt中添加默认提示,内容在rag\prompts.py
的citation_prompt
:
# Citation requirements:
- Inserts CITATIONS in format '##i$$ ##j$$' where i,j are the ID of the content you are citing and encapsulated with '##' and '$$'.
- Inserts the CITATION symbols at the end of a sentence, AND NO MORE than 4 citations.
- DO NOT insert CITATION in the answer if the content is not from retrieved chunks.--- Example START ---
<SYSTEM>: Here is the knowledge base:Document: Elon Musk Breaks Silence on Crypto, Warns Against Dogecoin ...
URL: https://blockworks.co/news/elon-musk-crypto-dogecoin
ID: 0
The Tesla co-founder advised against going all-in on dogecoin, but Elon Musk said it’s still his favorite crypto...Document: Elon Musk's Dogecoin tweet sparks social media frenzy
ID: 1
Musk said he is 'willing to serve' D.O.G.E. – shorthand for Dogecoin.Document: Causal effect of Elon Musk tweets on Dogecoin price
ID: 2
If you think of Dogecoin — the cryptocurrency based on a meme — you can’t help but also think of Elon Musk...Document: Elon Musk's Tweet Ignites Dogecoin's Future In Public Services
ID: 3
The market is heating up after Elon Musk's announcement about Dogecoin. Is this a new era for crypto?...The above is the knowledge base.<USER>: What's the Elon's view on dogecoin?<ASSISTANT>: Musk has consistently expressed his fondness for Dogecoin, often citing its humor and the inclusion of dogs in its branding. He has referred to it as his favorite cryptocurrency ##0$$ ##1$$.
Recently, Musk has hinted at potential future roles for Dogecoin. His tweets have sparked speculation about Dogecoin's potential integration into public services ##3$$.
Overall, while Musk enjoys Dogecoin and often promotes it, he also warns against over-investing in it, reflecting both his personal amusement and caution regarding its speculative nature.--- Example END ---
由于ragflow原生语言是英文,因此对于中文问题,直接加英文作为系统提示,混杂输入或多或少会影响模型输出性能,因此对于中文用户,建议修改为中文的默认提示:
# 引用要求:
- 以格式 '##i$$ ##j$$'插入引用,其中 i, j 是所引用内容的 ID,并用 '##' 和 '$$' 包裹。
- 在句子末尾插入引用,每个句子最多 4 个引用。
- 如果答案内容不来自检索到的文本块,则不要插入引用。--- 示例 ---
<SYSTEM>: 以下是知识库:Document: 埃隆·马斯克打破沉默谈加密货币,警告不要全仓狗狗币 ...
URL: https://blockworks.co/news/elon-musk-crypto-dogecoin
ID: 0
特斯拉联合创始人建议不要全仓投入 Dogecoin,但埃隆·马斯克表示它仍然是他最喜欢的加密货币...Document: 埃隆·马斯克关于狗狗币的推文引发社交媒体狂热
ID: 1
马斯克表示他“愿意服务”D.O.G.E.——即 Dogecoin 的缩写。Document: 埃隆·马斯克推文对狗狗币价格的因果影响
ID: 2
如果你想到 Dogecoin——这个基于表情包的加密货币,你就无法不想到埃隆·马斯克...Document: 埃隆·马斯克推文点燃狗狗币在公共服务领域的未来前景
ID: 3
在埃隆·马斯克关于 Dogecoin 的公告后,市场正在升温。这是否意味着加密货币的新纪元?...以上是知识库。<USER>: 埃隆·马斯克对 Dogecoin 的看法是什么?<ASSISTANT>: 马斯克一贯表达了对 Dogecoin 的喜爱,常常提及其幽默感和品牌中狗的元素。他曾表示这是他最喜欢的加密货币 ##0 ##1。
最近,马斯克暗示 Dogecoin 未来可能会有新的应用场景。他的推文引发了关于 Dogecoin 可能被整合到公共服务中的猜测 ##3$$。
总体而言,虽然马斯克喜欢 Dogecoin 并经常推广它,但他也警告不要过度投资,反映了他对其投机性质的既喜爱又谨慎的态度。--- 示例结束 ---
关键词分析
含义:开启后,会在模型的回答中增加回答的引用提示,默认关闭。
开启后,对于用户输入的问题会调用rag\prompts.py
的keyword_extraction
进行额外关键词提取,关键词提取会额外使用一轮模型问答,系统默认prompt:
Role: You're a text analyzer.
Task: extract the most important keywords/phrases of a given piece of text content.
Requirements: - Summarize the text content, and give top {topn} important keywords/phrases.- The keywords MUST be in language of the given piece of text content.- The keywords are delimited by ENGLISH COMMA.- Keywords ONLY in output.### Text Content
{content}
同理,对于中文用户,可以设定为中文提示:
角色:文本分析器
任务:提取给定文本内容中最重要的关键词/短语
要求:
- 总结文本内容,给出前{topn}个重要关键词/短语
- 关键词必须使用原文语言
- 关键词之间用英文逗号分隔
- 仅输出关键词### 文本内容
{content}
提取完关键词后,直接加在问题后面,相当于在prompt中对问题进行显性强化,这样方便在进行知识检索中进行关键词匹配。
这个功能比较看重实际场景,比如,对于数据精确度较高的业务,建议开启,这样更容易匹配到准确信息。对于普通问答业务,不建议开启,因为会减慢模型响应速度。
文本转语音
含义:开启后,需要在系统模型设置中配置TTS模型,模型回答后,可点击播放声音按钮,直接听语音,默认关闭。
很鸡肋的功能,开启后无疑会显著增加响应时间,绝大多数场景中用不到语音。
Tavily API Key
含义:用于将问题通过 Tavily 提供的外部资料库进行进一步检索,默认关闭。
这个功能不会将本地知识库信息泄露到外部,而是在查完本地之后,再查一遍外部公网上的资料。个人认为没有开启的必要,因为需要网上的资料,直接用现成公开模型平台的联网搜索就可以了。
提示引擎
相似度阈值
含义:如果查询和块之间的相似度小于此阈值,则该块将被过滤掉,默认值0.2。
输入问题时,系统在查询时会进行两个操作,一方面提取关键词,另一方面通过embedding模型变成词向量,分别计算关键词相似度和向量余弦相似度,最终相似度通过两者加权得到,最终相似度如果超过此阈值,表明检索成功。如果经常检索不出内容,可以适当调低该值。
看源码时,还发现一个小细节,在进行关键词提取时,系统还会进行同义词查询,默认字典路径为rag\res\synonym.json
。
关键字相似度权重
含义:在混合检索中,赋予关键字相似度的权重,默认值为0.7,向量余弦相似度权重为1-0.7=0.3。
如果业务是偏向精确搜索,可调大该值,如果偏模糊搜索,可适当降低该值。
Top N
含义:输入到 LLM 的最大块数。换句话说,即使检索到更多块,也只会提供前 N 个块作为输入。
多轮对话优化
含义:利用多轮对话中的现有上下文来增强用户查询,默认启用。
非常鸡肋的功能,前文分析过,开启该功能后,在进行2轮以上对话时,会额外进行一轮大模型问答来优化第二次及以后提问的prompt,影响模型响应速率,建议关闭。
使用知识图谱
含义:是否在检索多跳问答时使用指定知识库中的知识图谱,默认关闭。
知识图谱会极大增长检索时间,除非业务特殊要求,否则不建议使用。
推理
含义:通过类似Deepseek-R1/OpenAI o1的推理过程来生成答案,开启后聊天模型在回答问题时,遇到未知话题时会自主推理,生成答案。
如果用DeepSeek-R1系列模型,本身就是推理模型,不需要开启。
Rerank模型
含义:使用重新排序模型,需要在系统模型设置中进行配置,作用是对检索内容进行重新排序。如果开启,混合相似度计算会使用关键词相似度和重排器评分,重排器评分权重为1-关键字相似度权重
。
个人觉得用Rerank作用不大,重排序的出发点是用来解决embedding固有的一些局限性问题,比如,"查找2025年4月3日的资料"容易检索到”2024年4月3日的资料“,因为它俩就一字之差,在向量空间中可能是很接近的。ragflow已经采用了关键词加权检索来尽可能避免这个问题,再加一个重排序,有点过于保守,反而还会降低响应速度,因此不建议配置。
变量
含义:系统提示中要使用的变量,{knowledge}为特殊变量,用来将检索的知识添加到系统prompt中。
有点鸡肋的功能,如果需要修改系统prompt,直接改就行了,这里设置成变量形式,可能是为了后续拓展考虑,现阶段作用不大,保持原样即可。
模型设置
模型设置这几个参数是LLM的固有属性,系统并不会因此采取特殊策略。
温度
含义:控制生成文本的随机性和创造性,技术原理是通过softmax函数调整token概率分布的平滑程度。
低温度 (如0.1-0.5):
- 输出更确定、保守
- 倾向于高频词,适合事实性回答
- 示例:客服机器人回答"如何重置密码?"
高温度 (如0.7-1.0):
- 输出更随机、有创意
- 可能生成非常用词,适合诗歌/故事
- 示例:写科幻小说开头时使用
Top P
含义:从概率最高的词汇中动态划出一个范围,只从这个范围内随机选择下一个词。
概念比较抽象,举个例子解释:
问题:续写句子 “The scientist discovered…”
模型预测的下一个词概率可能如下:
- “a” (0.4)
- “the” (0.3)
- “that” (0.15)
- “an” (0.1)
- “quantum” (0.05)
- 如果 p=0.8:候选池 = {“a”, “the”, “that”}(累计概率0.4+0.3+0.15=0.85)
可能生成:“The scientist discovered the…”- 如果 p=0.95:候选池 = {“a”, “the”, “that”, “an”, “quantum”}可能生成:“The scientist discovered quantum…”(更有创意但风险更高)
通常,该值和温度联合使用,用来控制输出保守或激进:
保守输出(如问答):
- p=0.5~0.8(避免冷门词,保持准确性)
创意输出(如故事):
- p=0.9~1.0(允许更多可能性)
存在处罚
含义:通过惩罚对话中已经出现的单词来抑制重复单词的出现。
比较容易理解,模型输出过的token会被降权,防止模型在同一个话题来回打转。
频率惩罚
含义:与存在惩罚类似,抑制模型输出相同的内容。
存在处罚是出现过就惩罚一下,通常是固定值;频率惩罚是出现频率越高,惩罚强度越大。
对于严谨的问答场景,这两个值就稍微调大;创意写作场景,这两个值就稍微调小。
如何加速模型聊天响应
我上一篇文章略微提到过加速模型响应的思路,在官方文档中,也给出了以下几点加速小贴士:
-
在聊天配置对话框的提示引擎选项卡中,禁用多轮优化将减少从 LLM 获取答案所需的时间
-
在聊天配置对话框的提示引擎选项卡中,将重新排名模型字段留空将显著减少检索时间
-
使用重新排序模型时,请确保您有 GPU 来加速;否则重新排序过程将非常缓慢
-
在聊天配置对话框的助手设置选项卡中,禁用关键字分析将减少从 LLM 接收答复的时间
总结一下,加速方式总共就两个方向,一个方向是关闭没必要的选项,另一个方向是用GPU来加速embedding的过程。
官方给的docker启动方式是运行这个文件:docker-compose.yml
,如果使用其内置的embedding,可以通过这个文件docker-compose-gpu.yml
进行启动,这会运行docker调用存在gpu资源,一定程度上让内置模型进行加速。
如果用的是ollama等其它框架外挂的embedding模型,可以忽略这一点。
修改默认值
其实官方也明确知道,多轮对话优化会影响模型输出速度,然而它仍然将其保持了默认开启的状态,下面就通过修改初始值的方式,将其默认状态设置为关闭。
助理相关的聊天配置文件在src\pages\chat\chat-configuration-modal
这个文件夹下。
比如,想将多轮对话优化
选项关闭,就修改prompt-engine.tsx
的这部分内容:
<Form.Itemlabel={t('multiTurn')}tooltip={t('multiTurnTip')}name={['prompt_config', 'refine_multiturn']}initialValue={false}>
其它初始值的设置方式同理。
为什么模型不听话?
之前有群友问到过这个问题,即设置了系统prompt,也在聊天时进行强调,为什么模型不按指定的规则来?在看官方文档时,发现官方也特意强调了这个问题(看来问的人真的很多),这里顺带一提。
参考这个issue:
https://github.com/infiniflow/ragflow/issues/5627
这个用户提了一个问题:为什么问答时,模型没有正确检索到本该检索到的内容?
最后结论是,把DeepSeek-R1:14b
切换成DeepSeek-R1:32b
就解决了。
因此,想要模型正常理解意图,至少采用32b以上的模型。
文档解析的正确姿态
估计不少人都和我一样,在向数据库添加文件时,直接在知识库界面点这里的上传本地文件:
其实这样操作会对文件管理产生问题,点到文件管理中,所有文件会被存放到.knowledgebase
文件夹。
因此,正确上传文件的姿态应该是先进入到文件管理界面,上传文件,上传完之后,选择链接到知识库
。
这样,同一个文件夹是可以被多个知识库共享的,这样操作会更方便文件管理和知识库的精细分类。
可参考的提示词模板
看了系统内置的一些提示词,不免对系统提示词的设计再进行反思。
目前,新建助理时,默认的系统提示词如下:
你是一个智能助手,请总结知识库的内容来回答问题,请列举知识库中
的数据详细回答。当所有知识库内容都与问题无关时,你的回答必须包
括“知识库中未找到您要的答案!”这句话。回答需要考虑聊天历史。
以下是知识库:
{knowledge}
以上是知识库。
这样写比较通用,如果和实际业务结合,建议进行相应修改。
视频[2]给出了一个可供参考的提示词构建步骤:
- 指定角色:明确让 AI 扮演的角色,例如情感专家、健身教练或知名人士。
- 描述问题:提供背景信息,包括现状、目标和限制条件,例如年龄、体重、时间和资源。
- 提出请求:清楚地告知 AI 你需要的具体任务,如制定减肥计划、分析分手原因或翻译文章。
- 选择格式:指定结果的呈现形式,如表格、邮件、合同等,并细化需求,如加粗重点。
- 设定语气:说明期望的沟通风格,如正式、尊重、友爱等。
- 提供参考:附加具体的案例或样例,以便 AI 更精准地理解和执行。
参考
1.官方文档:
https://ragflow.io/docs/dev/start_chat
2.我用了3年的AI提示词万能公式,5分钟解决70%提示词问题~:
https://www.bilibili.com/video/BV1ib421E7Sy