Diffbot
Diffbot 是一套基於 ML 的產品,可輕鬆結構化網路資料。
Diffbot 的 自然語言處理 API 允許從非結構化文字資料中擷取實體、關係和語意含義。
用例
文字資料通常包含用於各種分析、推薦引擎或知識管理應用程式的豐富關係和見解。
透過將 Diffbot 的 NLP API
與圖形資料庫 Neo4j
結合,您可以根據從文字中擷取的資訊建立強大、動態的圖形結構。這些圖形結構是完全可查詢的,並且可以整合到各種應用程式中。
這種組合允許以下用例,例如
- 從文字文件、網站或社群媒體摘要建立知識圖譜(如 Diffbot 的知識圖譜)。
- 根據資料中的語意關係產生建議。
- 建立了解實體之間關係的進階搜尋功能。
- 建立分析儀表板,讓使用者探索資料中的隱藏關係。
概觀
LangChain 提供與圖形資料庫互動的工具
從文字建構知識圖譜
,使用圖形轉換器和儲存整合查詢圖形資料庫
,使用鏈來建立和執行查詢與圖形資料庫互動
,使用代理程式進行穩健且彈性的查詢
設定
首先,取得所需的套件並設定環境變數
%pip install --upgrade --quiet langchain langchain-experimental langchain-openai langchain-neo4j neo4j wikipedia
Diffbot NLP API
Diffbot 的 NLP API
是一種從非結構化文字資料中擷取實體、關係和語意上下文的工具。此擷取的資訊可用於建構知識圖譜。若要使用 API,您需要從 Diffbot 取得免費 API 令牌。
from langchain_experimental.graph_transformers.diffbot import DiffbotGraphTransformer
diffbot_api_key = "DIFFBOT_KEY"
diffbot_nlp = DiffbotGraphTransformer(diffbot_api_key=diffbot_api_key)
此程式碼擷取關於「華倫·巴菲特」的 Wikipedia 文章,然後使用 DiffbotGraphTransformer
擷取實體和關係。DiffbotGraphTransformer
輸出結構化資料 GraphDocument
,可用於填入圖形資料庫。請注意,由於 Diffbot 的 每個 API 請求的字元限制,因此避免了文字分塊。
from langchain_community.document_loaders import WikipediaLoader
query = "Warren Buffett"
raw_documents = WikipediaLoader(query=query).load()
graph_documents = diffbot_nlp.convert_to_graph_documents(raw_documents)
將資料載入知識圖譜
您將需要有一個正在運行的 Neo4j 實例。一種選擇是在他們的 Aura 雲端服務中建立一個免費 Neo4j 資料庫實例。您也可以使用 Neo4j Desktop 應用程式在本機運行資料庫,或運行 docker 容器。您可以透過執行以下腳本來運行本機 docker 容器
docker run \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-d \
-e NEO4J_AUTH=neo4j/password \
-e NEO4J_PLUGINS=\[\"apoc\"\] \
neo4j:latest
如果您使用的是 docker 容器,則需要等待幾秒鐘才能啟動資料庫。
from langchain_neo4j import Neo4jGraph
url = "bolt://127.0.0.1:7687"
username = "neo4j"
password = "password"
graph = Neo4jGraph(url=url, username=username, password=password)
可以使用 add_graph_documents
方法將 GraphDocuments
載入到知識圖譜中。
graph.add_graph_documents(graph_documents)
重新整理圖形結構描述資訊
如果資料庫的結構描述變更,您可以重新整理產生 Cypher 陳述式所需的結構描述資訊
graph.refresh_schema()
查詢圖形
我們現在可以使用圖形 cypher QA 鏈來詢問圖形的問題。建議使用 gpt-4 來建構 Cypher 查詢,以獲得最佳體驗。
from langchain_neo4j import GraphCypherQAChain
from langchain_openai import ChatOpenAI
chain = GraphCypherQAChain.from_llm(
cypher_llm=ChatOpenAI(temperature=0, model_name="gpt-4"),
qa_llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo"),
graph=graph,
verbose=True,
allow_dangerous_requests=True,
)
chain.run("Which university did Warren Buffett attend?")
[1m> Entering new GraphCypherQAChain chain...[0m
Generated Cypher:
[32;1m[1;3mMATCH (p:Person {name: "Warren Buffett"})-[:EDUCATED_AT]->(o:Organization)
RETURN o.name[0m
Full Context:
[32;1m[1;3m[{'o.name': 'New York Institute of Finance'}, {'o.name': 'Alice Deal Junior High School'}, {'o.name': 'Woodrow Wilson High School'}, {'o.name': 'University of Nebraska'}][0m
[1m> Finished chain.[0m
'Warren Buffett attended the University of Nebraska.'
chain.run("Who is or was working at Berkshire Hathaway?")
[1m> Entering new GraphCypherQAChain chain...[0m
Generated Cypher:
[32;1m[1;3mMATCH (p:Person)-[r:EMPLOYEE_OR_MEMBER_OF]->(o:Organization) WHERE o.name = 'Berkshire Hathaway' RETURN p.name[0m
Full Context:
[32;1m[1;3m[{'p.name': 'Charlie Munger'}, {'p.name': 'Oliver Chace'}, {'p.name': 'Howard Buffett'}, {'p.name': 'Howard'}, {'p.name': 'Susan Buffett'}, {'p.name': 'Warren Buffett'}][0m
[1m> Finished chain.[0m
'Charlie Munger, Oliver Chace, Howard Buffett, Susan Buffett, and Warren Buffett are or were working at Berkshire Hathaway.'