一个爆款rag应用绝对不可能单靠某个框架就可以做出来,我的观点是不要聚焦于rag框架的选择,而是需要彻底了解rag的原理,掌握各个rag框架中的优缺点,这样我们才能根据业务的需求灵活选择各个rag框架中的优势部分。

rag的原理

单纯仅靠LLM会产生误导性的 “幻觉”,训练数据会过时,处理特定知识时效率不高,缺乏专业领域的深度洞察,同时在推理能力上也有所欠缺。

正是在这样的背景下,检索增强生成技术(Retrieval-Augmented Generation,RAG)应时而生,成为大模型时代的一大趋势。

RAG通过在语言模型生成答案之前,先从广泛的专业文档数据库中检索相关信息,然后利用这些专业信息来引导大模型生成的结果,极大地提升了内容的准确性和相关性。

RAG整体技术路线可分为3大块8个小点见图1,其中包含知识库构建、知识检索和知识问答。

img

图1.RAG技术路线

知识库的构建

由图1可知涉及4个小点,分别为:文件预处理、文件切分、向量化和构建索引。

1.文件预处理

输入:原始文件(比如pdf、word等非结构化数据)

输出:纯文本

技术手段:pdf、word解析器,也涉及表格转文本、图片OCR等技术。

对于用户来说,希望通过上传私有领域非结构文档开展大模型知识问答,但是在实际情况中,从文档中需要提取的知识会比较复杂,比如pdf中存在图片、表格、公式等重要信息需要解析。

针对文件预处理这一块,个人觉得比较好用的是ragflow中的deepdoc模块。deepdoc中有两个组成部分:视觉处理和解析器。支持OCR、布局识别、TSR等等,下面列举一个版面分析的例子。

img

2.文件切分

文件预处理后,由于大模型输入token的限制(因为不可能一次性将所有文件,一次输入大模型),需要对文本分段。

最简单的方法,一般采用识别\n字符的方式分段。

 lines = text.split('\n')

仅识别\n字符切分段落会存在一个问题,即切分出来的段落大小长度不在同一长度范围。我们一般采用langchain中的RecursiveCharacterTextSplitter方法,尽量将所有段落(然后是句子,然后是单词)放在一起,因为这些文本在语义上似乎是最相关的文本片段。使用示例如下:

from langchain_text_splitters import RecursiveCharacterTextSplitter

# Load example document
with open("state_of_the_union.txt") as f:
    state_of_the_union = f.read()

text_splitter = RecursiveCharacterTextSplitter(
    # Set a really small chunk size, just to show.
    chunk_size=100,
    chunk_overlap=20,
    length_function=len,
    is_separator_regex=False,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])

除了识别以上方法外,在langchain中还提供了大量文件切分的方法。比如HTMLHeaderTextSplitter,可以提取网页url中的html,并切分。

url = "https://plato.stanford.edu/entries/goedel/"

headers_to_split_on = [
    ("h1", "Header 1"),
    ("h2", "Header 2"),
    ("h3", "Header 3"),
    ("h4", "Header 4"),
]

html_splitter = HTMLHeaderTextSplitter(headers_to_split_on)

# for local file use html_splitter.split_text_from_file(<path_to_file>)
html_header_splits = html_splitter.split_text_from_url(url) chunk_size=100,
    chunk_overlap=20,
    length_function=len,
    is_separator_regex=False,
)
texts = text_splitter.create_documents([state_of_the_union])
print(texts[0])
print(texts[1])

此外还有CharacterTextSplitter、TokenTextSplitter、SentenceTransformersTokenTextSplitter等段落切分方法,可以选择现成已有的包,也可以自定义开发。从上面的小例子可以发现,大模型rag入门并不难,难的是各种细节的调整(比如文件切分和数据处理),会很大程度影响最终rag系统的好坏。正好目前知乎知学堂推出了一门程序员的AI大模型进阶之旅公开课,里面介绍了rag常用的技术,比如段落切分算法如何设计、embedding算法怎么选择、自己怎么搭建rag应用等等。链接放下面啦,感兴趣的同学可以看看。

🔥技术岗高薪必学:AI大模型技术原理+应用开发+模型训练

¥0.00就业无忧

我自己也看了看公开课的内容,老师讲的内容还是挺全面的。如果你对大模型有基础,一定会有相应收获的。

3.向量化

将文本、图像、音频和视频等转化为向量矩阵的过程,也就是变成计算机可以理解的格式。

输入:分段后的文本

输出:向量化后的向量组

技术手段:通过远程调用智谱、OpenAI的embedding模型。

输出结果展示:

img

除了远程调用embedding模型外,还有许多开源可私有化部署的embedding模型可供选择。比如:

  • paddlenlp

个人使用比较好用的是rocketqa-zh-base-query-encoder算法,代码示例如下:

>>> from paddlenlp import Taskflow
>>> import paddle.nn.functional as F
>>> text_encoder = Taskflow("feature_extraction", model='rocketqa-zh-base-query-encoder')
>>> text_embeds = text_encoder(['春天适合种什么花?','谁有狂三这张高清的?'])
>>> text_features1 = text_embeds["features"]
>>> text_features1
Tensor(shape=[2, 768], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[ 0.27640465, -0.13405125,  0.00612330, ..., -0.15600294,
         -0.18932408, -0.03029604],
        [-0.12041329, -0.07424965,  0.07895312, ..., -0.17068857,
          0.04485796, -0.18887770]])
>>> text_embeds = text_encoder('春天适合种什么菜?')
>>> text_features2 = text_embeds["features"]
>>> text_features2
Tensor(shape=[1, 768], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [[ 0.32578075, -0.02398480, -0.18929179, -0.18639392, -0.04062131,
       ......
>>> probs = F.cosine_similarity(text_features1, text_features2)
>>> probs
Tensor(shape=[2], dtype=float32, place=Place(gpu:0), stop_gradient=True,
       [0.86455142, 0.41222256])

paddlenlp支持的embedding算法如下所示:

img

除此之外,还可以尝试智源(BAAI)的bge-large-zh模型。

4.构建索引

段落向量化后,我们需要构建索引,为后续快速向量匹配打下基础。当然,我们也可以不构建索引,写一个for循环挨个匹配,消耗时间长一点而已。

当然在实际生产上线过程中,不可能用for循环挨个比较,这就涉及到构建向量数据库。市场上有许多成熟的向量数据库,一般最常用的是elasticsearch和**milvus**。常规rag框架几乎都支持,下面演示用langchain调用elasticsearch。

from langchain import ElasticVectorSearch
from langchain_community.embeddings import OpenAIEmbeddings

embedding = OpenAIEmbeddings()
elastic_host = "http://127.0.0.1"
elasticsearch_url = f"https://username:password@{elastic_host}:9200"
elastic_vector_search = ElasticVectorSearch(
    elasticsearch_url=elasticsearch_url,
    index_name="test_index",
    embedding=embedding
)
ElasticVectorSearch.from_documents(batch_docs, embedding, elasticsearch_url=elasticsearch_url, index_name="test_index")

向量检索

由图1可知向量检索涉及2个小点,分别为:向量化、知识库检索。

知识库构建完成后,用户输入一个问题,需要对用户的问题向量化。这里的向量检索所涉及到向量化模型需要和上面知识库构建里面向量化所使用到的模型保持一致。

一般根据实际需求,会匹配到k个结果。(一般是按照向量化后的问题与知识库里的向量计算相似度,并从高到低排序,选前k个)

k是一个超参数,用户提供。

匹配的算法一般采用欧氏距离、曼哈顿距离、余弦等。

我们可以采用最简单的余弦相似度来衡量向量之间的相似度。

余弦相似度公式:

img

余弦相似度公式

代码实现如下:

  def cosine_similarity(cls, vector1: List[float], vector2: List[float]) -> float:
        """
        calculate cosine similarity between two vectors
        """
        dot_product = np.dot(vector1, vector2)
        magnitude = np.linalg.norm(vector1) * np.linalg.norm(vector2)
        if not magnitude:
            return 0
        return dot_product / magnitude

以上是最简单的做法,在实际情况中我们还要用到多路召回融合重排序来增广和筛选候选对象。

多路召回策略,指的是采用不同的策略、特征或简单模型,分别召回一部分候选集,然后再把候选集混合在一起供后续排序模型使用。这个很好理解,rag本身做的就是“大海捞针”,候选对象多了,我才可能命中问题相关文档。

但是多路召回会导致候选对象过多,导致召回准确率下降的问题。这个时候需要用到重排序(rerank)。重新排序的任务是评估这些上下文的相关性,并优先考虑最有可能提供准确和相关答案的上下文,让LLM在生成答案时优先考虑这些排名靠前的上下文,从而提高响应的准确性和质量。简单地说,重新排名就像在开卷考试中帮助你从一堆学习材料中选择最相关的参考文献,这样你就可以更高效、更准确地回答问题。

目前rerank模型里面,最好的应该是cohere,不过它是收费的。开源的是智源发布的bge-reranker-base和bge-reranker-large。在实操过程中,个人推荐使用bge-reranker-large重排序模型

知识问答

由图1可知涉及2个小点,分别为:调用提示工程模板、调用大模型LLM。

1. 提示工程模板设计

输入:用户输入的问题和知识库中得到k个相关的段落。

输出:结合提示工程模板,将用户输入的问题、知识库中得到top k个相关的段落组成一个完成的context。

RAG_PROMPT_TEMPALTE="""使用以上下文来回答用户的问题。如果你不知道答案,就说你不知道。总是使用中文回答。
        问题: {question}
        可参考的上下文:
        ···
        {context}
        ···
        如果给定的上下文无法让你做出回答,请回答数据库中没有这个内容,你不知道。
        有用的回答:"""

上面代码中的question就是用户问题,context是top k个相关的段落。

2. 调用大模型LLM

大模型的参数量越大越好,个人使用体验过程中Qwen2-7B-Instruct系列模型效果不错。

总结

本文系统总结了rag原理,并且针对rag各个组成部分,给出了rag各子模块选择的思路和建议。

零基础如何高效学习大模型?

为了帮助大家打破壁垒,快速了解大模型核心技术原理,学习相关大模型技术。从原理出发真正入局大模型。在这里我和MoPaaS魔泊云联合梳理打造了系统大模型学习脉络,这份 LLM大模型资料 分享出来:包括LLM大模型书籍、640套大模型行业报告、LLM大模型学习视频、LLM大模型学习路线、开源大模型学习教程等, 😝有需要的小伙伴,可以 扫描下方二维码免费领取🆓**⬇️⬇️⬇️

在这里插入图片描述

【大模型全套视频教程】

教程从当下的市场现状和趋势出发,分析各个岗位人才需求,带你充分了解自身情况,get 到适合自己的 AI 大模型入门学习路线。

从基础的 prompt 工程入手,逐步深入到 Agents,其中更是详细介绍了 LLM 最重要的编程框架 LangChain。最后把微调与预训练进行了对比介绍与分析。

同时课程详细介绍了AI大模型技能图谱知识树,规划属于你自己的大模型学习路线,并且专门提前收集了大家对大模型常见的疑问,集中解答所有疑惑!

在这里插入图片描述

深耕 AI 领域技术专家带你快速入门大模型

跟着行业技术专家免费学习的机会非常难得,相信跟着学习下来能够对大模型有更加深刻的认知和理解,也能真正利用起大模型,从而“弯道超车”,实现职业跃迁!

在这里插入图片描述

【精选AI大模型权威PDF书籍/教程】

精心筛选的经典与前沿并重的电子书和教程合集,包含《深度学习》等一百多本书籍和讲义精要等材料。绝对是深入理解理论、夯实基础的不二之选。

在这里插入图片描述

【AI 大模型面试题 】

除了 AI 入门课程,我还给大家准备了非常全面的**「AI 大模型面试题」,**包括字节、腾讯等一线大厂的 AI 岗面经分享、LLMs、Transformer、RAG 面试真题等,帮你在面试大模型工作中更快一步。

【大厂 AI 岗位面经分享(92份)】

图片

【AI 大模型面试真题(102 道)】

图片

【LLMs 面试真题(97 道)】

图片

【640套 AI 大模型行业研究报告】

在这里插入图片描述

【AI大模型完整版学习路线图(2025版)】

明确学习方向,2025年 AI 要学什么,这一张图就够了!

img

👇👇点击下方卡片链接免费领取全部内容👇👇

在这里插入图片描述

抓住AI浪潮,重塑职业未来!

科技行业正处于深刻变革之中。英特尔等巨头近期进行结构性调整,缩减部分传统岗位,同时AI相关技术岗位(尤其是大模型方向)需求激增,已成为不争的事实。具备相关技能的人才在就业市场上正变得炙手可热。

行业趋势洞察:

  • 转型加速: 传统IT岗位面临转型压力,拥抱AI技术成为关键。
  • 人才争夺战: 拥有3-5年经验、扎实AI技术功底真实项目经验的工程师,在头部大厂及明星AI企业中的薪资竞争力显著提升(部分核心岗位可达较高水平)。
  • 门槛提高: “具备AI项目实操经验”正迅速成为简历筛选的重要标准,预计未来1-2年将成为普遍门槛。

与其观望,不如行动!

面对变革,主动学习、提升技能才是应对之道。掌握AI大模型核心原理、主流应用技术与项目实战经验,是抓住时代机遇、实现职业跃迁的关键一步。

在这里插入图片描述

01 为什么分享这份学习资料?

当前,我国在AI大模型领域的高质量人才供给仍显不足,行业亟需更多有志于此的专业力量加入。

因此,我们决定将这份精心整理的AI大模型学习资料,无偿分享给每一位真心渴望进入这个领域、愿意投入学习的伙伴!

我们希望能为你的学习之路提供一份助力。如果在学习过程中遇到技术问题,也欢迎交流探讨,我们乐于分享所知。

*02 这份资料的价值在哪里?*

专业背书,系统构建:

  • 本资料由我与鲁为民博士共同整理。鲁博士拥有清华大学学士美国加州理工学院博士学位,在人工智能领域造诣深厚:

    • 在IEEE Transactions等顶级学术期刊及国际会议发表论文超过50篇
    • 拥有多项中美发明专利。
    • 荣获吴文俊人工智能科学技术奖(中国人工智能领域重要奖项)。
  • 目前,我有幸与鲁博士共同进行人工智能相关研究。

在这里插入图片描述

内容实用,循序渐进:

  • 资料体系化覆盖了从基础概念入门核心技术进阶的知识点。

  • 包含丰富的视频教程实战项目案例,强调动手实践能力。

  • 无论你是初探AI领域的新手,还是已有一定技术基础希望深入大模型的学习者,这份资料都能为你提供系统性的学习路径和宝贵的实践参考助力你提升技术能力,向大模型相关岗位转型发展

    在这里插入图片描述在这里插入图片描述在这里插入图片描述

抓住机遇,开启你的AI学习之旅!

在这里插入图片描述

Logo

为武汉地区的开发者提供学习、交流和合作的平台。社区聚集了众多技术爱好者和专业人士,涵盖了多个领域,包括人工智能、大数据、云计算、区块链等。社区定期举办技术分享、培训和活动,为开发者提供更多的学习和交流机会。

更多推荐