Diffbot
Diffbot 是一套基于 ML 的产品,可以轻松构建 Web 数据。
Diffbot 的自然语言处理 API 允许从非结构化文本数据中提取实体、关系和语义含义。
用例
文本数据通常包含用于各种分析、推荐引擎或知识管理应用程序的丰富关系和洞察。
通过耦合Diffbot's NLP API跟Neo4j,则可以根据从文本中提取的信息创建功能强大的动态图形结构。这些图形结构是完全可查询的,并且可以集成到各种应用程序中。
这种组合适用于以下用例:
- 从文本文档、网站或社交媒体源构建知识图谱(如 Diffbot 的知识图谱)。
- 根据数据中的语义关系生成推荐。
- 创建了解实体之间关系的高级搜索功能。
- 构建允许用户探索数据中隐藏关系的分析仪表板。
概述
LangChain 提供了与 Graph 数据库交互的工具:
Construct knowledge graphs from text使用 Graph Transformer 和 Store 集成Query a graph database使用链创建和执行查询Interact with a graph database使用代理进行可靠而灵活的查询
建立
首先,获取所需的包并设置环境变量:
%pip install --upgrade --quiet langchain langchain-experimental langchain-openai langchain-neo4j neo4j wikipedia
Diffbot NLP 应用程序接口
Diffbot's 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 中关于 “Warren Buffett” 的文章,然后使用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 桌面应用程序或运行 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://localhost:7687"
username = "neo4j"
password = "password"
graph = Neo4jGraph(url=url, username=username, password=password)
这GraphDocuments可以使用add_graph_documents方法。
graph.add_graph_documents(graph_documents)
刷新图形架构信息
如果数据库的 schema 发生变化,您可以刷新生成 Cypher 语句所需的 schema 信息
graph.refresh_schema()
查询图表
我们现在可以使用图形密码 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.'