在資訊過載的數位時代,從大型資料集中提取可行的見解比以往任何時候都更加重要。最近,我踏上了利用檢索增強生成 (RAG) 來解決一項重大挑戰的旅程——從大量會議記錄中提供準確的答案。本部落格探討了將我的基於 RAG 的查詢應答系統轉變為從非結構化會議資料中提取見解的強大工具的障礙、解決方案和成就。
問題陳述:使用 RAG 進行查詢應答的挑戰
主要挑戰之一是建立一個能夠在龐大的會議記錄儲存庫中處理複雜的、特定於意圖的查詢的系統。傳統的 RAG 查詢應答模型經常傳回不相關或不完整的訊息,無法捕捉使用者意圖。會議資料的非結構化性質與多樣化的查詢類型結合,需要更精細的解決方案。
初步方法:為有效的查詢應答奠定基礎
我從一個基礎 RAG 模型開始,該模型旨在將檢索和回應生成結合起來。最初使用的兩種技術是:
分塊:以句子邊界將大文檔分成較小的片段,透過縮小搜尋範圍來改善檢索。
嵌入和向量儲存:分塊後,每個片段都被嵌入並儲存在向量資料庫中,從而實現高效搜尋。
但是,這種設定有其限制。最初的分塊方法通常會導致檢索不相關的信息,並且生成的答案缺乏精度以及與每個查詢的意圖的一致性。
大規模 RAG 查詢應答的挑戰
這些挑戰強調需要更先進的方法來提高 RAG 查詢應答的準確性。
增強查詢準確性的高級 RAG 技術(解決方案)
為了解決這些問題,我應用了幾個先進的方法,迭代地完善系統:
語意分塊
與傳統分塊不同,語意分塊優先考慮每個片段中的意義,透過將檢索到的資訊與查詢的意圖對齊來增強相關性。
from langchain_experimental.text_splitter import SemanticChunker from langchain_openai.embeddings import OpenAIEmbeddings from langchain.schema import Document # Initialize OpenAI Embeddings with API key openai_api_key = "" embedder = OpenAIEmbeddings(openai_api_key=openai_api_key) text_splitter = SemanticChunker(embedder) def prepare_docs_for_indexing(videos): all_docs = [] for video in videos: video_id = video.get('video_id') title = video.get('video_name') transcript_info = video.get('details', {}).get('transcript_info', {}) summary = video.get('details', {}).get('summary') created_at = transcript_info.get('created_at') # Getting the created_at timestamp # Get the full transcription text transcription_text = transcript_info.get('transcription_text', '') # Create documents using semantic chunking docs = text_splitter.create_documents([transcription_text]) for doc in docs: # Add metadata to each document doc.metadata = { "created_at": created_at, "title": title, "video_id": video_id, "summary": summary } all_docs.append(doc) return all_docs docs = prepare_docs_for_indexing(videos) # Output the created documents for doc in docs: print("____________") print(doc.page_content)
最大保證金檢索
此方法透過區分相關資料和不相關資料來提高檢索精度,確保只檢索最匹配的資料塊。
Lambda 評分
使用 Lambda 評分,我可以根據相關性對結果進行排名,優先考慮與查詢意圖更一致的回應,以獲得更好的答案品質。
from langchain_community.vectorstores import OpenSearchVectorSearch from langchain_openai import OpenAIEmbeddings embeddings = OpenAIEmbeddings() docsearch = OpenSearchVectorSearch.from_documents( docs, embeddings, opensearch_url="http://localhost:9200" ) query = "your query" docs = docsearch.max_marginal_relevance_search(query, k=2, fetch_k=10, lambda_param=0.25)
多查詢與 RAG 融合
對於複雜的問題,系統會產生多個子查詢。然後,RAG Fusion 將不同的答案整合為一個統一的、有凝聚力的反應,從而提高回應品質並減少錯誤。
def generate_multi_queries(question: str): # Template to generate multiple queries template = """You are an AI language model assistant. Your task is to generate five different versions of the given user question to retrieve relevant documents from a vector database. By generating multiple perspectives on the user question, your goal is to help the user overcome some of the limitations of the distance-based similarity search. Provide these alternative questions separated by newlines. Original question: {question}""" # Creating a prompt template for query generation prompt_perspectives = ChatPromptTemplate.from_template(template) # Generate the queries using ChatOpenAI and output parser generate_queries = ( prompt_perspectives | ChatOpenAI(temperature=0, openai_api_key=openai_api_key) | StrOutputParser() | (lambda x: x.split("\n")) ) # Invoke the chain to generate queries multi_queries = generate_queries.invoke({"question": question}) return multi_queries
def reciprocal_rank_fusion(results: list[list], k=60): """Applies Reciprocal Rank Fusion (RRF) to fuse ranked document lists.""" fused_scores = {} for docs in results: for rank, doc in enumerate(docs): doc_str = dumps(doc) # Convert to a serializable format if doc_str not in fused_scores: fused_scores[doc_str] = 0 fused_scores[doc_str] += 1 / (rank + k) # RRF formula # Sort documents by the fused score reranked_results = [ (loads(doc), score) for doc, score in sorted(fused_scores.items(), key=lambda x: x[1], reverse=True) ] return reranked_result
增強的索引和最佳化的向量搜尋
改進索引機制並細化向量搜尋參數使檢索更快、更準確,尤其是對於大型資料集。
結果:RAG 查詢回應方面的主要成就
實施這些技術帶來了顯著的改進:
主要重點與經驗教訓
透過這趟旅程,我確定了幾個核心見解:
結論:基於 RAG 的系統的未來前景
利用先進技術增強 RAG 模型,將簡單的檢索系統轉變為用於回答複雜、細緻入微的查詢的強大工具。展望未來,我的目標是融入即時學習功能,讓系統能夠動態適應新數據。這段經驗加深了我的技術技能,並強調了資料檢索系統中靈活性、語義焦點和迭代改進的重要性。
最終想法:實施高階 RAG 系統的指南
透過分享我克服 RAG 挑戰的經驗,我希望為實施類似解決方案提供指導。策略技術與迭代細化結合,不僅解決了眼前的問題,也為查詢應答系統的未來進步奠定了堅實的基礎。
以上是使用 RAG 掌握查詢應答:克服大規模會議資料中的關鍵挑戰的詳細內容。更多資訊請關注PHP中文網其他相關文章!