RAG 的是与非、Rewrite 和 Rerank

本文探讨了RAG(检索加生成)模型中的Rewrite和Rerank的重要性。作者指出,Rewrite用于改进用户输入问题的清晰度,提高检索的多样性,而Rerank则用于确保检索结果的相关性。通过实例和代码演示,作者阐述了如何在实际工程中实现这两个步骤,同时强调了在AI模型如Llama3中,Rewrite和Rerank的功能独立于模型的推理能力。文章还反映了对社交媒体上信息筛选和定义现象的思考。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

有时候,我觉得人类还真是种擅长画地为牢的动物,因为突然发现,当人们以文化/理念的名义形成团体/圈子的时候,其结局都不可避免地走向了筛选和区分的道路。或许,大家都不约而同地笃信,在成年人的世界里,那条不成文的社交潜规则——“只筛选不教育,只选择不改变”。与千百年前百家争鸣不同,团体/圈子间并不热衷于交流,倒像是一种标签化的分类方式,甚至是一种非黑即白的二元分类方式。比如,通常人们认为男性不能讨论女性主义,可我经常在女性主义视角下看到对男性的讨论。女性朋友们一致认为,女性种种不幸完全是由男性以及男性背后的父权造成的。于是,在小红书上打着不被定义的标签的女性们,自顾自地定义着别人。亦或者,在这个内卷的世界里,人们被互相定义、被资本定义、被用户画像定义、被美颜相机定义……这种种的定义,最终会成为我们所有人的宿命。鲁迅先生说,中国人的性情是喜欢调和折中的,对此我表示怀疑。因为,以如今的现状而言,中国人或许更喜欢玉石俱焚。在我看来,标签是定义、是附和、是选择,无论我们是否知晓,那条路是否能代表未来。

是非善恶

最近,Meta 发布了 Llama3,一时风光无二。微软不甘示弱,紧随其后发布了 Phi-3。曾经,我认为在小红书上检索信息比百度更高效,可当我批评完百度的竞价排名后,我发现小红书上的广告问题更严重,特别是 AI 的加入让这一问题愈发严重。回到 AI 话题,最近人们对于大模型的态度大致可以总结为:对 Llama3 和 Phi-3 寄予厚望,认为它们接近 GPT-4 的水平,而对 OpenAI 以及 GPT-5 的前景则持续看衰。我不太关心这些预期,我在意的是新模型发布以后,各路牛鬼蛇神都可以活跃起来。小红书上有一篇帖子提到,Llama3 的发布使得本地化 RAG 更有意义,并分享了一个使用 LlamaIndex 实现 RAG 的案例,随后是小红书上经典的套路:私信、拉群、发链接。我对帖子中的观点保留态度,因为 Llama3 作为大型模型,主要解决的是推理问题;而 RAG 是检索 + 生成的方案,其核心在于提高检索的召回率,即:问题与文本块之间的相关性。显然,无论 Llama3 是否发布,RAG 都能正常落地。大型模型的推理能力,影响的是最终的生成结果,而非检索的召回率。

在这里插入图片描述

故事的结局是我遭到了反驳,对方质疑我对 RAG 的理解,并建议我阅读她主页的某个帖子,据说是 RAG 论文作者在斯坦福的讲课内容。我原本是打算去学习的,可戏剧性的是,我被对方拉黑了。我还能再说什么呢?当然选择原谅对方。为了证明我对 RAG 的理解没有偏差,我决定分享我最近对于 Rewrite 和 Rerank 的体悟。我想明确指出的是,无需使用 Llama3,只要提升检索部分的召回率,RAG 方案完全可以实施。实际上,我们甚至都不需要 GPT-4 级别的模型,选择一个合适的小模型足矣。我意识到,我最大的错误在于,试图在一个以信息差为生意的人面前打破信息壁垒,帮助他人摆脱知识的诅咒。正如我之前所述,某些团体或圈子的目的并非促进信息流通和交流,而是为了向特定的人群提供通行证,以便在来来往往的人群中筛选和区分同类。或许,你会认为你已经筛选出你想要的人,但从更广阔的视角来看,这不过是另一种傲慢与偏见。当然,你们权利忽视这些问题,就像我不在乎周围环境如何一样。作为一个崇尚科学的人,我只关心真理,除非你的真理更为真实。

实现 Rewrite

在 RAG 的语境中,Rewrite 是重写或者改写的意思。此时,诸位或许会困惑,为什么需要对用户输入的问题进行二次加工呢?在程序员群体中,有一本非常经典的书 ——《提问的智慧》,其核心观点是:在技术的世界里,当你提出一个问题时,最终能否得到有用的答案,往往取决于你提问和追问的方式。以此作为类比,众所周知,人类的输入通常随性而模糊,特别是在使用自然语言作为交互媒介的时候。在这种情况下,大语言模型难以准确理解人类的真实意图。因此,就需要对用户的原始查询进行改写,通过生成多个语义相似但是表述不同的问题,来提高或增强检索的多样性和覆盖面。由于重写后的查询会变得更为具体,故而,Rewrite 在缩小检索范围、提高检索相关性方面有一定的优势。例如,下面的提示词实现了对用户输入的改写:

在这里插入图片描述

实际效果如何呢?我们可以分别在 Kimi 和 ChatGPT 中进行测试。如下图所示,左边为 Kimi,右边为 ChatGPT:

在这里插入图片描述

可以发现,Kimi 在改写的过程中,补充了更多的上下文,比如 “金庸”、“射雕英雄传”,而 ChatGPT 给出的答案则相对保守,甚至出现了 “奥义” 这种动漫作品中的元素。我承认,模型的推理能力是会影响到答案的生成,可这一切与 RAG 中的 Retrieval 无关,因为在那篇帖子里,对方分享的是最简单的 RAG 范式,自然就不包含 Rewrite 与 Rerank。所以,即便 Llama3 的推理能力得到了大幅度提升,它并不会对 RAG 有任何实质性的影响。不知这位女性朋友在评论区大杀四方的时候,是否想明白了这个道理?

# 对问题进行重写的提示词
rewrite_prompt_template = '''
    你是一个帮助用户完成信息检索的智能助理,你的职责是将用户输入的问题,转化为若干个相似的问题,从而帮助用户检索到更多有用的信息。
    此外,你还需要遵守下列约定:
    1、生成的问题必须与原问题存在一定的相关性,至少 >= 50%
    2、生成的问题必须与原问题相似或相近,不得改变用户原有的意图
    3、生成的问题以 JSON 格式返回,示例如下:
    ```
    {
   
   {
        "input": "《越女剑》这部小说主要讲了什么样的一个故事",
        "output": ["《越女剑》这部小说主要情节是什么","《越女剑》这部小说的故事梗概是什么"]
    }}
    ```
    4、每次最多产生 5 个相似的问题

    现在,我的问题是:{question}
    '''

好了,下面我们结合 LangChain 来做具体的工程实践。继续沿用上面的提示词模板,唯一需要注意的是,这里的 JSON 示例需要转义,因为它与变量 question 前后的花括号存在冲突,解决方案是使用两对花括号。方便起见,这里使用 LLMChain 来调用月之暗面的 API 接口,尽可能避免给大家增加心智负担:

llm = ChatOpenAI(
    model_name='moonshot-v1-8k', 
    temperature=0.75, 
    openai_api_base='https://api.moonshot.cn/v1'
### 实现RAG模型中的Embedding重排序 在检索增强生成(RAG)框架下,嵌入(Embedding)重排序(Re-ranking)扮演着至关重要的角色。为了提升最终输出的质量,先通过Embedding模型快速筛选出一批候选文档片段,再利用更精确但计算成本较高的方法对这些初步选定的结果进行二次评估,从而选出最贴合查询意图的内容[^1]。 #### 使用LangChain框架集成MongoDB矢量搜索功能 具体来说,在基于LangChain开发环境里,可以借助MongoDB强大的索引机制加速初次过滤过程。当接收到用户请求时,系统首先调用预训练好的Embedding函数转换成数值表示形式;接着依靠数据库内建的支持高效定位相近项的能力缩小范围至一定数量级内的条目作为备选项提供给后续环节处理[^2]。 ```python from langchain import LangChain, VectorStoreIndexWrapper import pymongo client = pymongo.MongoClient("mongodb://localhost:27017/") db = client["rag_db"] collection = db["documents"] def get_top_k_embeddings(query_embedding, k=5): results = collection.find().sort( [("vector_field", pymongo.ASCENDING)], # 假设已存储好向量字段名为'vector_field' limit=k).hint([("vector_field", "vector")]) top_k_docs = [] for doc in results: top_k_docs.append(doc['text']) return top_k_docs ``` 此段代码展示了如何连接到本地部署的Mongo实例并定义了一个获取前K个最近邻文本记录的方法。实际项目中还需考虑更多细节比如异常捕获、性能优化等。 #### 设计合理的重排序策略 对于进入重排序阶段的数据集而言,不再依赖于预先计算好的固定长度特征向量来进行比较操作。相反,采用动态调整权重的方式衡量每一对问答间的关联度数。这不仅能够有效减少因降维造成的精度下降问题,而且允许引入额外的信息源辅助判断逻辑,例如上下文一致性检测或是外部知识图谱链接分析等等[^4]。 ```python def rerank_documents(query, candidate_texts): ranked_scores = [] for text in candidate_texts: score = calculate_similarity_score(query, text) # 自定义相似度打分算法 ranked_scores.append((score, text)) sorted_results = sorted(ranked_scores, reverse=True) final_output = [item[1] for item in sorted_results] return final_output[:top_n] ``` 上述伪代码给出了一个简单的例子说明怎样遍历所有待审阅材料,并依据自定义规则重新排列顺序返回最优解列表。值得注意的是这里提到`calculate_similarity_score()`应由开发者自行设计实现,它可以根据应用场景灵活选用BM25、TF-IDF或者其他高级NLP技术完成任务目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云来雁去

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值