Skip to main content
Open In ColabOpen on GitHub

Diffbot

Diffbot is a suite of ML-based products that make it easy to structure web data.

Diffbot's Natural Language Processing API allows for the extraction of entities, relationships, and semantic meaning from unstructured text data. Open In Colab

应用场景

文本数据通常包含丰富的关联和洞察,可用于各种分析、推荐引擎或知识管理应用。

通过将 Diffbot's NLP APINeo4j(一个图数据库)相结合,可以根据从文本中提取的信息创建强大且动态的图结构。这些图结构完全可查询,并可以集成到各种应用程序中。

这种组合使得以下用例成为可能:

  • 从文本文档、网站或社交媒体提要构建知识图谱(例如 Diffbot 的知识图谱)。
  • 基于数据中的语义关系生成推荐。
  • 创建高级搜索功能,能够理解实体之间的关系。
  • 构建分析仪表盘,让用户探索数据中隐藏的关系。

概览

LangChain 提供了与图数据库交互的工具:

  1. Construct knowledge graphs from text 使用图转换器和存储集成
  2. Query a graph database 使用链进行查询创建和执行
  3. Interact with a graph database 使用代理进行强大且灵活的查询

设置

首先,获取所需的包并设置环境变量:

%pip install --upgrade --quiet  langchain langchain-experimental langchain-openai langchain-neo4j neo4j wikipedia

Diffbot 自然语言处理API

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)

这段代码获取关于“沃伦·巴菲特”的维基百科文章,然后使用 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)
API 参考:WikipediaLoader

加载数据到知识图谱

你需要运行一个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)
API 参考:Neo4jGraph

GraphDocuments 可以使用 add_graph_documents 方法加载到知识图谱中。

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?")


> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (p:Person {name: "Warren Buffett"})-[:EDUCATED_AT]->(o:Organization)
RETURN o.name
Full Context:
[{'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'}]

> Finished chain.
'Warren Buffett attended the University of Nebraska.'
chain.run("Who is or was working at Berkshire Hathaway?")


> Entering new GraphCypherQAChain chain...
Generated Cypher:
MATCH (p:Person)-[r:EMPLOYEE_OR_MEMBER_OF]->(o:Organization) WHERE o.name = 'Berkshire Hathaway' RETURN p.name
Full Context:
[{'p.name': 'Charlie Munger'}, {'p.name': 'Oliver Chace'}, {'p.name': 'Howard Buffett'}, {'p.name': 'Howard'}, {'p.name': 'Susan Buffett'}, {'p.name': 'Warren Buffett'}]

> Finished chain.
'Charlie Munger, Oliver Chace, Howard Buffett, Susan Buffett, and Warren Buffett are or were working at Berkshire Hathaway.'