AWS 기술 블로그
Amazon Bedrock과 Amazon Neptune으로 지식 그래프를 활용한 GraphRAG 애플리케이션 구축하기
이 글은 AWS Database 블로그의 Using knowledge graphs to build GraphRAG applications with Amazon Bedrock and Amazon Neptune의 한국어 번역입니다.
검색 증강 생성(Retrieval Augmented Generation, RAG)은 대규모 언어 모델과 외부 지식 소스를 결합하는 혁신적인 접근 방식으로, 더 정확하고 정보가 풍부한 콘텐츠 생성을 가능하게 합니다. 이 기술은 언어 모델의 맥락 이해 및 일관된 응답 생성 능력과 다양한 데이터 소스에서 관련 정보를 보강하는 기능을 모두 활용합니다.
어떤 데이터 소스를 선택하는지에 따라 RAG 정확도를 결정하는데 핵심적인 역할을 합니다. 구조화된 데이터베이스와 비정형 말뭉치가 중요한 리소스로 활용될 수 있지만, 지식 그래프를 활용하는 것이 특히 더 유용한 것으로 나타납니다. 지식 그래프는 실세계 개체와 그들 간의 관계를 구조화된 방식으로 표현하여, 관련 정보의 효율적인 검색 및 통합을 지원합니다.
지식 그래프를 RAG의 데이터 소스로 활용하는 GraphRAG은 많은 이점을 제공합니다. 이러한 지식 베이스에는 체계적으로 정리된 방대한 정보가 담겨있어, 실제 데이터에 기반한 응답을 생성할 수 있습니다. 또한 지식 그래프의 구조화된 특성은 정확한 쿼리와 검색을 가능하게 하여, 가장 관련성 있는 정보가 생성 과정에 통합되도록 합니다. 언어 이해력과 RAG를 통한 사실 기반의 지식 결합은 풍부하고 일관된 출력을 생성할 수 있게 해주며, 질문 답변부터 콘텐츠 생성까지 다양한 애플리케이션에서 강력한 도구로 활용될 수 있습니다.
Amazon Bedrock은 AI21 Labs, Anthropic, Cohere, Meta, Stability AI, Amazon 등 선도적인 AI 기업들의 고성능 기반 모델(Foundation Model)을 단일 API로 제공하고, 생성 AI 애플리케이션 구축을 위한 다양한 기능을 갖춘 완전 관리형 서비스입니다.
이 게시글에서는 LlamaIndex 프레임워크와 함께 Amazon Bedrock과 Amazon Neptune 을 사용하여 GraphRAG 애플리케이션을 구축하는 방법을 안내합니다.
솔루션 개요
이 샘플 솔루션에서는 고객 컨텍스트를 제공하는 Customer 360 지식 그래프를 활용하여 GraphRAG을 구현합니다.
GraphRAG 애플리케이션은 LlamaIndex 프레임워크에 의해 관리되며, Amazon Bedrock과 Amazon Neptune Database와의 상호작용을 처리합니다. Amazon Bedrock은 대규모 언어 모델(LLM)과의 통신 인터페이스를 제공하고, Amazon Neptune Database는 GraphRAG에 사용되는 지식 그래프를 저장합니다.
이 솔루션에는 다음과 같은 단계가 포함됩니다:
- Amazon Neptune에 Customer 360 지식 그래프 설정
- LlamaIndex를 통한 Amazon Bedrock 구성
- LlamaIndex와 Amazon Neptune 통합
- Amazon Neptune용 검색도구 구성
- 지식 그래프와 상호 작용
LlamaIndex 설치 및 설정에 대한 자세한 내용은 LlamaIndex 설치 및 설정 페이지를 참조하시기 바랍니다.
이 솔루션은 Amazon Neptune 그래프 노트북에서 실행할 수 있습니다. 이 노트북은 데이터를 검색하기 위해 Amazon Neptune과 통합되고, 입력 프롬프트와 검색된 컨텍스트를 기반으로 출력을 생성하기 위해 Amazon Bedrock과 통합됩니다.
Amazon Neptune에 Customer 360 지식 그래프 설정
Amazon Neptune Database 설정 방법은 Amazon Neptune 설정 페이지를 참조하시기 바랍니다.
사전에 Amazon Neptune 샘플 ID 그래프 노트북을 따라 합성 데이터를 사용하여 Amazon Neptune에 Customer 360 지식 그래프를 설정했다고 가정합니다. 이 지식 그래프 구조는 Phone, Email, Address, Session 노드를 User 노드에 연결하고, City 노드를 Address 노드에 연결하며, Device, IP, Page 노드를 Session 노드에 연결합니다.
LlamaIndex와 Amazon Bedrock 구성
LlamaIndex 구성 요소와 Amazon Bedrock을 통합하여 GraphRAG 워크플로의 검색 및 추론 단계에서 LLM을 구현할 수 있습니다.
이 경우 Anthropic Claude 3 Sonnet LLM을 Amazon Bedrock을 통해 사용합니다.
from llama_index.llms.bedrock import Bedrock
from llama_index.core import Settings
llm = Bedrock(model="anthropic.claude-3-sonnet-20240229-v1:0")
Settings.llm = llm
Bedrock
클래스의 model
매개변수 값을 변경하여 다른 LLM을 정의할 수 있습니다. 예를 들어 Anthropic Claude 3 Haiku를 사용하려면 model
매개변수 값은 anthropic.claude-3-haiku-{model_version}
이 됩니다.
Amazon Bedrock 페이지에서 사용 가능한 모델에 대한 자세한 정보를 확인할 수 있습니다.
Amazon Neptune과 LlamaIndex 통합
이 섹션에서는 Amazon Neptune 데이터베이스를 LlamaIndex와 통합합니다. 이를 통해 LlamaIndex가 Amazon Neptune 데이터베이스 인스턴스에 연결하여 정보를 검색할 수 있습니다.
NeptuneDatabaseGraphStore
클래스의 인스턴스를 생성하여 Amazon Neptune 데이터베이스에 연결해야 합니다. host 매개변수에는 Amazon Neptune 데이터베이스 엔드포인트를 제공해야 하며, GraphRAG 목적상 읽기 전용 엔드포인트를 사용해야 합니다. port
매개변수는 데이터베이스 엔드포인트에서 추출할 수 있습니다. node_label
매개변수는 Amazon Neptune에 저장된 지식 그래프의 엔터티 노드와 연결된 레이블을 나타냅니다.
이 경우 Amazon Neptune 지식 그래프의 User
노드 레이블을 정보 검색을 위한 쿼리 엔터티 노드로 설정했습니다.
from llama_index.core import StorageContext
from llama_index.graph_stores.neptune import NeptuneDatabaseGraphStore
graph_store = NeptuneDatabaseGraphStore(
host="<NEPTUNE_DB>.<AWS_REGION>.neptune.amazonaws.com",
port=8182,
node_label="User"
)
storage_context = StorageContext.from_defaults(graph_store=graph_store)
Amazon Neptune용 검색도구 구성
이제 LLM과 Amazon Neptune 데이터베이스 간 통합을 설정하여 데이터베이스에 저장된 지식 그래프 상에서 관련 하위 그래프 검색을 수행합니다.
먼저 KnowledgeGraphRAGRetriever
클래스의 인스턴스를 생성해야 합니다. 이 클래스는 주어진 입력 프롬프트를 Amazon Neptune 데이터베이스(storage_context
매개변수)에 대한 검색 지침으로 변환하는 역할을 합니다.
KnowledgeGraphRAGRetriever
는 with_nl2graphquery
매개변수를 True
로 설정하여 자연어 입력 프롬프트를 openCypher 쿼리 형식으로 변환함으로써 검색 내용을 강화할 수 있는 옵션을 제공합니다. 이 변환은 이전에 구성된 LLM에 의해 수행됩니다. graph_traversal_depth
매개변수는 검색된 하위 그래프 정보의 깊이를 나타냅니다. 값이 높을수록 더 깊은 지식 그래프 정보가 반환됩니다.
또한 RetrieverQueryEngine
클래스의 인스턴스를 만들어 KnowledgeGraphRAGRetriever
인스턴스(retriever
매개변수)에 대한 자연어 프롬프팅을 수행해야 합니다.
GraphRAG의 정확성을 높이기 위해 입력 프롬프트에 대한 프롬프트 엔지니어링을 구현하여 지식 그래프의 구성된 검색 노드(이 경우 User
노드)와 관련된 정보를 추출합니다. ENTITY_EXTRACT_PROMPT가
KnowledgeGraphRAGRetriever
클래스의 매개변수로 전달됩니다.
이 경우 openCypher 쿼리 형식으로의 자연어 변환(NL2GraphQuery)을 사용하여 검색된 정보의 다양성을 높였습니다. NL2GraphQuery는 사용자의 자연어 질문을 그래프 데이터베이스의 쿼리로 자동으로 변환해주는 기능입니다. 이를 통해 사용자는 복잡한 쿼리 구문을 직접 작성하지 않고도 그래프 데이터베이스에서 원하는 정보를 찾을 수 있습니다. 입력 프롬프트에 대한 프롬프트 엔지니어링을 구현하여 LLM에게 openCypher 쿼리 언어의 모범 사례를 지시했습니다. NL2CYPHER_PROMPT
가 KnowledgeGraphRAGRetriever
클래스의 매개변수로 전달됩니다. NL2GraphQuery를 사용할 때 LLM이 생성한 쿼리에 구문 또는 의미적 오류가 있을 수 있다고 가정하였습니다. 응답의 정확도를 높이기 위해 RetrieverQueryEngine
클래스의 response_mode
매개변수를 refine
으로 설정했습니다. 이는 LLM이 NL2GraphQuery와 지식 그래프 검색 결과 모두에 대해 독립적으로 추론을 수행하고 단일 추론을 생성하도록 합니다. 이를 통해 NL2GraphQuery의 빈 결과나 불완전한 결과가 미치는 영향을 최소화 합니다.
이 샘플에서 사용된 지식 그래프의 최대 홉 수는 3이므로 검색된 하위 그래프 깊이를 3으로 설정했습니다.
from llama_index.core.prompts.base import (
PromptTemplate,
PromptType,
)
from llama_index.core.query_engine import RetrieverQueryEngine
from llama_index.core.retrievers import KnowledgeGraphRAGRetriever
ENTITY_EXTRACT_TMPL_STR = """
A question is provided below.
Given the question, extract up to {max_keywords} information that identify a given user in the question. Avoid stopwords.
Focus on extracting complete information from question, it can be more than one single word.
---------------------
{question}
---------------------
Provide information in the following comma-separated format: 'KEYWORDS: <information>'
"""
ENTITY_EXTRACT_PROMPT = PromptTemplate(
ENTITY_EXTRACT_TMPL_STR,
prompt_type=PromptType.QUERY_KEYWORD_EXTRACT,
)
AMAZON_NEPTUNE_NL2CYPHER_PROMPT_TMPL_STR = """
Create a **Amazon Neptune flavor Cypher query** based on provided relationship paths and a question.
The query should be able to try best answer the question with the given graph schema.
The query should follow the following guidance:
- Fully qualify property references with the node's label.
```
// Incorrect
MATCH (p:person)-[:follow]->(:person) RETURN p.name
// Correct
MATCH (p:person)-[:follow]->(i:person) RETURN i.name
```
- Strictly follow the relationship on schema:
Given the relationship ['(:`Art`)-[:`BY_ARTIST`]->(:`Artist`)']:
```
// Incorrect
MATCH (a:Artist)-[:BY_ARTIST]->(t:Art)
RETURN DISTINCT t
// Correct
MATCH (a:Art)-[:BY_ARTIST]->(t:Artist)
RETURN DISTINCT t
```
- Follow single direction (from left to right) query model:
```
// Incorrect
MATCH (a:Artist)<-[:BY_ARTIST]-(t:Art)
RETURN DISTINCT t
// Correct
MATCH (a:Art)-[:BY_ARTIST]->(t:Artist)
RETURN DISTINCT t
```
Given any relationship property, you should just use them following the relationship paths provided, respecting the direction of the relationship path.
With these information, construct a Amazon Neptune Cypher query to provide the necessary information for answering the question, only return the plain text query, no explanation, apologies, or other text.
NOTE:
0. Try to get as much graph data as possible to answer the question
1. Put a limit of 30 results in the query.
---
Question: {query_str}
---
Schema: {schema}
---
Amazon Neptune flavor Query:
"""
NL2CYPHER_PROMPT = PromptTemplate(
AMAZON_NEPTUNE_NL2CYPHER_PROMPT_TMPL_STR,
prompt_type=PromptType.TEXT_TO_GRAPH_QUERY,
)
graph_rag_retriever = KnowledgeGraphRAGRetriever(
storage_context=storage_context,
entity_extract_template=ENTITY_EXTRACT_PROMPT,
with_nl2graphquery=True,
graph_query_synthesis_prompt=NL2CYPHER_PROMPT,
graph_traversal_depth=3
)
query_engine = RetrieverQueryEngine.from_args(
graph_rag_retriever,
response_mode="refine"
)
지식 그래프와 상호 작용
모든 것이 설정되면 이제 Amazon Bedrock LLM과 상호 작용할 수 있으며, LLM은 검색된 지식 그래프 정보를 사용합니다.
애플리케이션을 테스트하기 위해 지식 그래프에서 검색된 사용자 정보를 기반으로 특정 사용자에게 제품 추천을 수행하는 프롬프트를 정의했습니다. 이는 사용자 식별을 변경하면 LLM의 결과가 달라지고 개인화된 추천이 가능함을 의미합니다.
from IPython.display import display, Markdown
response = query_engine.query(
"""
You are a marketing analyst in a Technology retail company, mainly focused on selling notebooks, smartphones and tablets from popular brands.
You need to create hyper-personalized product recommendation for this customer.
Instructions for using the provided information about customer:
1. You should recommend products similar to device models used by customer
```
// Example
Given the device: Mozilla/5.0 (x11; Linux Amd64) Apple Web Kit/534.36 (khtml, Like Gecko) Chrome/13.0.766.0 Safari/534.36
The device model is: x11; Linux Amd64
```
2. Web browser information is irrelevant
3. Geographic information should be used to personalize your recommendation
4. Ask for confirmation about contact information
Notes:
- Keep communication friendly and focused on recommending products models
- Include technical details about recommended products models
- Avoid mentioning your role
- Avoid mentioning you are performing a personalized recommendation
- Conclude by putting yourself available to support customer and answer questions
Customer: <id>USER_ID</id>
""",
)
display(Markdown(f"<b>{response}</b>"))
첫 번째 테스트에서는 다음과 같은 하위 그래프 정보를 가진 “Wallis Lamba” 사용자에 대한 추천을 요청했습니다:
Edge Type | Content |
By Device | Mozilla/5.0 (windows Nt 6.0) Apple Web Kit/534.24 (khtml, Like Gecko) Chrome/11.0.696.3 Safari/534.24 |
By Device | Mozilla/5.0 (x11; Net Bsd) Apple Web Kit/537.36 (khtml, Like Gecko) Chrome/27.0.1453.116 Safari/537.36 |
Linked To | B6def854 F605 4986 A364 Bd29cb5cc8be |
Linked To | 6a62012a 34a7 4b87 Bbe0 3a7919666fe1 |
Has Phone | 305 355 XXX |
Joined In | 3/18/2021 |
Has Email | Wlambaip@neptunedemos.com |
In City | Miami |
Has Address | 82 Westridge Park |
“안녕하세요 Wallis님,
고려해 볼 만한 제품으로 Intel Core i7 프로세서가 탑재된 Microsoft Surface Pro 8을 추천드립니다. 이 태블릿은 Windows 11을 실행하며 휴대성이 뛰어나, 마이애미의 따뜻한 기후에 잘 어울릴 것입니다. 최대 16시간의 배터리 수명과 선명한 13인치 PixelSense 터치스크린 디스플레이를 갖추고 있어 업무와 엔터테인먼트에 모두 적합합니다.
또 다른 좋은 옵션은 Dell XPS 13 노트북입니다. 이 슬림하고 가벼운 노트북은 Windows 10 또는 Ubuntu Linux를 지원하며 아름다운 4K InfinityEdge 디스플레이를 제공합니다. XPS 13은 11세대 Intel Core 프로세서로 구동되어 컴팩트한 폼팩터에서도 탁월한 성능을 발휘합니다.
wlambai@neptunedemos.com과 305-355-XXXX가 고객님의 연락처 정보가 맞습니까? 이 추천 모델에 대한 더 자세한 정보를 드리거나 고객님의 선호도에 따른 다른 옵션을 탐색하는 것을 도와드릴 수 있습니다. 추가 문의사항이 있다면 알려주시기 바랍니다.“
두 번째 테스트에서는 다음과 같은 하위 그래프 정보를 가진 “Armand Aglione” 사용자에 대한 추천을 요청했습니다.
Edge Type | Content |
By Device | Mozilla/5.0 (x11; Open Bsd 1386) Apple Web Kit/537.36 (khtml, Like Gecko) Chrome/36.0.1985.125 Safari/537.36 |
By Device | Mozilla/5.0 (macintosh; Intel Mac Os X 10 6 8) Apple Web Kit/535.1 (khtml, Like Gecko) Chrome/13.0.782.24 Safari/535.1 |
Linked To | 47b43c86 De5d 4494 9ca8 428cbeb7d25e |
Linked To | E4098368 0c45 4672 8d10 4ee34b3a5740 |
Has Phone | 903 694 XXX |
Joined In | 2/15/2021 |
Has Email | Aaglione4u@neptunedemos.com |
In City | Tyler |
Has Address | 59919 Crest Line Center |
“안녕하세요 Armand님,
Intel 프로세서가 탑재된 Macintosh 기기를 사용하고 계신 것 같아 Apple의 최신 MacBook 모델을 고려해보는 것이 좋겠습니다. M1 및 M2 칩 MacBook은 우수한 성능과 배터리 수명을 제공합니다. 예를 들어 MacBook Air M2는 8코어 CPU, 8GB 통합 메모리, 최대 18시간의 배터리 수명을 갖추고 있습니다.
Tyler 지역에 계셔서 iPad 라인업이 포터블 옵션으로 잘 어울릴 것 같습니다. iPad Air 또는 iPad Pro 모델이 고객님의 MacBook과 잘 어우러질 것입니다.
aaglione4u@neptunedemos.com 이메일과 903-694-XXXX 전화번호가 고객님께 가장 좋은 연락처인지 확인해주시기 바랍니다. 고객님의 요구사항에 맞춰 더 자세한 정보나 추천을 제공해 드릴 수 있습니다. 궁금한 점이 있다면 언제든 물어보세요!“
정리
이 과정을 따라가면서 더 이상 필요하지 않은 리소스가 있다면 추가 요금이 발생하지 않도록 삭제하는 것이 좋습니다.
결론
GraphRAG 구현은 언어 모델과 구조화된 지식 베이스의 강점을 활용하는 강력한 접근 방식을 제공합니다. 언어 모델의 자연어 이해 기능과 지식 그래프에 포함된 사실적이고 상황적인 정보를 결합하여 GraphRAG은 매우 정확하고 정보가 풍부한 응답을 생성할 수 있습니다. Amazon Bedrock과 Amazon Neptune을 사용하여 GraphRAG을 구현하고 생성 AI 애플리케이션의 기능을 향상시킬 수 있습니다.