HyperAI초신경
Back to Headlines

지식 그래프를 활용한 LLM 쿼리 기술 소개

16일 전

지식 그래프를 활용한 검색 시스템 개선 방법 지식 그래프(Knowledge Graph)는 정보를 구조화하여 개념, 엔티티, 그리고 이들의 관계를 인간의 이해 방식에 가깝게 연결하는 방식으로 정의할 수 있다. 이는 다양한 출처에서 데이터를 수집하고 통합하여 기계가 정보를 효과적으로 추론, 유추, 그리고 검색할 수 있도록 돕는다. 이전 글에서 지식 그래프가 검색 기능을 강화하는 데 어떻게 사용될 수 있는지를 논하며, GraphRAG라는 용어를 소개했다. 이는 대화형 검색 애플리케이션에서 LLMs(Large Language Models)의 성능을 향상시키기 위한 전략들로 구성된다. 일반적인 벡터 유사도 검색보다는 그래프 기반의 지식 표현을 통해 LLMs에 더 나은 정보를 제공하는 것이 핵심이다. 벡터 유사도 검색의 한계와 그래프 기반 접근의 장점 일반적인 RAG(Retrieval Augmented Generation) 접근법은 벡터 유사도 검색을 활용한다. 벡터 데이터베이스에서 사용자의 입력과 유사한 정보 조각들을 검색하여, 이를 LLM에게 제공해 관련된 응답을 생성하도록 한다. 그러나 이러한 접근법은 문서 내에서 명시적으로 언급된 내용에만 의존하는 단점을 가지고 있다. 이로 인해 문서 간의 크로스-리퍼런스나 암시적, 문맥적 참조를 처리하지 못하며, LLM이 문서 간의 관계성을 이해하는 데 제약을 받는다. 그래프 기반 접근법은 이러한 문제를 해결한다. 각 문서에서 개념을 추출하여 저장하면서, 정보 조각들 사이의 관계를 추적함으로써 LLM이 문서 간의 관계성을 이해할 수 있도록 한다. 특히 조직이나 기업 내에서 문서들이 서로 크로스-리퍼런스를 가지고 암시적으로 언급되는 경우, 그래프 구조는 가장 적합한 방식이다. 기술 스택 구성 이 프로젝트는 오픈 소스 도구와 무료 계층 액세스를 중점으로 하여, 클라우드 인프라스트럭처나 OpenAI의 API 키 비용 없이도 시작할 수 있도록 설계되었다. 하지만 실제 배포를 고려한 모듈화와 확장성이 중요한 점도 고려되었다. Neo4j - 그래프 데이터베이스 + 벡터 저장소 Neo4j는 지식 그래프 레이어를 구동하며, 벡터 임베딩을 저장하여 의미론적 검색을 수행한다. Cypher 쿼리 언어를 통해 Neo4j 데이터베이스와 상호작용한다. LangChain - LLM 워크플로의 에이전트 프레임워크 LLM들이 벡터 인덱스, 지식 그래프의 엔티티, 그리고 사용자 입력과 상호작용하는 방식을 조정한다. LLMs + 임베딩 LLM과 임베딩은 로컬 환경에서 Ollama를 통해 또는 선택한 온라인 엔드포인트에서 호출할 수 있다. 현재 Groq의 무료 계층 API를 사용하여 실험 중이며, Gemma2-9b-it와 다양한 버전의 Llama를 활용하고 있다. Streamlit - 상호작용 및 데모용 프론트엔드 UI Streamlit은 Python 라이브러리로, HTML이나 CSS를 작성하지 않고도 최소한의 프론트엔드 레이어를 빠르게 구축할 수 있다. 데모 앱에는 사용자와의 상호작용을 위한 UI가 포함되어 있다. Docker - 로컬 개발 및 배포를 위한 컨테이너화 Docker는 애플리케이션과 모든 종속성들을 패키징하여 어떤 시스템에서도 일관성 있게 실행되도록 하는 도구이다. Dockerfile와 docker-compose를 통해 Neo4j, Ollama, 그리고 앱 자체가 격리된, 재현 가능한 컨테이너에서 실행되도록 설정되었다. 문서에서 지식 그래프로 변환 과정 파일 로드 파일을 머신 친화적인 형식으로 로드한다. Ingestor 클래스는 파일의 MIME 타입을 추론하고, 해당 파일의 내용을 적절한 로더를 사용하여 읽는다. 텍스트 정리 및 분할 문서의 내용을 정리하고 텍스트 조각으로 분할한다. 도메인과 문서 형식에 따라 사용자 정의된 정리 및 분할 함수를 작성할 수 있다. 개념 그래프 추출 각 조각에서 그래프 형태의 개념을 추출한다. LangChain의 with_structured_output 메서드를 사용하여 LLM이 구조화되고 검증된 응답을 반환하도록 한다. 조각 임베딩 각 조각의 텍스트를 벡터 표현으로 변환한다. 선택한 임베딩 모델을 사용하여 ChunkEmbedder 클래스를 통해 수행된다. 임베딩 조각 그래프 저장 Neo4j 인스턴스에 문서와 조각들을 업로드한다. 문서 노드, 조각 노드, 그리고 이들의 관계를 저장하며, 조각 노드의 임베딩을 속성으로 저장한다. 그래프 기반 RAG 접근법 강화된 RAG 일반적인 RAG 프로세스를 수행할 수 있지만, 그래프에서 유사한 임베딩을 검색한 후 근접한 조각들을 추가하여 맥락을 풍부하게 할 수 있다. 예를 들어, 유사한 조각이 2번 문서의 2번 조각을 가리키면, 그 주변의 조각들을 검색하여 더욱 세부적이고 문맥화된 답변을 제공할 수 있다. 커뮤니티 리포트 문서 간의 관계성을 고려한 고수준 요약을 제공한다. 임베딩을 사용하여 커뮤니티를 감지한 후, LLM을 통해 커뮤니티 리포트를 생성하고, 이 리포트를 그래프에 저장한다. 사용자가 특정 문서뿐만 아니라 여러 문서에서 정보를 얻을 때 유용하다. Cypher 쿼리 사용자의 질문에 따라 그래프를 순회하는 Cypher 쿼리를 생성하여, 노드, 엔티티, 그리고 관계를 검사한다. Neo4j의 그래프 쿼리 언어인 Cypher를 사용하여 LLM에 쿼리를 생성하도록 지시한다. 커뮤니티 서브그래프 커뮤니티 리포트와 Cypher 쿼리 접근법을 결합한 방식이다. 커뮤니티 서브그래프를 추출하고, 이를 LLM에 제공하여 더 복잡한 질문에 대응할 수 있다. 현재 이 방법은 진행 중이며, 결과가 일관되지 않은 경우가 많다. Cypher + RAG 강화된 RAG 접근법과 Cypher 쿼리 접근법을 결합한 방식이다. 유사한 임베딩 조각과 Cypher 쿼리의 중간 단계를 모두 활용하여 완전하고 일관된 답변을 생성한다. 쿼리 생성 부분에서 문제가 발생할 경우, 강화된 RAG 접근법을 활용하여 안정적인 답변을 제공한다. 결론 이 글에서는 지식 그래프를 구축하고 LLM을 활용하여 이를 쿼리하는 완전한 프로세스를 살펴보았다. 문서 수집부터 로컬 환경에서 데모 앱을 실행하고, 그래프를 쿼리하는 방법까지 모든 단계를 다루었다. 지식 그래프는 다양한 질문 유형에 대한 답변을 강화하는 데 큰 역할을 한다. 실제 애플리케이션을 구축할 때는 정확성, 비용, 속도, 그리고 확장성을 고려하여 적합한 전략을 선택해야 한다. 현재로서는 여러 가지 가능성이 열려 있으며, 앞으로 더 많은 연구와 실험이 필요하다. GitHub 저장소에서 자세한 코드 예제와 설명을 확인할 수 있으며, 이 프로젝트에 대한 의견과 기여를 환영한다. 이글을 읽어주셔서 감사합니다! 참고 자료 [1] 이 글에서 사용한 데이터는 유럽 위원회의 공보 자료에서 제공된다: https://ec.europa.eu/commission/presscorner/home/en. 공보 자료는 Creative Commons Attribution 4.0 International (CC BY 4.0) 라이선스 하에 제공된다.

Related Links