6行代碼入門(mén)RAG開(kāi)發(fā)
什么是RAG?
檢索增強(qiáng)生成(RAG)是指對(duì)大型語(yǔ)言模型輸出進(jìn)行優(yōu)化,使其能夠在生成響應(yīng)之前引用訓(xùn)練數(shù)據(jù)來(lái)源之外的權(quán)威知識(shí)庫(kù)。大型語(yǔ)言模型(LLM)用海量數(shù)據(jù)進(jìn)行訓(xùn)練,使用數(shù)十億個(gè)參數(shù)為回答問(wèn)題、翻譯語(yǔ)言和完成句子等任務(wù)生成原始輸出。在 LLM 本就強(qiáng)大的功能基礎(chǔ)上,RAG 將其擴(kuò)展為能訪(fǎng)問(wèn)特定領(lǐng)域或組織的內(nèi)部知識(shí)庫(kù),所有這些都無(wú)需重新訓(xùn)練模型。這是一種經(jīng)濟(jì)高效地改進(jìn) LLM 輸出的方法,讓它在各種情境下都能保持相關(guān)性、準(zhǔn)確性和實(shí)用性。
更多關(guān)于RAG的介紹可以看這篇文章:
什么是RAG(檢索增強(qiáng)生成)?
上代碼
# 導(dǎo)入必要的類(lèi)
from llama_index.core import SimpleDirectoryReader
from llama_index.core import VectorStoreIndex
# 加載文檔
documents = SimpleDirectoryReader("./data").load_data()
# 創(chuàng)建文檔索引
index = VectorStoreIndex.from_documents(documents)
# 創(chuàng)建聊天引擎
chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)
# 執(zhí)行聊天
print(chat_engine.chat("DuckDB的VSS擴(kuò)展主要功能, reply in Chinese"))
6行代碼入門(mén)RAG
輸出效果可還滿(mǎn)意?這里使用的是 LiteLLM+ollama? 的私有化模型來(lái)模擬 OpenAI的,詳情下次介紹。
上面的代碼演示使用的是Vector Similarity Search in DuckDB 的英文原文。
代碼解析
1.安裝必要的包:
pip install llama-index
2.導(dǎo)入必要的類(lèi):
from llama_index.core import SimpleDirectoryReader
from llama_index.core import VectorStoreIndex
- ?SimpleDirectoryReader:用于從指定目錄加載文檔的類(lèi)。
- ?VectorStoreIndex:用于創(chuàng)建文檔索引的類(lèi),它允許基于文檔內(nèi)容進(jìn)行檢索。
3.加載文檔:
documents = SimpleDirectoryReader("./data").load_data()
? 使用SimpleDirectoryReader類(lèi)從當(dāng)前目錄下的./data文件夾加載文檔。load_data()方法將文檔加載為一個(gè)列表。
4.創(chuàng)建文檔索引:
index = VectorStoreIndex.from_documents(documents)
? 利用VectorStoreIndex類(lèi)和加載的文檔列表創(chuàng)建一個(gè)索引。這個(gè)索引將用于后續(xù)的檢索和生成回答。
5.創(chuàng)建聊天引擎:
chat_engine = index.as_chat_engine(chat_mode="condense_question", verbose=True)
? 使用index.as_chat_engine()方法創(chuàng)建一個(gè)聊天引擎,它將使用索引來(lái)生成回答。
?chat_mode="condense_question"參數(shù)指定了聊天引擎的模式,在這個(gè)例子中,它將嘗試將用戶(hù)的問(wèn)題壓縮成更簡(jiǎn)潔的形式。
?verbose=True參數(shù)表示在生成回答的過(guò)程中將打印出額外的詳細(xì)信息。
- 6.執(zhí)行聊天:
print(chat_engine.chat("DuckDB的VSS擴(kuò)展主要功能, reply in Chinese"))
? 使用chat_engine.chat()方法執(zhí)行一次聊天交互。
llamaindex 簡(jiǎn)介
LlamaIndex[1] 是一個(gè)用于構(gòu)建 上下文增強(qiáng)型 大型語(yǔ)言模型(LLM)應(yīng)用程序的框架。上下文增強(qiáng)指的是任何在您的私有或特定領(lǐng)域數(shù)據(jù)之上應(yīng)用 LLM 的用例。用例包括:
? 提示(Prompting)
? 問(wèn)答(Question-Answering (RAG))
? 聊天機(jī)器人(Chatbots)
? 結(jié)構(gòu)化數(shù)據(jù)抽?。⊿tructured Data Extraction)
? 代理(Agents)
? 多模態(tài)應(yīng)用(Multi-Modal Applications)
? 微調(diào)(Fine-Tuning)
LlamaIndex 提供了工具,使您能夠?qū)⑸鲜鋈魏斡美龔脑蜆?gòu)建到生產(chǎn)。這些工具允許您同時(shí)攝?。ㄌ幚恚┻@些數(shù)據(jù),并實(shí)現(xiàn)復(fù)雜的查詢(xún)工作流程,結(jié)合數(shù)據(jù)訪(fǎng)問(wèn)與 LLM 提示。
LlamaIndex 支持 Python 和 Typescript。
LlamaIndex
RAG 步驟拆解
一個(gè)最基本的 RAG 可以分解為如下5步:
1.查詢(xún)向量化:將用戶(hù)查詢(xún)輸入嵌入模型,將自然語(yǔ)言查詢(xún)轉(zhuǎn)換成一個(gè)語(yǔ)義化的嵌入向量,以便于進(jìn)行后續(xù)的數(shù)學(xué)運(yùn)算和相似性比較。
2.向量數(shù)據(jù)庫(kù)查詢(xún):將得到的嵌入查詢(xún)向量輸入到向量數(shù)據(jù)庫(kù)中,以便進(jìn)行高效的信息檢索。
3.上下文檢索:在知識(shí)庫(kù)中檢索與查詢(xún)向量距離最近的前k個(gè)上下文塊。這些上下文塊與查詢(xún)?cè)谡Z(yǔ)義上最為相關(guān),它們將作為生成答案的依據(jù)。
4.上下文與查詢(xún)傳遞:將原始查詢(xún)文本和檢索到的相關(guān)上下文文本一起輸入到大型語(yǔ)言模型(LLM)中。
5.生成響應(yīng):利用LLM的強(qiáng)大生成能力,結(jié)合查詢(xún)文本和檢索到的上下文,生成一個(gè)準(zhǔn)確、連貫且信息豐富的響應(yīng)。
通過(guò)這五個(gè)步驟,RAG技術(shù)能夠有效地結(jié)合檢索和生成兩個(gè)環(huán)節(jié),以提供更加精準(zhǔn)和豐富的信息回答。
引用鏈接
[1] LlamaIndex: https://www.llamaindex.ai/
