四、高級RAG重排序代碼實施:

? ? ? ?有了對Advanced RAG概念的理解,現在讓我們將使用LlamaIndex作為實施的框架,BM25作為我們的排序函數。BM25算法是信息檢索系統中廣泛使用的排序函數,特別是在文檔檢索中。它是概率信息檢索家族的一部分,是對經典TF-IDF(術語頻率逆文檔頻率)方法的改進。因此,我們將使用它作為我們的重新排序函數。

? ? ? ?在這篇文章中,我們將研究兩種不同的實現高級RAG的方法,一種是使用OpenAI LLM,另一種是在完全局部LLM(Mistral)

       首先在項目文件夾的根目錄中創建一個項目文件夾和包括如下內容的.env文件。

OPENAI_API_KEY="<YOUR_OPENAI_API_KEY>"LLM_URI="http://localhost:11434"

        導入相關庫

import nest_asyncioimport osimport sysimport logging
from dotenv import load_dotenv, find_dotenv
from llama_index import ( SimpleDirectoryReader, ServiceContext, StorageContext, VectorStoreIndex,)from llama_index.query_engine import RetrieverQueryEnginefrom llama_index.retrievers import BM25Retrieverfrom llama_index.llms import OpenAI, Ollamafrom llama_index.embeddings import OllamaEmbeddingfrom llama_index.postprocessor import SentenceTransformerRerankfrom llama_index import QueryBundle

        配置asynciologger

logging.basicConfig(stream=sys.stdout, level=logging.INFO)logging.getLogger().handlers = []logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
nest_asyncio.apply()

? ? ? ? 讓我們設計一個名為AdvancedRAG的類,該類具有以下3個函數:

class AdvancedRAG: def __init__(self): _ = load_dotenv(find_dotenv()) # load documents self.documents = SimpleDirectoryReader("./data/", required_exts=['.pdf']).load_data()
# global variables used later in code after initialization self.retriever = None self.reranker = None self.query_engine = None
self.bootstrap()
def bootstrap(self): # initialize LLMs llm = OpenAI(model="gpt-4", api_key=os.getenv("OPENAI_API_KEY"), temperature=0, system_prompt="You are an expert on the Inflamatory Bowel Diseases and your job is to answer questions. Assume that all questions are related to the Inflammatory Bowel Diseases (IBD). Keep your answers technical and based on facts – do not hallucinate features.")
# initialize service context (set chunk size) service_context = ServiceContext.from_defaults(chunk_size=1024, llm=llm) nodes = service_context.node_parser.get_nodes_from_documents(self.documents)
# initialize storage context (by default it's in-memory) storage_context = StorageContext.from_defaults() storage_context.docstore.add_documents(nodes)
index = VectorStoreIndex( nodes=nodes, storage_context=storage_context, service_context=service_context, )
# We can pass in the index, doctore, or list of nodes to create the retriever self.retriever = BM25Retriever.from_defaults(similarity_top_k=2, index=index)
# reranker setup & initialization self.reranker = SentenceTransformerRerank(top_n=1, model="BAAI/bge-reranker-base")
self.query_engine = RetrieverQueryEngine.from_args( retriever=self.retriever, node_postprocessors=[self.reranker], service_context=service_context, )
def query(self, query): # will retrieve context from specific companies nodes = self.retriever.retrieve(query) reranked_nodes = self.reranker.postprocess_nodes( nodes, query_bundle=QueryBundle(query_str=query) )
print("Initial retrieval: ", len(nodes), " nodes") print("Re-ranked retrieval: ", len(reranked_nodes), " nodes")
for node in nodes: print(node)
for node in reranked_nodes: print(node)
response = self.query_engine.query(str_or_query_bundle=query) return response

Initialization方法(__init__):

環境設置:使用load_dotenv(find_dotenv())加載環境變量。這可能用于配置設置,如API密鑰或URL。

文檔加載:使用SimpleDirectoryReader從指定目錄加載文檔。這些文檔可能被用作檢索任務的語料庫。

全局變量:為檢索器重排序器query_engine設置占位符,它們可能是檢索和排序過程中的關鍵組件。

Bootstrap方法調用:調用Bootstrap方法來初始化各種組件。

Bootstrap方法:

初始化大型語言模型(llm:使用Ollama或OpenAI GPT-4設置語言模型實例(llm)。

初始化嵌入模型:使用OllamaEmbedding設置嵌入模型(embed_mode),該模型用于創建文本的矢量表示。

服務上下文:使用塊大小和模型(llm和embed_mode)配置服務上下文。

節點解析和存儲:將文檔解析為節點,并將其存儲在內存數據庫中,以便快速訪問。

索引創建:使用VectorStoreIndex創建索引,以高效檢索文檔。

Retriever初始化:初始化BM25Retriever,這是一個基于BM25算法的檢索模型。

重新排序初始化:使用SentenceTransformerRerank設置重新排序,重新排序檢索到的結果的相關性。

查詢引擎初始化:初始化一個查詢引擎,該引擎將檢索器重排序器組合在一起以處理查詢。

Query方式:

檢索:檢索與給定查詢相關的節點(文檔)。

重排序:對檢索到的節點應用重新排序。

響應生成:使用查詢引擎根據查詢生成響應。

if __name__ == "__main__": adv_rag = AdvancedRAG() resp = adv_rag.query("What is the impact of IBD in women ?") print(resp)

? ? ? ? ?當您使用OpenAI GPT-4配置運行上述代碼時,以下應該是輸出。

       使用本地LLM和本地嵌入模型(Mistral)修改代碼,在上面的代碼中,只需注釋現有的OpenAI GPT-4 LLM并使用下面的代碼。

# initialize LLMsllm = Ollama(base_url=os.getenv("LLM_URI"), model="mistral")

        初始化Mistral嵌入,如下所示

# initialize mistral embed modelembed_model = OllamaEmbedding(base_url=os.getenv("LLM_URI"), model_name="mistral")

        現在,通過傳遞embed_mode來修改現有的服務上下文,如下所示:

# initialize service context (set chunk size)service_context = ServiceContext.from_defaults(chunk_size=1024, llm=llm, embed_model=embed_model)

? ? ? 現在,如果將代碼指向下面的本地LLM和本地嵌入來編寫代碼,那么輸出如下:

      您可以清楚地看到,GPT-4和Mistral等2種方法生成的響應發生了一些顯著變化,但具有置信度|重新排序分數的檢索節點保持不變。

六、結論

? ? 總之,高級檢索增強生成(Advanced Retrieval Augmented Generation,簡稱RAG)是信息檢索和自然語言處理領域的一次重大飛躍。通過將BM25等最先進的排名算法與先進的重新排序技術和GPT-4或Mistral等尖端語言模型相集成,advanced RAG為處理復雜的查詢任務提供了一個強大而靈活的解決方案。正如我們在討論中舉例說明的那樣,這種實際實現不僅展示了Advanced RAG的理論潛力,還展示了其在現實世界中的適用性。無論是在提高搜索引擎的準確性、提高聊天機器人中響應的相關性,還是在推進知識系統的前沿領域,高級RAG證明了人工智能驅動的語言理解和信息處理的不斷發展和成熟。Advanced RAG中檢索準確性和上下文生成的融合為各種應用中更智能、更靈敏、更知識淵博的系統鋪平了道路,預示著人工智能能力的新時代。

參考文獻:

[1]?https://blog.stackademic.com/advanced-retrieval-augmented-generation-how-reranking-can-change-the-game-d06e12b77074

文章轉自微信公眾號@ArronAI

上一篇:

LLM之RAG實戰(三十三)| 探索RAG在Table的應用

下一篇:

LLM之RAG實戰(三十六)| 使用LangChain實現多模態RAG
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費