728x90
반응형

이전 게시물(GraphRAG Python 패키지를 사용하는 GraphRAG 애플리케이션에 대한 하이브리드 검색 및 GraphRAG Python 패키지를 사용하여 그래프 순회를 통해 하이브리드 검색 향상)에서는 Neo4j를 사용해서 GenAI 모델의 성능을 향상시키기 위한 다양한 검색 전략을 살펴봤어요. 검색자가 Vector Embedding이나 전체 텍스트 임베딩을 사용하여 가장 관련성이 높은 데이터 항목을 식별하는 벡터 및 하이브리드 검색 방법을 사용하는 방법도 알아봤고요. 이러한 접근 방식은 효과적인 것으로 입증되었지만, 복잡한 설정과 기본 시스템에 대한 깊은 이해가 필요한 경우가 많았죠.

오늘은 이 프로세스를 단순화하는 고급 검색기인 Text2CypherRetriever를 소개하게 되어 기뻐요! Natural Language를 활용하여 정확한 Cypher 쿼리를 생성함으로써 Neo4j를 여러분의 시스템에 통합할 수 있는 보다 직관적이고 접근 가능한 방법을 제공하거든요. Retrieval-Augmented Generation(RAG) 응용 프로그램에요.

이전에는 개발자가 효과적인 데이터 검색을 위해 임베딩 인덱스를 생성하고 특정 모델을 사용하는 복잡성을 탐색해야 했어요. Text2CypherRetriever는 LLM(Large Language Model)을 사용하여 사용자 입력을 Cypher 쿼리로 직접 변환함으로써 이를 개선해요. 이 접근 방식을 사용하면 복잡한 설정이 필요 없기 때문에 더 다양한 개발자가 데이터 검색을 더 간단하고 더 쉽게 이용할 수 있죠. 숙련된 Neo4j 사용자이든 이제 막 시작했든 Text2CypherRetriever는 개발 프로세스를 크게 간소화할 수 있을 거예요.

Text2Cypher란 무엇일까요?

Text2Cypher는 Natural Language를 Cypher 쿼리로 변환하는 방법이에요. Text2CypherRetriever는 먼저 LLM에 사용자의 질문을 기반으로 Cypher 쿼리를 생성하도록 요청해서 이 방법을 사용하죠. 생성된 쿼리는 Neo4j 데이터베이스에 대해 실행되어 필요한 정보를 가져와요. 결과 레코드는 LLM이 사용자 쿼리에 대한 최종 답변을 구성할 수 있도록 컨텍스트에 추가되고요. 이 접근 방식을 사용하면 데이터베이스와의 보다 직관적인 상호 작용이 가능하므로 LLM이 쿼리 생성 및 답변 공식을 처리하는 동안 사용자는 Natural Language로 쿼리를 입력할 수 있어요.

저희 내부 연구에 따르면 Text2Cypher를 검색 방법으로 사용하는 것이 다양한 질문 변형에 대해 상대적으로 가장 일관된 접근 방식이며 다양한 복잡성 수준에 대한 다른 전략보다 더 나은 성능을 발휘하는 것으로 나타났어요.

설정

이전 게시물과 마찬가지로 영화 추천 Knowledge Graph를 시뮬레이션하는 사전 구성된 Neo4j 데모 데이터베이스에 연결하는 것부터 시작해볼까요? 다음에서 액세스하세요. 사용자 이름과 비밀번호로 "recommendations"를 사용하면 돼요. 이 설정은 Vector Embedding 데이터가 이미 사용할 준비가 된 Neo4j 데이터베이스의 일부인 현실적인 시나리오를 제공하죠.

Python 환경에서 다음 다른 패키지와 함께 neo4j-graphrag 패키지를 설치하세요.

pip install neo4j-graphrag neo4j openai

계속해서 Neo4j Python 드라이버를 사용하여 Neo4j 데이터베이스에 대한 연결을 설정해볼게요.

from neo4j import GraphDatabase

# Demo database credentials
URI = "neo4j+s://demo.neo4jlabs.com"
AUTH = ("recommendations", "recommendations")

# Connect to Neo4j database
driver = GraphDatabase.driver(URI, auth=AUTH)

검색

from neo4j_graphrag.retrievers import Text2CypherRetriever
from neo4j_graphrag.llm import OpenAILLM

# Create LLM object
t2c_llm = OpenAILLM(model_name="gpt-3.5-turbo")

# (Optional) Specify your own Neo4j schema
neo4j_schema = """
  Node properties:
  Person {name: STRING, born: INTEGER}
  Movie {tagline: STRING, title: STRING, released: INTEGER}
  Relationship properties:
  ACTED_IN {roles: LIST}
  REVIEWED {summary: STRING, rating: INTEGER}
  The relationships:
  (:Person)-[:ACTED_IN]->(:Movie)
  (:Person)-[:DIRECTED]->(:Movie)
  (:Person)-[:PRODUCED]->(:Movie)
  (:Person)-[:WROTE]->(:Movie)
  (:Person)-[:FOLLOWS]->(:Person)
  (:Person)-[:REVIEWED]->(:Movie)
"""

# (Optional) Provide user input/query pairs for the LLM to use as examples
examples = [
  "USER INPUT: 'Which actors starred in the Matrix?' QUERY: MATCH (p:Person)-[:ACTED_IN]->(m:Movie) WHERE m.title = 'The Matrix' RETURN p.name"
]

# Initialize the retriever
retriever = Text2CypherRetriever(
  driver=driver,
  llm=t2c_llm,
  neo4j_schema=neo4j_schema,
  examples=examples,
)

Text2CypherRetriever를 사용하면 데이터베이스에서 정보를 검색하는 query를 쉽게 생성하고 실행할 수 있어요.

query_text = "Which movies did Hugo Weaving star in?"
print(retriever.search(query_text=query_text))

결과는 다음과 같아요.

items=[RetrieverResultItem(content="<Record m.title='Cloud Atlas'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='The Dressmaker'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='Babe'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='V for Vendetta'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='Matrix, The'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='Interview, The'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='Adventures of Priscilla, Queen of the Desert, The'>", metadata=None), 
       RetrieverResultItem(content="<Record m.title='Proof'>", metadata=None)] 
metadata={'cypher': "MATCH (p:Person {name: 'Hugo Weaving'})-[:ACTED_IN]->(m:Movie) RETURN m.title", '__retriever': 'Text2CypherRetriever'}

이제 이 검색기를 GraphRAG 파이프라인에 추가할 수 있겠죠?

from neo4j_graphrag.generation import GraphRAG

llm = OpenAILLM(model_name="gpt-4o", model_params={"temperature": 0})

# Initialize the RAG pipeline
rag = GraphRAG(retriever=retriever, llm=llm)

# Query the graph
query_text = "Which movies did Hugo Weaving star in?"
response = rag.search(query_text=query_text)
print(response.answer)

그러면 다음이 반환될 거예요.

Hugo Weaving starred in the following movies:
- The Dressmaker
- V for Vendetta
- The Matrix
- The Adventures of Priscilla, Queen of the Desert
- Proof

기존의 벡터 검색 방법과 비교했을 때, Text2CypherRetriever는 다음과 같은 몇 가지 장점을 제공해요.

  • : 사용자가 직접 Cypher query를 작성하거나 복잡한 embedding 설정 및 벡터 index를 생성할 필요가 없어요.
  • : 자연어 입력을 직접 처리하죠.
  • : 모든 기술 수준의 개발자가 Cypher에 대한 깊은 이해 없이도 쉽게 데이터를 검색할 수 있어요.

LLM이 비결정적이라는 점을 고려하면, LLM에서 생성된 query가 문법적으로 정확하거나 올바른 결과를 반환한다고 보장할 수는 없다는 점에 유의해야 해요. 실행할 수 없는 경우에는 Text2CypherRetrievalError가 발생할 거예요.

요약

Text2CypherRetrieverNeo4jGenAI와 통합하기 위한 중요한 진전이라고 할 수 있어요. Natural Language Processing을 사용해서 Cypher query를 생성함으로써 검색 프로세스를 단순화해서 개발자들이 더 쉽게 사용할 수 있게 되었죠. 이 도구는 벡터 embedding을 관리하지 않고 정확한 상황별 정보가 필요할 때 특히 유용해요.


  • Natural Language Processing
  • Retrieval Augmented
  • Retrieval-Augmented Generation
  • Text2Cypher

에이치시스템즈LogTree는 Neo4j 기반 GraphRAG 플랫폼으로, 데이터를 자동으로 지식그래프화하고 자연어 질의로 즉시 답을 제공합니다.

👉 에이치시스템즈 홈페이지

728x90
반응형

+ Recent posts