이 튜토리얼에서는 MongoDB Atlas와 LangChain을 사용해 GraphRAG를 구현하는 방법에 대해 다룹니다. GraphRAG는 데이터를 벡터 임베딩이 아닌 지식 그래프로 구조화하는 기존 RAG의 대안적 접근 방식입니다. 이 접근 방식을 LLM과 결합하면 관계 인식 검색과 멀티홉 추론이 가능합니다.
이 튜토리얼의 실행 가능한 버전을 Python 노트북으로 작업하세요.
배경
GraphRAG는 데이터를 벡터 임베딩 대신 엔터티와 이들 간의 관계로 구성된 지식 그래프로 구조화하는 기존 RAG의 대안적 접근 방식입니다 벡터 기반 RAG는 쿼리와 의미적으로 유사한 문서를 찾는 반면, GraphRAG는 쿼리와 연결된 엔터티를 찾아 그래프의 관계를 탐색하여 관련 정보를 조회합니다.
이 접근 방식은 '회사 A와 회사 B의 관계는 무엇인가?' 또는 '사람 X의 관리자는 누구인가?'와 같은 관계 기반 질문에 답하는 데 특히 유용합니다.
MongoDBGraphStore
는 LangChain MongoDB 통합의 구성 요소로, 엔터티(노드)와 그 관계(엣지)를 MongoDB 컬렉션에 저장하여 GraphRAG를 구현할 수 있습니다. 이 구성 요소는 각 엔터티를 컬렉션 내 다른 문서를 참조하는 관계 필드가 포함된 문서로 저장합니다. $graphLookup
집계 단계를 사용하여 쿼리를 실행합니다.
전제 조건
이 튜토리얼을 완료하려면 다음 조건을 충족해야 합니다.
다음 중 하나입니다.
MongoDB 6.0.11 버전, 이상을 실행 Atlas cluster7.0.2. 사용자의 IP 주소 Atlas 프로젝트의 액세스 목록에 포함되어 있는지 확인하세요.
Atlas CLI 사용하여 생성된 로컬 Atlas 배포서버 입니다. 자세히 학습 로컬 Atlas 클러스터 배포를 참조하세요.
OpenAI API 키입니다. API 요청에 사용할 수 있는 크레딧이 있는 OpenAI 계정이 있어야 합니다. OpenAI 계정 등록에 대한 자세한 내용은 OpenAI API 웹사이트를 참조하세요.
환경 설정
이 튜토리얼의 환경을 설정합니다. 확장자가 .ipynb
인 파일 저장하여 대화형 Python 노트북을 만듭니다. 이 노트북을 사용하면 Python 코드 스니펫을 개별적으로 실행 수 있으며, 이 튜토리얼에서는 이를 사용하여 코드를 실행 .
노트북 환경을 설정하다 하려면 다음을 수행합니다.
환경 변수를 정의합니다.
다음 코드 예제를 복사한 후, 변수들을 본인의 값으로 바꿔서 코드를 실행하세요.
| 본인의 OpenAI API 키 |
| Atlas 클러스터의 SRV 연결 문자열 |
import os os.environ["OPENAI_API_KEY"] = "<api-key>" ATLAS_CONNECTION_STRING = "<connection-string>" ATLAS_DB_NAME = "langchain_db" # MongoDB database to store the knowledge graph ATLAS_COLLECTION = "wikipedia" # MongoDB collection to store the knowledge graph
참고
연결 문자열은 다음 형식을 사용해야 합니다.
mongodb+srv://<db_username>:<db_password>@<clusterName>.<hostname>.mongodb.net
Atlas를 지식 그래프로 사용하기
이 섹션에서는 GraphRAG의 지식 그래프로 Atlas를 사용하는 방법을 설명합니다. 다음 코드를 노트북에 붙여넣고 실행합니다.
샘플 데이터를 불러옵니다.
이 튜토리얼에서는 Wikipedia에서 공개적으로 액세스할 수 있는 데이터를 데이터 소스로 사용합니다 샘플 데이터를 불러오려면 아래 코드 스니펫을 실행하세요. 다음과 같은 단계가 수행됩니다.
Sherlock Holmes
쿼리로 필터링된 Wikipedia 페이지의 하위 집합을 조회합니다.텍스트 분할기를 사용하여 데이터를 더 작은 문서로 분할합니다.
각 문서의 문자 수와 연속된 두 문서 간에 겹쳐야 하는 문자 수를 결정하는 청크 매개변수를 지정합니다.
from langchain_community.document_loaders import WikipediaLoader from langchain.text_splitter import TokenTextSplitter wikipedia_pages = WikipediaLoader(query="Sherlock Holmes", load_max_docs=3).load() text_splitter = TokenTextSplitter(chunk_size=1024, chunk_overlap=0) wikipedia_docs = text_splitter.split_documents(wikipedia_pages)
그래프 저장소를 인스턴스화합니다.
MongoDBGraphStore
클래스를 사용하여 지식 그래프를 구성하고 Atlas 클러스터에 로드하세요.
from langchain_mongodb.graphrag.graph import MongoDBGraphStore graph_store = MongoDBGraphStore.from_connection_string( connection_string = ATLAS_CONNECTION_STRING, database_name = ATLAS_DB_NAME, collection_name = ATLAS_COLLECTION, entity_extraction_model = chat_model )
지식 그래프에 문서를 추가합니다.
add_documents
메서드를 사용하여 컬렉션에 문서를 추가합니다. 이 메서드는 새 문서를 추가할 때 기존 엔터티를 찾아 업데이트하거나, 존재하지 않는 경우 새로 생성합니다.
이 단계는 몇 분 정도 걸릴 수 있습니다. 출력에 표시되는 경고 메시지는 무시해도 됩니다.
graph_store.add_documents(wikipedia_docs)
샘플 코드를 실행한 후에는 Atlas UI에서 documents.wikipedia
컬렉션으로 이동하여 데이터가 어떻게 저장되었는지 확인할 수 있습니다.
(선택 사항) 지식 그래프를 시각화합니다.
networkx
및 pyvis
라이브러리를 사용하여 그래프 구조를 시각화할 수 있습니다. 예제는 노트북을 참조하세요.
데이터에 대한 질문에 답하기
지식 그래프를 호출하여 질문에 답변하세요. chat_response
메서드를 사용하여 지식 그래프를 호출합니다. 이 메서드는 Atlas에서 관련 문서를 조회한 다음, 지정한 채팅 모델을 사용하여 자연어로 답변을 생성합니다.
구체적으로, 채팅 모델은 쿼리에서 엔터티를 추출합니다. Atlas는 $graphLookup
단계를 사용하여 지식 그래프를 탐색해 연결된 엔터티를 찾고, 가장 가까운 엔터티와 그 관계 정보를 쿼리와 함께 채팅 모델로 전송해 응답을 생성합니다.
query = "Who inspired Sherlock Holmes?" answer = graph_store.chat_response(query) print(answer.content)
Sherlock Holmes was inspired by Dr. Joseph Bell, a physician known for his keen observation and deductive reasoning, as acknowledged by Sir Arthur Conan Doyle, Holmes' creator.
보면서 배우기
이 튜토리얼에 사용된 코드의 데모를 보려면 이 동영상을 시청하세요.
소요 시간: 2분