Neo4J Desktop과 python 연동 및 Langchain과 GPT를 통한 Grape RAG 탐색

zoo_gathers·2024년 11월 6일

Neo4J

목록 보기
3/4

이 글은 이전 내용을 진행했다는 가정하에 진행되는 다음 단계로 아래 게시글을 읽고 와주시기 바랍니다.

Neo4J Desktop에서 CSV 데이터 셋으로 DB 구축하기

준비물 : Neo4J Desktop, gpt api


이전에 우리는 Neo4J Desktop에 CSV 데이터 셋을 Import하고 노드와 관계를 구성하는 것까지 진행했다.

이번에는 Python을 통해 로컬 Neo4J Desktop에 연결하고 gpt를 통해 단순 자연어로 DB 내용을 가져오도록 하고자 한다.

우리는 이전에 프로젝트를 만들 때

이름과 함께 비밀번호를 지정했다.

만약 비밀번호를 잊었다면 아래와 같이 설정에서 바꾸도록 하자.

Test를 누르면 위와 같이 오른쪽에 Details가 뜨고 창 아래에 Reset DBMS password를 누르면 쉽게 비밀번호를 다시 설정할 수 있다.

비밀번호를 찾았다면 다음으로 Details 옆에 Plugins를 클릭해보자.

클릭하면 아래와 같이

화면이 뜨게 되는데 우리는 여기서 APOC를 클릭하고 Install을 통해 반드시 APOC를 다운로드 하도록 한다.

우리가 APOC를 다운로드 하는 이유는 다음과 같다.

  • APOC (Awesome Procedures on Cypher)은 Neo4j에 다양한 유용한 기능을 추가해 주는 라이브러리로, Neo4j의 기본 기능을 확장해주기 때문.

  • 이후 langchain을 활용하는데, 이때 langchain의 Neo4jGraph 클래스는 Neo4j의 데이터와 메타데이터에 접근하기에 이 때 APOC의 일부 절차가 필요.


다운로드를 진행했으면 이제 프로젝트를 Start하고 open해보자.

open을 하면 아래와 같은 내용이 나오는데

우리는 여기서

이 내용만을 보면 된다.

여기서 우리의 name과 url을 확인할 수 있다.

name = neo4j
url = bolt://localhost:7687

비밀번호는 위에서 수정했거나 원래의 비밀번호를 기억하고 있으면 된다.

이제 python으로 연결을 진행해보자.


# pip3 install neo4j-driver
# python3 example.py

from neo4j import GraphDatabase, basic_auth

driver = GraphDatabase.driver(
  "bolt://localhost:7687",
  auth=basic_auth("neo4j", "비밀번호"))

cypher_query = '''
MATCH (n)
RETURN COUNT(n) AS count
LIMIT $limit
'''

with driver.session(database="neo4j") as session:
  results = session.read_transaction(
    lambda tx: tx.run(cypher_query,
                      limit=10).data())
  for record in results:
    print(record['count'])

driver.close()

이제 위 코드를 활용해 서버와 연결을 진행하고 연결 되었는지 print문의 노드의 수가 count된 것을 확인하면 된다.

python 코드에서 나온 결과가 정확한지 확인하기 위해

neo4j 데스크탑에서 open으로 열어 놓은 창에 똑같은 Cypher를 넣어 결과를 비교하면 된다.

MATCH (n)
RETURN COUNT(n) AS count

이걸 그대로 넣어서 확인해 결과가 같으면 된다.

결과가 같은 것을 확인했고 그럼 로컬 neo4j 데스크탑과 연결을 완료한 것이다.

현재 로컬 neo4j에서 dbms를 시작한 것이기에 당연히 접속은 로컬 컴퓨터에서만 가능하다.

나처럼 다른 서버에서 접속하려고 하는 바보 같은 행동은 하지 말자... ㅠㅠ

그럼 이제

다음 단계로 넘어가보자.


먼저 우리는 다음을 알아야 한다.

from langchain.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI

바로 위 langchain이 어떻게 작동되어 답변을 출력해주는 것인지에 대해서이다.

GrapeRAG는 다음과 같은 순서로 진행된다.

  1. 연결된 GrapeDB의 모든 노드, 관계를 String 형태로 가져옴.
  2. String을 기반으로 LLM이 사용자 질문을 Cypher 쿼리문으로 변경.
  3. 작성된 쿼리문을 통해 GrapeDB에서 결과를 가져옴.
  4. GrapeDB에서 가져온 내용과 사용자의 질문을 토대로 LLM이 답변을 진행

위와 같은 순서로 답변이 나오게 되는 것이다.

이때 Langchain에서는 사용자의 질문으로 생성된 쿼리문이 GrapeDB에서 어떠한 결과를 가져오지 못한 채 빈 리스트로 존재하면 마지막 LLM에 제공되는 내용이 없어 질문에 답변이 나오지 않게 된다.

이런 과정을 보면 우리가 알고 있는 RAG와 거의 동일하다.

하지만 다른 점이 있다면 다음과 같다.

  • RAG는 사용자의 질문을 임베딩 모델을 통해 벡터화하고 이를 토대로 벡터 DB에서 유사한 문서를 가져와 LLM에게 질문과 함께 참고할 수 있는 문서를 제공하는 것

  • GrapeRAG는 복잡한 관계와 구조를 효율적으로 표현하고 관리할 수 있는 Grape DB의 특성을 활용해 사용자의 질문을 LLM으로 복잡한 Cypher 쿼리문으로 바꾸고 Grape DB에서 쿼리한 내용을 가져와 이를 사용자의 질문과 함께 LLM에게 제공하는 것

위와 같은 이유로 GrapeRAG는 일반 RAG와 방법은 거의 유사하지만 복잡한 관계와 구조를 효율적으로 표현할 수 있는 Grape DB의 특성에 따라 더 복잡하고 자세한 질문에 대해 정확한 답변을 내릴 수 있는 것이다.

그럼 계속해서 코드를 작성해보자.

import os
os.environ['OPENAI_API_KEY'] = "GPT-API"

from langchain.chains import GraphCypherQAChain
from langchain_community.graphs import Neo4jGraph
from langchain_openai import ChatOpenAI

# Neo4j 연결 정보
url = 'bolt://localhost:7687'
username = 'neo4j'
password = 'PASSWORD'

# GraphCypherQAChain 설정
graph = Neo4jGraph(url=url, username=username, password=password)  # URL과 인증 정보를 사용하여 Neo4jGraph 생성

#정확한 답변을 위해 temperature = 0
chain = GraphCypherQAChain.from_llm(
    ChatOpenAI(temperature=0), 
    graph=graph, 
    verbose=True,
    allow_dangerous_requests=True 
)

위와 같이 사전에 준비한 GPT API와 Neo4j 연결 정보를 입력해주면 완성된다.

langchain에서 이미 모든 것이 준비되어 있기에 어렵지 않게 작성이 가능하다.

이제 위와 같이 질문하고자 하는 내용을 입력하면

Generated Cypher:
MATCH (d:Drug)-[:MANUFACTURED_IN]->(:Country {name: "대만"})
RETURN d;

위와 같이 만들어진 Cypher 쿼리문과 그 아래 사용자의 질문과 함께 LLM에게 전달된 context를 확인할 수 있다.

답변은 위와 같이 나온 것을 확인할 수 있다.

이 뿐만 아니라 갯수, 공통점과 같은 질문에도 정확히 답변하는 것을 확인할 수 있다.

profile
전공: 소프트웨어, 관심 분야: LLM, NLP, 지식 그래프

0개의 댓글