使用LangChain和Neo4j快速創建RAG應用

大家好,Neo4j 通過集成原生的向量搜索功能,增強了其對檢索增強生成(RAG)應用的支持,這標志著一個重要的里程碑。這項新功能通過向量索引搜索處理非結構化文本,增強了 Neo4j 在存儲和分析結構化數據方面的現有優勢,進一步鞏固了其在存儲和分析結構化數據方面的領先地位。

本文將詳細介紹如何利用 Neo4j Desktop(本地版)和 Neo4j Aura(云服務版)來存儲向量索引,并構建一個基于純文本數據的 RAG 應用。

1.云服務部署

要使用基于云的 Neo4j Aura,需要按照以下步驟操作:

首先,點擊鏈接創建一個實例(https://neo4j.com)。在設置過程中,系統會提示輸入默認的用戶名(neo4j)和實例的密碼。請務必記下這個密碼,因為設置后將無法再次查看。

創建賬戶后,會看到這樣的界面:

圖片

實例啟動并運行后,接下來的任務是生成嵌入向量并將其存儲。這里采用OpenAI的嵌入技術,這需要一個OPENAI_API_KEY。

為了將這些嵌入向量上傳到Neo4j Aura實例,需要準備好以下環境變量:NEO4J_URI(Neo4j實例的URI)、NEO4J_USERNAME(用戶名)和NEO4J_PASSWORD(密碼)。

使用LangChain的WikipediaLoader功能,直接從Wikipedia網頁中導入文章內容。

然后,將文章拆分成多個段落,并去除所有元數據,因為我們不需要存儲這些信息。

import?os
from?langchain.vectorstores?import?Neo4jVector
from?langchain.embeddings.openai?import?OpenAIEmbeddings
from?langchain.document_loaders?import?WikipediaLoader
from?langchain.text_splitter?import?CharacterTextSplitter
from?langchain_core.prompts?import?ChatPromptTemplate
from?langchain_core.output_parsers?import?StrOutputParser
from?langchain_core.prompts?import?ChatPromptTemplate
from?langchain_core.runnables?import?RunnablePassthrough#?OPENAI?API?密鑰
os.environ["OPENAI_API_KEY"]?=?"sk-G7F8rdGxxXOWegj5nxxx3BlbkFJj7AuFUP5yyyAKKxSVTGQw"
#?neo4j?憑證
NEO4J_URI="neo4j+s://9cb33544.databases.neo4j.io"
NEO4J_USERNAME="neo4j"
NEO4J_PASSWORD="rexxxJJOzDt4kjaaKgM_VyWUdT9GE4hNBXXGMNubg"#?加載數據和分塊
#?讀取?Wikipedia?文章
raw_documents?=?WikipediaLoader(query="Leonhard?Euler").load()
#?定義分塊策略
text_splitter?=?CharacterTextSplitter.from_tiktoken_encoder(chunk_size=1000,?chunk_overlap=20
)
#?分塊文檔
documents?=?text_splitter.split_documents(raw_documents)#?從元數據中移除摘要
for?d?in?documents:del?d.metadata['summary']

以下代碼片段可將嵌入向量導入 Neo4j 實例:

#?實例化?Neo4j?向量
neo4j_vector?=?Neo4jVector.from_documents(documents,OpenAIEmbeddings(),url=NEO4J_URI,username=NEO4J_USERNAME,password=NEO4J_PASSWORD
)

要在 Neo4j Aura 中訪問和檢查嵌入向量,需點擊界面上的打開圖標,會在瀏覽器中新開一個標簽頁。在這個新標簽頁中,可以查看到塊和向量索引的詳細信息。我們共有56個塊,在系統中被識別為節點。此外,還可以在這個標簽頁中查看每個塊對應的嵌入向量及其具體細節。

圖片

向量檢索

這段代碼片段通過使用 Neo4jVector 對象并進行相似性搜索,幫助檢索與查詢“Euler 在哪里長大?”相關的前 4 個相關塊。這段代碼默認采用余弦相似性方法來識別和排序向量之間的相似度。

query?=?"Where?did?Euler?grow?up?"
results?=?neo4j_vector.similarity_search(query=query,?k=4)
print(results)#?檢索到的四個文檔
#?[Document(page_content='==?Early?life?==\nLeonhard?Euler?was?born?on?15?April?1707,?in?Basel?to?Paul?III?Euler,?a?pastor?of?the?Reformed?Church,?and?Marguerite?(née?Brucker),?whose?ancestors?include?a?number?of?well-known?scholars?in?the?classics.?He?was?the?oldest?of?four?children,?having?two?younger?sisters,?Anna?Maria',?metadata={'title':?'Leonhard?Euler',?'source':?'https://en.wikipedia.org/wiki/Leonhard_Euler'}),?...]

創建鏈

我們構建了一個名為final_chain的處理鏈,旨在高效地處理問題并生成答案。這個鏈的工作原理是:首先,它接收并傳遞上下文信息給Neo4jVector retriever,以便從Neo4j數據庫中檢索相關的向量。隨后,鏈會利用一個OpenAI模型(版本為gpt-4-1106-preview)處理接收到的提示。最終,通過一個解析器對模型的輸出進行處理,以提煉出精確的答案。final_chain的設計實現了在特定上下文中對問題的智能處理和答案生成,提高了整個操作的自動化和效率。

prompt?=?ChatPromptTemplate.from_template("""Answer?the?question?based?only?on?the?context?provided.Context:?{context}Question:?{question}"""
)#?創建一個?lambda?函數將上下文傳遞給?Neo4jVector?retriever
context_to_retriever?=?lambda?x:?x["question"]#?創建鏈,將上下文賦值給?Neo4jVector?retriever
final_chain?=?(RunnablePassthrough.assign(context=context_to_retriever,?target=lambda?x:?neo4j_vector)|?prompt|?ChatOpenAI(model="gpt-4-1106-preview")|?StrOutputParser()
)result?=?final_chain.invoke({'question':?query})#?最終結果
print(result)
# Euler 在瑞士巴塞爾長大。

2.本地部署

如果想在本地的Neo4j Desktop中存儲嵌入向量,可以直接在本地環境中運行該應用。操作起來非常簡單,只需對憑證信息進行更新,其余的步驟則無需更改。

具體來說,需要分別為數據庫和數據庫管理系統設置用戶名和密碼。完成這些設置后,就可以在本地的Neo4j Desktop上順利地執行應用程序了。

NEO4J_URI="bolt://localhost:7687"
NEO4J_USERNAME="neo4j"
NEO4J_PASSWORD="newpassword"

其余部分與上述相同。

3.總結

綜上所述,Neo4j 通過整合其內置的向量搜索功能,顯著提升了對檢索增強生成(RAG)應用的支持能力。這不僅加強了其在傳統結構化數據分析方面的優勢,還使其能夠更有效地處理非結構化文本數據。本文詳細介紹了如何利用Neo4j Aura和Neo4j Desktop來存儲向量索引,并在LangChain框架的輔助下,構建出高效的RAG應用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/11600.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/11600.shtml
英文地址,請注明出處:http://en.pswp.cn/web/11600.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

go語言map底層及擴容機制原理詳解(上)

底層數據結構-哈希表 go語言map的底層數據結構是哈希表:通過哈希表來存儲鍵值對,通過hash函數把鍵值對散列到一個個桶(bucket)中。 什么是哈希表? 在順序結構以及平衡樹中,元素與其的存儲位置之間沒有對應關系,因此…

SwiftUI中的@StateObject和@ObservedObject的區別

SwiftUI中的StateObject和ObservedObject屬性包裝器指示視圖更新以響應被觀察對象的變化。雖然這兩個屬性包裝器看起來很相似,但在使用SwiftUI構建應用程序時,有一個關鍵的區別需要理解。 兩個屬性包裝器都要求對象符合ObservableObject協議。這個協議表…

表征和基于結構的蛋白質工程:黃芪特異性皂苷乙酰轉移酶-文獻精讀14

Characterization and structure-based protein engineering of a regiospecific saponin acetyltransferase from Astragalus membranaceus 表征和基于結構的蛋白質工程:黃芪特異性皂苷乙酰轉移酶,一篇乙酰基轉移酶文章精讀分享~ 摘要 乙酰化有助于許…

【C++】繼承相關(基類與派生類的繼承關系以及細節整理)

目錄 00.引言 01.繼承的定義 02.基類和派生類對象 03.繼承中的作用域 04.派生類的默認成員函數 05.友元、靜態成員 00.引言 繼承是面向對象編程中的一個重要概念,它的作用是創建一個新的類,該類可以從一個已存在的類(父類/基類&#x…

服務攻防——數據庫安全

第一步: 端口掃描:nmap 掃不到端口:端口被修改,防護軟件,放在內網環境 mysql 內置端口3306 第一種官方漏洞 第一步:先掃描有什么端口開發 用這個錯誤密碼一直訪問,最終就進去了 弱口令猜解 不可以直接猜解&#x…

WEB后端復習——MVC、SSM【含登錄頁面代碼】

MVC(Model-View-Controller)是一種軟件設計模式,用于將應用程序分解為三個相互關聯的組件:模型(Model)、視圖(View)和控制器(Controller)。這種模式在構建用戶…

機器人學導論實驗1—CoppeliaSim 平臺介紹及初步使用BJTU

1. 實驗內容分析 對實驗內容的理解及關鍵點: 理解這個實驗的關鍵點在于理解如何使用CoppeliaSim和MATLAB來控制和操作機器人。需要熟悉這兩個工具的基本操作,例如如何加載場景、如何修改機器人參數、如何使用MATLAB客戶端程序來控制機器人等。此外&#…

Docker 部署 Prometheus 實現一個極簡的 QPS 監控

背景 : Prometheus 是近年來最流行的開源監控框架, 其功能強大且易于使用, 擁有各種主流后端語言(Java/Go/Python/Node.js等)與各種場景(如web handler/ k8s/Nginx/MySQL等)的客戶端, 并自帶圖形化顯示頁面。分享一個快速入門Prometheus 的教程, 實現一個極簡的, 后端開發需要特…

Nginx-基礎-基礎配置-Location

Location 參數匹配模式 參數匹配方式匹配模式說明注意事項精準匹配普通字符串匹配用于標準uri前,要求請求字符串與uri精準匹配,成功則立即處理,nginx停止搜索其他匹配。~正則匹配正則表達式匹配用于正則uri,表示uri包含正則表達…

使用 Docker 輕松部署 Spring Boot 應用

當今軟件開發領域,Docker 和 Spring Boot 的組合已成為開發和部署應用程序的黃金標準。在這篇博客中,我們將詳細探討如何將 Spring Boot 應用容器化并使用 Docker 進行部署,確保你的部署過程既高效又可靠。 引言 Docker 提供了一個標準化的…

基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。

演示視頻: 基于SSM的理發店會員管理系統的設計和實現(有報告)。Javaee項目。ssm項目。 項目介紹: 采用M(model)V(view)C(controller)三層體系結構&#xff0…

Docker安裝達夢數據庫

1.確保已安裝Docker 可參考:Linux安裝Docker-CSDN博客 2.上傳dm鏡像并導入安裝包 可以從:產品下載 | 達夢數據庫下載dm鏡像,如下圖: docker load -i dm8_20230808.tar 3.導入后查看鏡像 docker images 4.啟動容器 docker run …

圖的概念、性質和存儲與簡單遍歷

前置知識:樹的基本概念及性質 為了保證學習效果,請保證已經掌握前置知識之后,再來學習本章節!如果在閱讀中遇到困難,也可以回到前面章節查閱。 學習目標 掌握圖的基本概念掌握圖的一些性質 圖的概念 基本概念 圖 (…

Pytorch如何計算網絡參數

方法一. 利用pytorch自身 PyTorch是一個流行的深度學習框架,它允許研究人員和開發者快速構建和訓練神經網絡。計算一個PyTorch網絡的參數量通常涉及兩個步驟:確定網絡中每個層的參數數量,并將它們加起來得到總數。 以下是在PyTorch中計算網…

如何在 CloudFlare 里屏蔽/攔截某個 IP 或者 IP 地址段

最近除了接的 CloudFlare 代配置訂單基本很少折騰自己的 CloudFlare 配置了,今天給大家簡單的講解一下如何在 CloudFlare 里屏蔽/攔截 IP 地址和 IP 地址段,雖然明月一直都很反感針對 IP 的屏蔽攔截,但不得不說有時候還是很有必要的。并且,既然可以攔截屏蔽 IP 自然也可以但…

鴻蒙內核源碼分析(VFS篇) | 文件系統和諧共處的基礎

基本概念 | 官方定義 VFS(Virtual File System)是文件系統的虛擬層,它不是一個實際的文件系統,而是一個異構文件系統之上的軟件粘合層,為用戶提供統一的類Unix文件操作接口。由于不同類型的文件系統接口不統一&#x…

Flink HA模式下JobManager切換時發送告警

資源&版本信息 Flink版本1.14.6 運行平臺:K8s HA使用ZK(使用K8s的ETC應該是一個道理) 詳解Flink HA原理 Flink啟動時會創建HighAvailabilityServices提供HA和相關基礎服務,其中包括leaderRetrievalService和LeaderElecti…

搜索引擎的設計與實現(二)

目錄 3 搜索引擎的基本原理 3.1搜索引擎的基本組成及其功能 l.搜索器 (Crawler) 2.索引器(Indexer) 3.檢索器(Searcher) 4.用戶接口(UserInterface) 3.2搜索引擎的詳細工作流程 4 系統分析與設計 4.1系統分析 4.2系統概要設計 4.2系統實現目標 前面內容請移步 搜索引…

Rust 語言不支持 goto 語句

一、Rust 不提供 goto 語句 Rust 語言并沒有提供 goto 語句。goto 語句在很多現代編程語言中已經不再被推薦使用,因為它可能導致代碼的流程變得難以跟蹤和理解,特別是在復雜的程序中。Rust 語言設計者選擇了更加結構化和可預測的控制流語句,…

關于C++多態的復習總結

多態 簡介: 面向對象的三大特性之一,多態顧名思義即具有多種形態,即去執行某個行為時,當不同的對象去執行時會產生不同的狀態 構成多態的條件 條件一 必須通過基類(父類)的指針或者引用調用虛函數(函數…