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