成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

RAG進階技術!這十種方法你一定要知道 原創

發布于 2025-4-9 06:40
瀏覽
0收藏

在當今這個信息爆炸的時代,AI 系統已經深入到我們生活的方方面面,從醫療健康助手到教育輔導工具,再到企業知識管理機器人,AI 正在幫助我們更高效地獲取和處理知識。但隨著應用場景的復雜化,傳統的 AI 系統面臨著諸多挑戰:如何生成真正相關的回答?如何理解復雜的多輪對話?如何避免自信地輸出錯誤信息?這些問題在基于 RAG(Retrieval-Augmented Generation,檢索增強生成)的系統中尤為突出。

RAG 結合了文檔檢索的強大能力與語言生成的流暢性,能夠讓系統基于上下文給出有根據的回答。然而,基礎的 RAG 系統在處理復雜查詢、多輪對話以及特定領域的專業知識時,常常會“掉鏈子”,出現“幻覺”(生成錯誤信息)或丟失上下文的情況。那么,我們該如何升級 RAG 系統,讓它變得更智能、更可靠呢?今天,就讓我們一起探索如何通過高級 RAG 技術,提升問答系統的性能!

基礎 RAG 的局限性

先來看看基礎 RAG 系統的架構:它的工作流程大致是這樣的,首先將文檔加載進來,通過各種分塊技術將其拆分成小塊,然后使用嵌入模型將這些小塊轉化為向量,存儲到向量數據庫中。當用戶提出問題時,系統會在向量數據庫中檢索與問題相關的文檔片段,再將這些片段與問題一起傳遞給語言模型,最終生成回答。

聽起來是不是很簡單?但正是這種簡單性,導致了基礎 RAG 系統的諸多問題:

  • 幻覺問題:模型可能會生成一些與原始文檔毫不相關,甚至是錯誤的內容。在醫學或法律等對準確性要求極高的領域,這可是致命的缺陷。
  • 缺乏領域專一性:基礎 RAG 系統在處理特定領域的復雜話題時,往往會因為檢索到不相關或不準確的信息而“翻車”。
  • 多輪對話困境:在多輪對話中,基礎 RAG 系統很容易丟失上下文,導致回答支離破碎,無法滿足用戶的需求。

那么,我們該如何突破這些局限呢?這就需要引入高級 RAG 技術,對 RAG 系統的各個環節——索引、檢索和生成——進行優化升級!

索引與分塊:構建堅實基礎

一個好的索引是 RAG 系統的核心。我們首先要考慮如何高效地導入、拆分和存儲數據。接下來,就讓我們看看幾種先進的索引和分塊方法。

1、HNSW:高效檢索的利器

HNSW(Hierarchical Navigable Small Worlds,層次可導航小世界)算法是一種在大數據集中快速查找相似項的強大工具。它通過構建一個基于圖的結構,能夠高效地找到近似最近鄰(ANN)。具體來說,它有以下幾個關鍵特點:

  • 鄰近圖:HNSW 構建了一個圖,圖中的每個點都與附近的點相連,這使得搜索過程更加高效。
  • 層次結構:算法將點分層組織,頂層連接較遠的點,底層連接較近的點,從而加快了搜索速度。
  • 貪婪路由:在搜索時,HNSW 從高層的某個點開始,逐步向下層移動,直到找到局部最小值,大大減少了查找相似項所需的時間。

RAG進階技術!這十種方法你一定要知道-AI.x社區

實際應用中,我們可以通過設置參數(如每個節點的鄰居數量、構建圖時考慮的鄰居數量等)來優化 HNSW 的性能。通過 HNSW,我們能夠在海量數據中快速準確地找到與用戶問題最相關的文檔片段,為后續的回答生成提供堅實基礎。

動手實踐 HNSW

接下來,讓我們通過代碼來實現 HNSW 算法。這里我們使用的是 FAISS 庫,它是一個高效的相似性搜索庫,非常適合與 HNSW 結合使用。

import faiss
import numpy as np

# 設置 HNSW 參數
d = 128  # 向量的維度
M = 32   # 每個節點的鄰居數量

# 初始化 HNSW 索引
index = faiss.IndexHNSWFlat(d, M)

# 設置 efConstruction 參數,控制構建索引時考慮的鄰居數量
efConstruction = 200
index.hnsw.efConstruction = efConstruction

# 生成隨機數據并添加到索引中
n = 10000  # 要索引的向量數量
xb = np.random.random((n, d)).astype('float32')
index.add(xb)  # 構建索引

# 設置 efSearch 參數,影響搜索過程
efSearch = 100
index.hnsw.efSearch = efSearch

# 執行搜索
nq = 5  # 查詢向量的數量
xq = np.random.random((nq, d)).astype('float32')
k = 5   # 檢索最近鄰的數量
distances, indices = index.search(xq, k)

# 輸出結果
print("查詢向量:\n", xq)
print("\n最近鄰索引:\n", indices)
print("\n最近鄰距離:\n", distances)

通過上述代碼,我們可以看到 HNSW 在處理大規模數據集時的高效性和準確性。它能夠快速找到與查詢向量最相似的文檔片段,為后續的語言模型生成環節提供高質量的輸入。

2、語義分塊:讓信息更有意義

傳統的分塊方法通常是基于固定大小來拆分文本,但這種方法可能會將一個完整的概念或信息拆得支離破碎。而語義分塊則不同,它根據文本的含義來劃分分塊,每個分塊都代表一個連貫的信息單元。具體操作是計算句子嵌入之間的余弦距離,如果兩個句子在語義上相似(低于某個閾值),就把它們歸為同一個分塊。這種方法的優點是能夠生成更有意義、更連貫的分塊,從而提高檢索的準確性。不過,它需要使用基于 BERT 等的編碼器,計算成本相對較高。

動手實踐語義分塊

接下來,我們通過代碼來實現語義分塊。這里我們使用的是 LangChain 庫中的 ??SemanticChunker?? 類,它利用 OpenAI 的嵌入模型來實現語義分塊。

from langchain_experimental.text_splitter import SemanticChunker
from langchain_openai.embeddings import OpenAIEmbeddings

# 初始化語義分塊器
text_splitter = SemanticChunker(OpenAIEmbeddings())

# 將文檔分割為語義相關的分塊
docs = text_splitter.create_documents([document])
print(docs[0].page_content)

通過上述代碼,我們可以看到語義分塊能夠根據文本的語義內容生成更有意義的分塊,這對于后續的檢索和生成環節非常有幫助。

3、基于語言模型的分塊:精準捕捉文本結構

這種方法利用強大的語言模型(如擁有 70 億參數的模型)來處理文本,將其拆分成一個個完整的語句,然后再將這些語句組合成分塊,既保證了每個分塊的完整性,又兼顧了上下文信息。雖然這種方法計算量較大,但它能夠根據文本的具體內容靈活調整分塊方式,生成高質量的分塊,特別適合對文本結構要求較高的應用場景。

動手實踐基于語言模型的分塊

接下來,我們通過代碼來實現基于語言模型的分塊。這里我們使用的是 OpenAI 的 GPT-4o 模型,通過異步調用生成每個分塊的上下文信息。

import asyncio
from langchain_openai import ChatOpenAI

async def generate_contexts(document, chunks):
    async def process_chunk(chunk):
        response = await client.chat.completions.create(
            model="gpt-4o",
            messages=[
                {"role": "system", "content": "Generate a brief context explaining how this chunk relates to the full document."},
                {"role": "user", "content": f"<document> \n{document} \n</document> \nHere is the chunk we want to situate within the whole document \n<chunk> \n{chunk} \n</chunk> \nPlease give a short succinct context to situate this chunk within the overall document for the purposes of improving search retrieval of the chunk. Answer only with the succinct context and nothing else."}
            ],
            temperature=0.3,
            max_tokens=100
        )
        context = response.choices[0].message.content
        return f"{context} {chunk}"
    
    # 并行處理所有分塊
    contextual_chunks = await asyncio.gather(
        *[process_chunk(chunk) for chunk in chunks]
    )
    return contextual_chunks

通過上述代碼,我們可以看到基于語言模型的分塊能夠生成高質量的分塊,并為每個分塊生成上下文信息,這對于后續的檢索和生成環節非常有幫助。

4、利用元數據:為檢索增添更多上下文

元數據可以為文檔提供額外的上下文信息,比如日期、患者年齡、既往病史等。在檢索時,通過過濾這些元數據,我們可以排除無關的信息,讓檢索結果更加精準。例如,在醫療領域,如果查詢與兒童相關的內容,就可以直接過濾掉 18 歲以上患者的記錄。在索引時,將元數據與文本一起存儲,能夠大大提高檢索的效率和相關性。

動手實踐元數據的使用

接下來,我們通過代碼來實現元數據的使用。這里我們使用的是 LangChain 庫中的 ??Document?? 類,它允許我們在文檔中存儲元數據。

from langchain_core.documents import Document

# 創建帶有元數據的文檔
doc = Document(
    page_cnotallow="This is a sample document.",
    metadata={"id": "doc1", "source": "https://example.com"}
)

# 打印文檔內容和元數據
print(doc.page_content)
print(doc.metadata)

通過上述代碼,我們可以看到元數據能夠為文檔提供更多的上下文信息,這對于后續的檢索和生成環節非常有幫助。

檢索:精準定位關鍵信息

檢索是 RAG 系統中的關鍵環節,它決定了我們能否從海量數據中找到與用戶問題真正相關的文檔。接下來,讓我們看看幾種提升檢索性能的技術。

5、混合搜索:語義與關鍵詞的完美結合

混合搜索將向量搜索(語義搜索)和關鍵詞搜索結合起來,充分發揮兩者的優點。在一些領域,如 AI 技術,很多術語都是特定的關鍵詞,比如算法名稱、技術術語等。單獨使用向量搜索可能會遺漏這些重要信息,而關鍵詞搜索則可以確保這些關鍵術語被納入考慮范圍。通過同時運行這兩種搜索方式,并根據權重系統合并和排序結果,我們可以得到一個更全面、更精準的檢索結果列表。

動手實踐混合搜索

接下來,我們通過代碼來實現混合搜索。這里我們使用的是 LangChain 庫中的 ??WeaviateHybridSearchRetriever?? 類,它結合了 Weaviate 向量數據庫的向量搜索和關鍵詞搜索能力。

from langchain_community.retrievers import WeaviateHybridSearchRetriever

# 初始化混合搜索檢索器
retriever = WeaviateHybridSearchRetriever(
    client=client,
    index_name="LangChain",
    text_key="text",
    attributes=[],
    create_schema_if_missing=True,
)

# 執行混合搜索
results = retriever.invoke("the ethical implications of AI")
print(results)

通過上述代碼,我們可以看到混合搜索能夠結合向量搜索和關鍵詞搜索的優點,生成更全面、更精準的檢索結果。

6、查詢重寫:讓問題更“友好”

人類提出的問題往往并不是最適合數據庫或語言模型理解的形式。通過使用語言模型重寫查詢,可以顯著提升檢索的效果。比如,將“AI 代理是什么,為什么它們是 2025 年的下一個大事件”重寫為“AI 代理 大事件 2025”,這樣更符合數據庫的檢索邏輯。此外,還可以通過重寫提示詞來優化與語言模型的交互,提高結果的質量和準確性。

動手實踐查詢重寫

接下來,我們通過代碼來實現查詢重寫。這里我們使用的是 LangChain 庫中的 ??ChatOpenAI?? 類,它允許我們利用 OpenAI 的語言模型來重寫查詢。

from langchain_openai import ChatOpenAI

# 初始化語言模型
chatgpt = ChatOpenAI(model_name="gpt-4o", temperature=0)

# 重寫查詢
query = "what are AI agents and why they are the next big thing in 2025"
rewritten_query = chatgpt.invoke(query)
print(rewritten_query)

通過上述代碼,我們可以看到查詢重寫能夠將人類的問題轉化為更適合數據庫和語言模型理解的形式,從而提高檢索的效果。

7、多查詢檢索:從不同角度挖掘信息

由于查詢的措辭稍有不同,檢索結果可能會大相徑庭。多查詢檢索器利用大型語言模型(LLM)根據用戶輸入生成多個不同角度的查詢,然后對每個查詢分別檢索相關文檔,最后將所有查詢的結果匯總,從而提供更廣泛的相關文檔集合。這種方法無需進行大量的手動調整,就能提高找到有用信息的概率。

動手實踐多查詢檢索

接下來,我們通過代碼來實現多查詢檢索。這里我們使用的是 LangChain 庫中的 ??MultiQueryRetriever?? 類,它允許我們利用 OpenAI 的語言模型生成多個查詢,并從 Chroma 向量數據庫中檢索相關文檔。

from langchain.retrievers.multi_query import MultiQueryRetriever

# 初始化多查詢檢索器
mq_retriever = MultiQueryRetriever.from_llm(
    retriever=similarity_retriever3, llm=chatgpt,
    include_original=True
)

# 執行多查詢檢索
query = "what is the capital of India?"
docs = mq_retriever.invoke(query)
print(docs)

通過上述代碼,我們可以看到多查詢檢索能夠從多個角度生成查詢,并從向量數據庫中檢索相關文檔,從而提高找到有用信息的概率。

生成:打造高質量回答

最后,我們來到了 RAG 系統的生成環節。這一環節的目標是為語言模型提供盡可能與問題相關的上下文,避免無關信息引發“幻覺”。以下是一些提升生成質量的技巧。

8、自動裁剪:去除無關信息

自動裁剪技術可以過濾掉從數據庫中檢索到的與問題無關的信息,防止語言模型被誤導。具體操作是,在檢索時,根據相似度分數找到一個顯著下降的臨界點,排除分數低于該臨界點的對象,從而確保傳遞給語言模型的信息都是最相關的。

動手實踐自動裁剪

接下來,我們通過代碼來實現自動裁剪。這里我們使用的是 LangChain 庫中的 ??PineconeVectorStore?? 類,它允許我們利用 Pinecone 向量數據庫進行相似性搜索,并根據相似度分數過濾信息。

from langchain_pinecone import PineconeVectorStore
from langchain_openai import OpenAIEmbeddings

# 初始化向量存儲
vectorstore = PineconeVectorStore.from_documents(
    docs, index_name="sample", embedding=OpenAIEmbeddings()
)

# 執行相似性搜索并獲取相似度分數
docs, scores = vectorstore.similarity_search_with_score("dinosaur")
for doc, score in zip(docs, scores):
    doc.metadata["score"] = score
print(docs)

通過上述代碼,我們可以看到自動裁剪能夠根據相似度分數過濾掉無關信息,從而提高傳遞給語言模型的信息質量。

9、重新排序:讓重要信息優先

重新排序技術使用更高級的模型(通常是交叉編碼器)重新評估和排序最初檢索到的對象。它會考慮查詢和每個對象之間的配對相似度,重新確定相關性,并將最相關的文檔放在最前面。這樣,語言模型接收到的數據質量更高,生成的回答也更精準。

動手實踐重新排序

接下來,我們通過代碼來實現重新排序。這里我們使用的是 LangChain 庫中的 ??FlashrankRerank?? 類,它允許我們利用高級模型重新評估和排序檢索到的文檔。

from langchain.retrievers import ContextualCompressionRetriever
from langchain.retrievers.document_compressors import FlashrankRerank

# 初始化重新排序器
compressor = FlashrankRerank()
compression_retriever = ContextualCompressionRetriever(
    base_compressor=compressor, base_retriever=retriever
)

# 執行重新排序
query = "What did the president say about Ketanji Jackson Brown"
compressed_docs = compression_retriever.invoke(query)
print([doc.metadata["id"] for doc in compressed_docs])
print(compressed_docs)

通過上述代碼,我們可以看到重新排序能夠根據查詢和文檔之間的相似度重新排序,從而提高傳遞給語言模型的信息質量。

10、微調語言模型:讓模型更懂你的領域

對預訓練的語言模型進行微調,可以顯著提升檢索性能。在特定領域(如醫學)中,可以選擇在相關數據上預訓練的模型(如 MedCPT 系列),并收集自己的數據,創建正負樣本對進行微調,讓模型學會領域內的特定關系。經過微調的模型在特定領域的檢索和生成任務中表現更出色。

RAG進階技術!這十種方法你一定要知道-AI.x社區

動手實踐微調語言模型

接下來,我們通過代碼來實現微調語言模型。這里我們使用的是 LangChain 庫中的 ??ChatOpenAI?? 類,它允許我們利用 OpenAI 的語言模型進行微調。

from langchain_openai import ChatOpenAI

# 初始化語言模型
chatgpt = ChatOpenAI(model_name="gpt-4o", temperature=0)

# 微調語言模型
# 這里需要提供自己的數據集進行微調
# 例如,使用醫學領域的數據集進行微調
# fine_tuned_model = chatgpt.fine_tune(dataset)

通過上述代碼,我們可以看到微調語言模型能夠顯著提升模型在特定領域的性能,從而提高生成回答的質量。

高級 RAG 技術:讓 AI 回答更靠譜

通過上述一系列高級 RAG 技術,我們可以對 RAG 系統的各個環節——索引、檢索和生成——進行優化升級,從而提升系統的整體性能。無論是醫療健康助手、教育輔導工具,還是企業知識管理機器人,這些技術都能讓 AI 系統在處理復雜信息需求時更加得心應手,生成更準確、更可靠、更符合上下文的回答。

總之,隨著應用場景的不斷復雜化,AI 系統需要不斷進化。高級 RAG 技術為我們提供了一種有效的途徑,讓我們能夠打造出更智能、更強大的問答系統,讓 AI 真正成為我們獲取知識、解決問題的得力助手!


本文轉載自公眾號Halo咯咯    作者:基咯咯

原文鏈接:??https://mp.weixin.qq.com/s/5i0Dso7sv_bkYFaFO0h8lQ??


?著作權歸作者所有,如需轉載,請注明出處,否則將追究法律責任
標簽
已于2025-4-9 06:40:02修改
收藏
回復
舉報
回復
相關推薦
主站蜘蛛池模板: 精品一区电影 | 久视频在线观看 | 亚洲综合色视频在线观看 | 在线观看国产 | 午夜视频在线观看视频 | 欧美一级黄色免费看 | 日韩黄色av | 欧美日韩免费 | 日韩免费毛片视频 | 一区二区中文 | 在线视频h | 免费国产一区 | 免费一二区 | 国产精品久久久久久久 | 日本久久黄色 | 亚洲黄色一级 | www.夜夜草| 99久久精品一区二区毛片吞精 | 久久久久亚洲精品 | 成人精品免费视频 | 精品欧美乱码久久久久久 | 欧美日韩视频 | 午夜影晥 | 国产香蕉视频在线播放 | av看片网| 欧美老妇交乱视频 | 日韩成人免费视频 | 久久精品久久综合 | 久久天天躁狠狠躁夜夜躁2014 | 中文字幕亚洲一区 | 999免费网站| 欧美一级视频免费看 | 欧美一级欧美一级在线播放 | 欧美一级在线 | 国产欧美一区二区三区久久手机版 | 欧美精品日韩精品 | 精品1区2区| 久久精品中文 | 欧美久久久久 | 人人干人人超 | 成人av观看 |