幻覺是在處理大型語言模型(LLMs)時常見的問題。LLMs生成流暢連貫的文本,但經常產生不準確或不一致的信息。防止LLMs中出現幻覺的一種方法是使用外部知識源,如提供事實信息的數據庫或知識圖譜。
矢量數據庫和知識圖譜使用不同的方法來存儲和表示數據。矢量數據庫適合基于相似性的操作,知識圖譜旨在捕捉和分析復雜的關系和依賴關系。
對于LLM中的幻覺問題,知識圖譜是一個比向量數據庫更好的解決方案。知識圖譜為LLM提供了更準確、相關、多樣化、有趣、邏輯和一致的信息。因此,使用知識圖譜可以減少LLM中的幻覺,使其在生成準確和真實的文本時更加可靠。但關鍵是文檔需要清楚地展示關系,否則知識圖譜將無法捕捉到它。
向量數據庫
向量數據庫是一組高維向量的集合,用于表示實體或概念,例如單詞、短語或文檔。向量數據庫可以根據實體或概念的向量表示來度量它們之間的相似性或關聯性。
舉個例子,向量數據庫可以告訴你“巴黎”和“法國”比“巴黎”和“德國”更相關,基于它們的向量距離。
知識圖譜
知識圖譜是一組節點和邊,用于表示實體或概念以及它們之間的關系,例如事實、屬性或類別。知識圖譜可以根據節點和邊的屬性來查詢或推斷不同實體或概念的事實信息。
舉個例子,知識圖譜可以告訴你“巴黎”是“法國”的首都,基于它們的邊標簽。
知識圖譜組件
頂點/節點:表示知識領域中的實體或對象。每個節點對應一個唯一的實體,并由唯一的標識符進行標識。例如,在關于Chennai Kings的知識圖譜中,節點可以具有諸如“Philadelphia Phillies”和“Major League Cricket”這樣的值。
邊:表示兩個節點之間的關系。例如,一條“compete in”的邊可以將“Chennai Kings”節點連接到“Major League Cricket”節點。
知識圖譜中的基本數據單元
三元組是圖中的基本數據單元。它由三個部分組成:
主語:三元組所關于的節點。
賓語:關系指向的節點。
謂語:主語和賓語之間的關系。
在以下三元組示例中,“Chennai Kings”是主語,“compete in”是謂語,“Major League Cricket”是賓語。
(Chennai Kings) — [compete in]->(Major League Cricket)
知識圖譜數據庫可以通過存儲三元組來高效地存儲和查詢復雜的圖數據。
查詢圖數據庫
查詢涉及遍歷圖結構并根據特定標準檢索節點、關系或模式。下面是一個簡單的示例,展示了如何查詢圖數據庫:假設你有一個代表社交網絡的圖數據庫,其中用戶是節點,而它們的關系(例如友誼)由連接節點的邊表示。你想要找到給定用戶的朋友圈(共同的連接)。
從參考用戶開始:在圖數據庫中,通過查詢特定的用戶標識符或其他相關標準來識別代表參考用戶的節點。
遍歷圖:使用圖形查詢語言(如Neo4j中使用的Cypher或Gremlin)從參考用戶節點遍歷圖。編寫一個查詢,指定要探索的模式或關系。在這種情況下,您想要找到朋友的朋友。示例Cypher查詢:MATCH (:User {userId: ‘referenceUser’})-[:FRIEND]->()-[:FRIEND]->(fof:User) RETURN fof這個查詢從參考用戶開始,沿著FRIEND關系找到另一個節點(朋友),然后再沿著另一個FRIEND關系找到朋友的朋友(fof)。
檢索結果:在圖數據庫上執行查詢,根據查詢模式檢索出相應的節點(朋友的朋友)。如果需要,還可以獲取檢索到的節點的特定屬性或附加信息。
呈現結果:將檢索到的朋友的朋友顯示給用戶或按照需求進一步處理數據。這些信息可以用于建議、網絡分析或其他相關目的。
圖數據庫提供了更高級查詢功能,包括過濾、聚合和復雜模式匹配。具體的查詢語言和語法可能有所不同,但總體過程涉及遍歷圖結構以檢索與所需條件匹配的節點和關系。
查詢向量數據庫
通常涉及搜索相似向量或根據特定條件檢索向量。以下是查詢向量數據庫的簡單示例:假設你有一個包含客戶配置文件的向量數據庫,這些配置文件表示為高維向量,你想找到與給定參考客戶相似的客戶。
定義參考客戶向量:首先,為參考客戶定義一個向量表示。這可以通過提取相關特征或屬性并將它們轉換為向量格式來完成。
執行相似性搜索:使用合適的算法,如k-最近鄰(k-NN)或余弦相似度,在向量數據庫中執行相似性搜索。該算法將根據相似性分數識別參考客戶向量的最近鄰居。
檢索相似客戶:檢索與上一步中識別的最近鄰居向量對應的客戶配置文件。這些配置文件將根據定義的相似性度量表示與參考客戶相似的客戶。
呈現結果:最后,將檢索到的客戶配置文件或相關信息呈現給用戶,例如顯示他們的名字、人口統計信息或購買歷史。此信息可用于推薦、定向營銷活動或個性化體驗。
知識圖譜的優勢
相比于向量數據庫,知識圖譜提供了更精確和具體信息。向量數據庫表示兩個實體或概念之間的相似性或關聯性,而知識圖譜能夠更好地理解它們之間的關系。例如,知識圖譜可以告訴你“埃菲爾鐵塔”是“巴黎”的地標,而向量數據庫只能表示這兩個概念的相似程度。這可以幫助LLM生成更準確和相關的文本。
知識圖譜支持比向量數據庫更多樣化和復雜的查詢。向量數據庫主要基于向量距離、相似度或最近鄰來回答問題,這些僅限于直接相似度測量。相比之下,知識圖譜可以處理基于邏輯運算符(如“具有屬性Z的所有實體是什么?”或“W和V的共同類別是什么?”)的查詢。這可以幫助LLM生成更多樣化和有趣的文本。
知識圖譜比向量數據庫能夠進行更多的推理和推斷。向量數據庫只能提供直接存儲在數據庫中的信息。相比之下,知識圖譜可以從實體或概念之間的關系推導出間接信息。例如,知識圖譜可以根據“巴黎是法國的首都”和“法國位于歐洲”的事實推斷出“埃菲爾鐵塔位于歐洲”。這可以幫助LLM生成更符合邏輯和一致的文本。
LlamaIndex
LlamaIndex是一個編排框架,用于簡化將私有數據與公共數據集成以構建使用大型語言模型(LLMs)的應用程序。它提供了數據攝取、索引和查詢的工具,使其成為生成式AI需求的一種多功能解決方案。
嵌入模型
嵌入模型需要將文本轉換為所提供文本的信息的數字表示形式。該表示形式捕獲了所嵌入內容的語義含義,使其適用于許多行業應用。在這里,我們使用了“thenlper/gte-large”模型。
LLM
大型語言模型需要根據提供的問題和上下文生成響應。在這里,我們使用了Zephyr 7B beta模型。
代碼實現
1、安裝所有依賴庫
pipinstallllama_indexpyvisIpythonlangchainpypdf
2、設置日志
importlogging importsys # logging.basicConfig(stream=sys.stdout,level=logging.INFO) logging.getLogger().addHandler(logging.StreamHandler(stream=sys.stdout))
3、導包
fromllama_indeximport(SimpleDirectoryReader, LLMPredictor, ServiceContext, KnowledgeGraphIndex) # fromllama_index.graph_storesimportSimpleGraphStore fromllama_index.storage.storage_contextimportStorageContext fromllama_index.llmsimportHuggingFaceInferenceAPI fromlangchain.embeddingsimportHuggingFaceInferenceAPIEmbeddings fromllama_index.embeddingsimportLangchainEmbedding frompyvis.networkimportNetwork
SimpleDirectoryReader:用于讀取非結構化數據。
LLMPredictor:用于使用大型語言模型(LLM)生成預測。
ServiceContext:提供協調各種服務所需的上下文數據。
KnowledgeGraphIndex:用于構建和操作知識圖譜。
SimpleGraphStore:用作存儲圖數據的簡單倉庫。
HuggingFaceInferenceAPI:用于利用開源LLM的模塊。
4、引入LLM
HF_TOKEN='YourHuggaingfaceapikey' llm=HuggingFaceInferenceAPI( model_name='HuggingFaceH4/zephyr-7b-beta',token=HF_TOKEN )
5、引入embedding
embed_model=LangchainEmbedding( HuggingFaceInferenceAPIEmbeddings(api_key=HF_TOKEN,model_name='thenlper/gte-large') )
6、裝載數據
documents=SimpleDirectoryReader('/content/Documents').load_data() print(len(documents))
審核編輯:黃飛
-
數據庫
+關注
關注
7文章
3799瀏覽量
64390 -
大模型
+關注
關注
2文章
2450瀏覽量
2707
原文標題:借助知識圖譜和Llama-Index實現基于大模型的RAG-上
文章出處:【微信號:zenRRan,微信公眾號:深度學習自然語言處理】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論