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