使用RAG構(gòu)建高質(zhì)量知識庫

3 評論 1681 瀏覽 13 收藏 13 分鐘

在AI技術(shù)飛速發(fā)展的當下,RAG(檢索增強生成)作為實用的前沿技術(shù),正助力高效構(gòu)建高質(zhì)量知識庫。本文深入淺出地解析RAG的定義、優(yōu)勢、技術(shù)原理,從知識入庫到檢索的全流程,并結(jié)合公司考勤管理制度實例演示其應(yīng)用,助你輕松掌握RAG技術(shù)。

在AI應(yīng)用領(lǐng)域,各種新技術(shù)新名詞層出不窮,但最實用的技術(shù)莫過于RAG了。

相信稍微接觸過AI的同學(xué)都不會陌生,但要想用好RAG,還是有一定門檻。

今天咱們就來聊一聊RAG。

RAG是什么?

檢索增強生成

Retrieval-Augmented Generation

一般用戶在使用大模型的時候,其實只需要使用自然語言問問題,大模型就會返回相應(yīng)的答案。

普通人使用大模型的方式

所以只要掌握好提示詞工程,大多數(shù)場景就已經(jīng)可以讓大模型乖乖給你干活了。想了解提示詞的同學(xué),可以去看上一篇文章。

你真的會寫提示詞嗎?高質(zhì)量提示詞指南來了!

但是大模型能回答的僅限于公域知識。如果你有一個私域文檔,希望大模型根據(jù)文檔的內(nèi)容回答問題。要怎么搞?

也很簡單,只要把文檔丟給大模型讓他參考就可以了。

帶知識庫的交互方式

比如,你有一個文檔《公司考勤管理制度》,只需要把文檔的內(nèi)容全部復(fù)制粘貼到提示詞中,并要求大模型參考知識回答問題即可。

但是,如果文檔非常長,比如是一本書,沒辦法一次性丟給大模型參考,該怎么辦?

這個時候就需要用到我們的 RAG(檢索增強生成)技術(shù)了。

RAG

核心是把知識進行模塊化存儲,使用時按需召回最匹配的知識并作為上下文提供給大模型。

RAG的好處

  • 提高準確性:通過引用外部知識庫,RAG能夠彌補LLM在特定領(lǐng)域知識或最新信息方面的不足,從而提高生成響應(yīng)的準確性。
  • 更新鮮的信息:RAG能夠訪問實時更新的外部數(shù)據(jù)源,使得模型生成的響應(yīng)更加及時和符合最新情況。
  • 降低成本:與重新訓(xùn)練LLM相比,RAG是一種更具成本效益的方式來增強LLM的能力,因為它無需對模型進行大規(guī)模的重新訓(xùn)練。
  • 增強可解釋性:RAG可以提供生成響應(yīng)所依據(jù)的外部來源,增強了響應(yīng)的可解釋性和可信度。
  • 消除幻覺:基于確定性的知識能夠讓大模型的回答更加穩(wěn)定,大幅度降低胡編亂造的可能性。

RAG的技術(shù)原理

RAG技術(shù)入門非常簡單,現(xiàn)在市面上很多的AI開發(fā)框架和智能體開發(fā)平臺都內(nèi)置了知識庫能力,輕輕松松就可以搞出一個企業(yè)知識庫,并且知識庫的檢索也能達到及格水平。

但AI技術(shù)的特點往往就是上手容易但深入困難,想要進一步優(yōu)化你的私域知識庫,就得適當了解RAG的技術(shù)原理,根據(jù)自己的實際情況選擇更好的技術(shù)路徑。

RAG的技術(shù)路徑有很多種,但總體來說,可以劃分為“知識入庫”和“知識檢索”兩個大的板塊。

知識入庫

知識入庫質(zhì)量的好壞,決定了知識檢索的效果。

知識入庫環(huán)節(jié)說明數(shù)據(jù)清洗去除無效數(shù)據(jù),例如:外部鏈接、重復(fù)數(shù)據(jù)、特殊符號、無效信息等。數(shù)據(jù)分塊針對不同的文檔類型進行分塊處理。比如按段落分塊、按固定長度分塊等。向量化把分塊后的數(shù)據(jù)轉(zhuǎn)化成向量并存儲在向量數(shù)據(jù)庫。

這里每一個步驟都足夠復(fù)雜,咱們后面的系列文章會逐步進行講解。

知識檢索

從向量數(shù)據(jù)庫中查找對應(yīng)的知識并作為上下文輸入到大模型中。

知識檢索環(huán)節(jié)說明向量檢索把要檢索的內(nèi)容轉(zhuǎn)化成向量,通過全文檢索、稀疏向量檢索、稠密向量檢索等方式獲得最相關(guān)的TopK個結(jié)果。重排通過對向量檢索中召回的TopK歌結(jié)果進行二次精排和加工,最終找出最符合的幾個結(jié)果。

舉個例子

現(xiàn)在有一個私域知識庫文件”公司考勤管理制度.pdf”

<html>

<body>

<div>

XXX公司考勤管理制度

# 第一條 目的

為規(guī)范員工考勤管理,維護正常工作秩序,保障企業(yè)和員工的合法權(quán)益,根據(jù)《中華人民共和國勞動法》及相關(guān)法律法規(guī),結(jié)合公司實際情況,制定本制度。

# 第二條 適用范圍

本制度適用于公司全體正式員工、試用期員工及兼職員工。

# 第三條 標準工作時間

公司實行標準工時制,工作日為周一至周五,每日工作時間為:

上午 09:00-12:00

下午 13:00-18:00(含1小時午休)

特殊崗位或因工作需要調(diào)整工作時間的,需經(jīng)人力資源部審批后執(zhí)行。

# 第四條 考勤方式

員工需通過 指紋打卡/人臉識別/企業(yè)微信簽到 等方式記錄考勤,每日上下班各打卡一次。

因公外出或出差需提前提交<a href=”http://xxx.erp.cn”>《外出申請單》</a>,經(jīng)部門負責人審批后備案。

</div>

<div>

附件:

<a href=”http://xxx.erp.cn”>《外出申請單》</a>

人力資源部

XXXX年XX月XX日

</div>

</body>

</html>

1. 數(shù)據(jù)清洗

刪除文檔中多余的鏈接、無效的文本、鏈接等。 并且進行結(jié)構(gòu)化的分段。方便后續(xù)分塊。

清洗后的文檔:

XXX公司考勤管理制度

# 第一條 目的為規(guī)范員工…

# 第二條 適用范圍…

# 第三條 標準工作時間…

# 第四條 考勤方式員工需通過 指紋打卡/人臉識別/企業(yè)微信簽到 等方式記錄考勤,每日上下班各打卡一次。

因公外出或出差需提前提交《外出申請單》,經(jīng)部門負責人審批后備案。

人力資源部

XXXX年XX月XX日

2. 數(shù)據(jù)分塊

咱們采用根據(jù)段落分塊,既每個段落作為一個獨立的分塊。

# block_01

XXX公司考勤管理制度

# block_02

第一條 目的

為規(guī)范員工…

# block_03

第二條 適用范圍

本制度適用于…

# block_04

第三條 標準工作時間

公司實行標準工時制,工作日為周一至周五,每日工作時間為:

上午 09:00-12:00

下午 13:00-18:00(含1小時午休)。

# block_05

3. 向量化

使用嵌入模型(Embedding Model)把文檔中的每個分塊(block)轉(zhuǎn)化成向量,并存儲在向量數(shù)據(jù)庫中。

轉(zhuǎn)化后的向量大概長這樣:

# block_01

{

context: ‘XXX公司考勤管理制度’,

vector: [

0.11878310581111173, 0.9694947902934701, 0.16443679307243175,

0.5484226189097237, 0.9839246709011924, 0.5178387104937776,

0.8716926129208069, 0.5616972243831446,

]

}

# block_02

到這一步,我們的向量數(shù)據(jù)庫中已經(jīng)存儲了完整的文檔信息。

4. 向量檢索

現(xiàn)在用戶問了一個問題:

公司的上班時間是?

首先需要把”公司的上班時間是?”也轉(zhuǎn)化成向量:

{

context: ‘公司的上班時間是?’,

vector: [

0.24878310581111173, 0.5694947902934701, 0.58943679307243175,

0.2354226189097237, 0.4469246709011924, 0.3138387104937776,

0.6786926129208069, 0.4436972243831446,

]

}

然后去向量數(shù)據(jù)庫檢索,得到如下結(jié)果:

[{

id: “block_01”,

context: “XXX公司考勤管理制度”,

score: “0.7843”

},{

id: “block_05”,

context: “公司考勤方式…”,

score: “0.334”

}, {

id: “block_04”,

context: “第三條 標準工作時間…”,

score: “0.103”

}

]

其中score是當前分塊與待查詢值的距離,值越小,語義上越接近。

5. 重排

其實經(jīng)過第四步,就已經(jīng)可以找到我們想要的數(shù)據(jù)了,但很多時候文檔會召回大量非常相似的內(nèi)容。

向量數(shù)據(jù)庫檢索的時候,為了性能會犧牲部分檢索的精度,也就意味著可能會召回許多完全不相關(guān)的內(nèi)容,那么這個時候就需要用到重排。

重排簡單來說就是優(yōu)中選優(yōu),從之前召回的內(nèi)容中,選擇更加符合要求的TopK個結(jié)果。

重排后的結(jié)果:

[{

id: “block_04”,

context: “第三條,標準工作時間…”

}]

6. 大模型回答

有了知識庫的篩選結(jié)果,那么只需要把結(jié)果返回給大模型,由大模型進行回復(fù)即可。

# Data

第三條 標準工作時間

公司實行標準工時制,工作日為周一至周五,每日工作時間為:

上午 09:00-12:00

下午 13:00-18:00(含1小時午休)。

# Source

《XXX公司考勤管理制度》

# Question

公司上班時間是?

# Answer

工作日為周一至周五

上午 09:00-12:00

下午 13:00-18:00

午休1小時。

數(shù)據(jù)來源于XXX公司考勤管理制度。

結(jié)語

以上只是展示了最常見的RAG技術(shù)路徑。雖然RAG技術(shù)的入門非常的簡單,但達到一定的效果之后,想要再提升,就會遇到很多的問題和阻力。

本期文章只是開篇介紹,后續(xù)將深入介紹RAG的每個技術(shù)環(huán)節(jié)。

本文由人人都是產(chǎn)品經(jīng)理作者【葉小釵】,微信公眾號:【葉小釵】,原創(chuàng)/授權(quán) 發(fā)布于人人都是產(chǎn)品經(jīng)理,未經(jīng)許可,禁止轉(zhuǎn)載。

題圖來自Unsplash,基于 CC0 協(xié)議。

更多精彩內(nèi)容,請關(guān)注人人都是產(chǎn)品經(jīng)理微信公眾號或下載App
評論
評論請登錄
  1. get

    來自中國 回復(fù)
  2. 通俗易懂,期待后續(xù)更新~

    來自湖北 回復(fù)
  3. 寫的非常好,會有后續(xù)嘛,想知道如何提高召回準確率?

    來自吉林 回復(fù)