Diffbot은 웹 데이터를 쉽게 구조화할 수 있는 ML 기반 제품 모음입니다. Diffbot의 Natural Language Processing API는 비구조화된 텍스트 데이터에서 엔티티, 관계 및 의미론적 의미를 추출할 수 있습니다. Open In Colab

사용 사례

텍스트 데이터는 다양한 분석, 추천 엔진 또는 지식 관리 애플리케이션에 사용되는 풍부한 관계와 인사이트를 포함하는 경우가 많습니다. Diffbot의 NLP API를 graph database인 Neo4j와 결합하면 텍스트에서 추출한 정보를 기반으로 강력하고 동적인 graph 구조를 만들 수 있습니다. 이러한 graph 구조는 완전히 쿼리 가능하며 다양한 애플리케이션에 통합될 수 있습니다. 이 조합을 통해 다음과 같은 사용 사례가 가능합니다:
  • 텍스트 문서, 웹사이트 또는 소셜 미디어 피드에서 knowledge graph(Diffbot의 Knowledge Graph와 같은)를 구축합니다.
  • 데이터의 의미론적 관계를 기반으로 추천을 생성합니다.
  • 엔티티 간의 관계를 이해하는 고급 검색 기능을 만듭니다.
  • 사용자가 데이터의 숨겨진 관계를 탐색할 수 있는 분석 대시보드를 구축합니다.

개요

LangChain은 Graph Database와 상호작용하기 위한 도구를 제공합니다:
  1. graph transformer 및 storage integration을 사용하여 텍스트에서 knowledge graph 구축
  2. query 생성 및 실행을 위한 chain을 사용하여 graph database 쿼리
  3. 강력하고 유연한 쿼리를 위해 agent를 사용하여 graph database와 상호작용

설정

먼저 필요한 패키지를 설치하고 환경 변수를 설정합니다:
pip install -qU  langchain langchain-experimental langchain-openai langchain-neo4j neo4j wikipedia

Diffbot NLP API

Diffbot의 NLP API는 비구조화된 텍스트 데이터에서 엔티티, 관계 및 의미론적 컨텍스트를 추출하는 도구입니다. 추출된 정보는 knowledge graph를 구성하는 데 사용할 수 있습니다. API를 사용하려면 Diffbot에서 무료 API token을 받아야 합니다.
from langchain_experimental.graph_transformers.diffbot import DiffbotGraphTransformer

diffbot_api_key = "DIFFBOT_KEY"
diffbot_nlp = DiffbotGraphTransformer(diffbot_api_key=diffbot_api_key)
이 코드는 “Warren Buffett”에 대한 Wikipedia 문서를 가져온 다음 DiffbotGraphTransformer를 사용하여 엔티티와 관계를 추출합니다. DiffbotGraphTransformer는 구조화된 데이터인 GraphDocument를 출력하며, 이는 graph database를 채우는 데 사용할 수 있습니다. 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)

knowledge graph에 데이터 로드하기

실행 중인 Neo4j 인스턴스가 필요합니다. 한 가지 옵션은 Aura 클라우드 서비스에서 무료 Neo4j database 인스턴스를 생성하는 것입니다. Neo4j Desktop 애플리케이션을 사용하여 로컬에서 database를 실행하거나 docker container를 실행할 수도 있습니다. 다음 스크립트를 실행하여 로컬 docker container를 실행할 수 있습니다:
docker run \
    --name neo4j \
    -p 7474:7474 -p 7687:7687 \
    -d \
    -e NEO4J_AUTH=neo4j/password \
    -e NEO4J_PLUGINS=\[\"apoc\"\]  \
    neo4j:latest
docker container를 사용하는 경우 database가 시작될 때까지 몇 초 정도 기다려야 합니다.
from langchain_neo4j import Neo4jGraph

url = "bolt://localhost:7687"
username = "neo4j"
password = "password"

graph = Neo4jGraph(url=url, username=username, password=password)
GraphDocumentsadd_graph_documents 메서드를 사용하여 knowledge graph에 로드할 수 있습니다.
graph.add_graph_documents(graph_documents)

graph schema 정보 새로고침

database의 schema가 변경되면 Cypher statement를 생성하는 데 필요한 schema 정보를 새로고침할 수 있습니다.
graph.refresh_schema()

graph 쿼리하기

이제 graph cypher QA chain을 사용하여 graph에 질문할 수 있습니다. 최상의 경험을 얻으려면 Cypher query를 구성하는 데 gpt-4를 사용하는 것이 좋습니다.
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.'

Connect these docs programmatically to Claude, VSCode, and more via MCP for real-time answers.
I