Neo4j 在5.11版本中將向量搜索功能完全集成到 Neo4j AuraDB 和 Neo4j 圖數(shù)據(jù)庫中。隨后對 Neo4j 向量檢索的全面支持也被集成到了 LangChain 庫中。
Neo4j 向量檢索已成為檢索增強(qiáng)生成 (RAG) 應(yīng)用程序領(lǐng)域的關(guān)鍵工具,特別是在處理結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)方面。LangChain 庫是構(gòu)建大型語言模型 (LLM) 應(yīng)用程序的重要框架。
這種集成有助于將數(shù)據(jù)有效地?cái)z取到 Neo4j Vector Index 中,簡化了 RAG 應(yīng)用程序中的數(shù)據(jù)攝取和查詢,并能夠構(gòu)建有效的 RAG 應(yīng)用程序,通過利用結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)提供實(shí)時(shí)、準(zhǔn)確且與上下文相關(guān)的答案。它支持?jǐn)?shù)據(jù)攝取和讀取工作流程,對于使用 RAG 架構(gòu)開發(fā)問答聊天機(jī)器人特別有用。
這篇文章將演示如何利用 LangChain 將數(shù)據(jù)有效攝取到 Neo4j 向量索引中,然后構(gòu)建一個(gè)簡單而有效的 RAG 應(yīng)用程序。
本教程將包含以下步驟:
-
使用 LangChain 文檔閱讀器閱讀維基百科文章
-
將文本分塊
-
將文本存儲(chǔ)在 Neo4j 中并使用新添加的向量索引對其進(jìn)行索引
-
實(shí)施問答工作流程以支持 RAG 應(yīng)用程序。
用通俗易懂方式講解系列
- 用通俗易懂的方式講解:自然語言處理初學(xué)者指南(附1000頁的PPT講解)
- 用通俗易懂的方式講解:NLP 這樣學(xué)習(xí)才是正確路線
- 用通俗易懂的方式講解:28張圖全解深度學(xué)習(xí)知識(shí)!
- 用通俗易懂的方式講解:不用再找了,這就是 NLP 方向最全面試題庫
- 用通俗易懂的方式講解:實(shí)體關(guān)系抽取入門教程
- 用通俗易懂的方式講解:靈魂 20 問幫你徹底搞定Transformer
- 用通俗易懂的方式講解:大模型算法面經(jīng)指南(附答案)
- 用通俗易懂的方式講解:十分鐘部署清華 ChatGLM-6B,實(shí)測效果超預(yù)期
- 用通俗易懂的方式講解:內(nèi)容講解+代碼案例,輕松掌握大模型應(yīng)用框架 LangChain
- 用通俗易懂的方式講解:如何用大語言模型構(gòu)建一個(gè)知識(shí)問答系統(tǒng)
- 用通俗易懂的方式講解:最全的大模型 RAG 技術(shù)概覽
技術(shù)交流群
前沿技術(shù)資訊、算法交流、求職內(nèi)推、算法競賽、面試交流(校招、社招、實(shí)習(xí))等、與 10000+來自港科大、北大、清華、中科院、CMU、騰訊、百度等名校名企開發(fā)者互動(dòng)交流~
我們建了NLP面試與技術(shù)交流群, 想要進(jìn)交流群、需要源碼&資料、提升技術(shù)的同學(xué),可以直接加微信號(hào):mlc2060。加的時(shí)候備注一下:研究方向 +學(xué)校/公司+CSDN,即可。然后就可以拉你進(jìn)群了。
方式①、添加微信號(hào):mlc2060,備注:技術(shù)交流
方式②、微信搜索公眾號(hào):機(jī)器學(xué)習(xí)社區(qū),后臺(tái)回復(fù):技術(shù)交流
01 Neo4j 環(huán)境設(shè)置
我們需要設(shè)置 Neo4j 5.11 或更高版本才能完成本文章中的示例。最簡單的方法是在 Neo4j Aura 上啟動(dòng)一個(gè)免費(fèi)實(shí)例,它提供 Neo4j 數(shù)據(jù)庫的云實(shí)例。或者,我們還可以通過下載 Neo4j Desktop 應(yīng)用程序并創(chuàng)建本地?cái)?shù)據(jù)庫實(shí)例來設(shè)置 Neo4j 數(shù)據(jù)庫的本地實(shí)例。
首先安裝 langchain openai wikipedia tiktoken neo4j 包
pip install langchain openai wikipedia tiktoken neo4j
然后導(dǎo)入配置
import os
from langchain.vectorstores.neo4j_vector import Neo4jVector
from langchain.document_loaders import WikipediaLoader
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.text_splitter import CharacterTextSplitter
os.environ['OPENAI_API_KEY'] = "API_KEY"
02 閱讀和分塊維基百科文章
我們將從閱讀和分塊維基百科文章開始。這個(gè)過程非常簡單,因?yàn)?LangChain 集成了維基百科文檔加載器以及文本分塊模塊。
from langchain.document_loaders import WikipediaLoader
from langchain.text_splitter import CharacterTextSplitter
# Read the wikipedia article
raw_documents = WikipediaLoader(query="Leonhard Euler").load()
# Define chunking strategy
text_splitter = CharacterTextSplitter.from_tiktoken_encoder(
chunk_size=1000, chunk_overlap=20
)
# Chunk the document
documents = text_splitter.split_documents(raw_documents)
# Remove summary from metadata
for d in documents:
del d.metadata['summary']
由于 Neo4j 是一個(gè)圖形數(shù)據(jù)庫,使用有關(guān) Leonhard Euler 的維基百科文章作為示例是比較合適的。接下來,我們使用 tiktoken 文本分塊模塊,該模塊使用 OpenAI 制作的分詞器,將文章分成具有1000個(gè)標(biāo)記的塊。我們可以在本文中了解有關(guān)文本分塊策略的更多信息。
LangChain WikipediaLoader 默認(rèn)為每個(gè)塊添加一個(gè)摘要。我認(rèn)為添加的摘要有點(diǎn)多余。例如,如果我們使用向量相似性搜索來檢索前三個(gè)結(jié)果,則摘要將重復(fù)三次。因此,我決定將其從數(shù)據(jù)集中刪除。
03 使用 Neo4j 存儲(chǔ)文本并為其建立索引
LangChain 可以輕松地將文檔導(dǎo)入 Neo4j 并使用新添加的向量索引對其進(jìn)行索引,官方盡可能地使其用戶友好,這意味著我們無需了解有關(guān) Neo4j 或圖形的任何知識(shí)即可使用它。另一方面,官方為更有經(jīng)驗(yàn)的用戶提供了幾個(gè)自定義選項(xiàng),這些選項(xiàng)官方都會(huì)出單獨(dú)的文章進(jìn)行介紹。
Neo4j 向量索引被包裝為 LangChain 向量存儲(chǔ),因此遵循用于與其他向量數(shù)據(jù)庫交互的語法。
from langchain.vectorstores import Neo4jVector
from langchain.embeddings.openai import OpenAIEmbeddings
# Neo4j Aura credentials
url="neo4j+s://.databases.neo4j.io"
username="neo4j"
pd="<insert password>"
# Instantiate Neo4j vector from documents
neo4j_vector = Neo4jVector.from_documents(
documents,
OpenAIEmbeddings(),
url=url,
username=username,
password=pd
)
該 from_documents 方法連接到 Neo4j 數(shù)據(jù)庫,導(dǎo)入并嵌入文檔,并創(chuàng)建向量索引。默認(rèn)情況下,數(shù)據(jù)將表示為“Chunk”節(jié)點(diǎn)。如前所述,我們可以自定義數(shù)據(jù)的存儲(chǔ)方式以及返回哪些數(shù)據(jù)。不過,這將在下面的文章中討論。
如果我們已有包含填充數(shù)據(jù)的現(xiàn)有向量索引,則可以使用該 from_existing_index 方法。
04 向量相似度搜索
我們將從簡單的向量相似性搜索開始,以驗(yàn)證一切是否按預(yù)期工作。
query = "Where did Euler grow up?"
results = neo4j_vector.similarity_search(query, k=1)
print(results[0].page_content)
結(jié)果如下:
LangChain 模塊使用指定的嵌入函數(shù)(本例中為 OpenAI)嵌入問題,然后通過比較用戶問題和索引文檔之間的余弦相似度來找到最相似的文檔。
Neo4j 向量索引還支持歐幾里得相似度度量以及余弦相似度。
05 LangChain 問答工作流程
LangChain 的好處是它支持僅使用一兩行代碼的問答工作流程。例如,如果我們想要?jiǎng)?chuàng)建一個(gè)問答系統(tǒng),根據(jù)提供的上下文生成答案,同時(shí)還提供它用作上下文的文檔,我們可以使用以下代碼。
from langchain.chat_models import ChatOpenAI
from langchain.chains import RetrievalQAWithSourcesChain
chain = RetrievalQAWithSourcesChain.from_chain_type(
ChatOpenAI(temperature=0),
chain_type="stuff",
retriever=neo4j_vector.as_retriever()
)
query = "What is Euler credited for popularizing?"
chain(
{"question": query},
return_only_outputs=True,
)
結(jié)果如下:
正如我們所看到的,LLM 根據(jù)提供的維基百科文章構(gòu)建了準(zhǔn)確的答案,但也返回了它使用的源文檔。我們只需要一行代碼就可以實(shí)現(xiàn)這一點(diǎn)。
在測試代碼時(shí),我注意到并不總是返回源代碼。這里的問題不是 Neo4j Vector 實(shí)現(xiàn),而是 GPT-3.5-turbo。有時(shí),它不聽指令返回源文檔。但是,如果我們使用 GPT-4,問題就會(huì)消失。
最后,為了復(fù)制 ChatGPT 界面,我們可以添加一個(gè)內(nèi)存模塊,該模塊還為 LLM 提供對話歷史記錄,以便我們可以提出后續(xù)問題。同樣,我們只需要兩行代碼。
from langchain.chains import ConversationalRetrievalChain
from langchain.memory import ConversationBufferMemory
memory = ConversationBufferMemory(memory_key="chat_history", return_messages=True)
qa = ConversationalRetrievalChain.from_llm(
ChatOpenAI(temperature=0), neo4j_vector.as_retriever(), memory=memory)
現(xiàn)在我們來測試一下。
print(qa({"question": "What is Euler credited for popularizing?"})["answer"])
結(jié)果如下:
現(xiàn)在是一個(gè)后續(xù)問題。
print(qa({"question": "Where did he grow up?"})["answer"])
結(jié)果如下:
總結(jié)
向量索引是 Neo4j 的一個(gè)重要補(bǔ)充,使其成為處理 RAG 應(yīng)用程序的結(jié)構(gòu)化和非結(jié)構(gòu)化數(shù)據(jù)的出色解決方案。希望 LangChain 集成能夠簡化將向量索引集成到現(xiàn)有或新的 RAG 應(yīng)用程序中的過程,這樣我們就不必?fù)?dān)心細(xì)節(jié)。請記住,LangChain 已經(jīng)支持生成 Cypher 語句并使用它們來檢索上下文,因此我們現(xiàn)在可以使用它來檢索結(jié)構(gòu)化和非結(jié)構(gòu)化信息。
參考文獻(xiàn)文章來源:http://www.zghlxwxcb.cn/news/detail-804756.html
https://medium.com/neo4j/langchain-library-adds-full-support-for-neo4j-vector-index-fa94b8eab334文章來源地址http://www.zghlxwxcb.cn/news/detail-804756.html
到了這里,關(guān)于利用 LangChain 和 Neo4j 向量索引,構(gòu)建一個(gè)RAG應(yīng)用程序的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!