간단하고 해킹하기 쉬운 GraphRAG 구현
? GraphRAG는 훌륭하고 강력하지만 공식 구현은 읽거나 해킹 하기 어렵거나 고통스럽습니다.
? 이 프로젝트는 핵심 기능을 유지하면서 더 작고 빠르며 깔끔한 GraphRAG를 제공합니다(벤치마크 및 문제 참조).
? tests
와 프롬프트를 제외하면 nano-graphrag
는 약 1100줄의 코드 입니다.
? 작지만 이식 가능하며 (faiss, neo4j, ollama...) 비동기식 이며 완전한 형식입니다.
소스에서 설치 (권장)
# clone this repo first
cd nano-graphrag
pip install -e .
PyPi에서 설치
pip install nano-graphrag
팁
환경( export OPENAI_API_KEY="sk-..."
에서 OpenAI API 키를 설정하세요.
팁
Azure OpenAI API를 사용하는 경우 .env.example을 참조하여 azure openai를 설정하세요. 그런 다음 GraphRAG(...,using_azure_openai=True,...)
전달하여 활성화합니다.
팁
Amazon Bedrock API를 사용하는 경우 aws configure
와 같은 명령을 통해 자격 증명이 올바르게 설정되었는지 확인하십시오. 그런 다음 다음과 같이 구성하여 활성화합니다: GraphRAG(...,using_amazon_bedrock=True, best_model_id="us.anthropic.claude-3-sonnet-20240229-v1:0", cheap_model_id="us.anthropic.claude-3-haiku-20240307-v1:0",...)
. 예제 스크립트를 참조하세요.
팁
키가 없으면 transformers
및 ollama
사용하는 이 예제를 확인하세요. 다른 LLM 또는 임베딩 모델을 사용하려면 고급을 확인하세요.
Charles Dickens의 A Christmas Carol 사본을 다운로드하세요.
curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
아래 Python 스니펫을 사용하세요.
from nano_graphrag import GraphRAG , QueryParam
graph_func = GraphRAG ( working_dir = "./dickens" )
with open ( "./book.txt" ) as f :
graph_func . insert ( f . read ())
# Perform global graphrag search
print ( graph_func . query ( "What are the top themes in this story?" ))
# Perform local graphrag search (I think is better and more scalable one)
print ( graph_func . query ( "What are the top themes in this story?" , param = QueryParam ( mode = "local" )))
다음에 동일한 working_dir
에서 GraphRAG
초기화하면 모든 컨텍스트가 자동으로 다시 로드됩니다.
graph_func . insert ([ "TEXT1" , "TEXT2" ,...])
nano-graphrag
증분 삽입을 지원하며 중복된 계산이나 데이터가 추가되지 않습니다.
with open ( "./book.txt" ) as f :
book = f . read ()
half_len = len ( book ) // 2
graph_func . insert ( book [: half_len ])
graph_func . insert ( book [ half_len :])
nano-graphrag
콘텐츠의 md5-hash를 키로 사용하므로 중복된 청크가 없습니다.하지만 삽입할 때마다 그래프의 커뮤니티가 다시 계산되어 커뮤니티 보고서가 다시 생성됩니다.
nano-graphrag
단순한 RAG 삽입 및 쿼리도 지원합니다.
graph_func = GraphRAG ( working_dir = "./dickens" , enable_naive_rag = True )
...
# Query
print ( rag . query (
"What are the top themes in this story?" ,
param = QueryParam ( mode = "naive" )
)
각 메소드 NAME(...)
에 해당하는 비동기 메소드 aNAME(...)
이 있습니다.
await graph_func . ainsert (...)
await graph_func . aquery (...)
...
GraphRAG
와 QueryParam
Python의 dataclass
입니다. 사용 가능한 모든 매개변수를 보려면 help(GraphRAG)
및 help(QueryParam)
사용하십시오! 또는 몇 가지 옵션을 보려면 고급 섹션을 확인하세요.
사용할 수 있는 구성 요소는 다음과 같습니다.
유형 | 무엇 | 어디 |
---|---|---|
법학대학원 | 오픈AI | 내장 |
아마존 기반암 | 내장 | |
DeepSeek | 예 | |
ollama | 예 | |
임베딩 | 오픈AI | 내장 |
아마존 기반암 | 내장 | |
문장 변환기 | 예 | |
벡터 데이터베이스 | nano-vectordb | 내장 |
hnswlib | 내장, 예시 | |
milvus-lite | 예 | |
파이스 | 예 | |
그래프 저장 | networkx | 내장 |
neo4j | 내장(문서) | |
심상 | 그래프 | 예 |
청킹 | 토큰 크기별 | 내장 |
텍스트 분할기로 | 내장 |
Built-in
nano-graphrag
내부에 해당 구현이 있다는 것을 의미합니다. examples
예제 폴더 아래의 튜토리얼 내에 해당 구현이 있다는 것을 의미합니다.
구성 요소 간의 몇 가지 비교를 보려면 예제/벤치마크를 확인하세요.
더 많은 구성 요소를 제공하는 것을 언제나 환영합니다.
GraphRAG(...,always_create_working_dir=False,...)
디렉터리 생성 단계를 건너뜁니다. 모든 구성요소를 파일이 아닌 스토리지로 전환하는 경우 이를 사용하십시오. graph_func.query
스트리밍 없이 최종 답변을 반환합니다.
프로젝트에서 nano-graphrag
상호 작용하려면 param=QueryParam(..., only_need_context=True,...)
사용할 수 있습니다. 이는 다음과 같이 그래프에서 검색된 컨텍스트만 반환합니다.
# Local mode
-----Reports-----
```csv
id, content
0, # FOX News and Key Figures in Media and Politics...
1, ...
```
...
# Global mode
----Analyst 3----
Importance Score: 100
Donald J. Trump: Frequently discussed in relation to his political activities...
...
해당 컨텍스트를 사용자 정의된 프롬프트에 통합할 수 있습니다.
nano-graphrag
nano_graphrag.prompt.PROMPTS
dict 개체의 프롬프트를 사용합니다. 이를 가지고 놀면서 내부의 프롬프트를 바꿀 수 있습니다.
몇 가지 중요한 메시지:
PROMPTS["entity_extraction"]
텍스트 청크에서 엔터티와 관계를 추출하는 데 사용됩니다.PROMPTS["community_report"]
그래프 클러스터의 설명을 구성하고 요약하는 데 사용됩니다.PROMPTS["local_rag_response"]
는 로컬 검색 생성의 시스템 프롬프트 템플릿입니다.PROMPTS["global_reduce_rag_response"]
전역 검색 생성의 시스템 프롬프트 템플릿입니다.PROMPTS["fail_response"]
사용자 쿼리와 관련된 것이 없을 때의 대체 응답입니다. nano-graphrag
사용하면 청킹 방법을 사용자 정의할 수 있습니다. 예제를 확인하세요.
내장된 텍스트 분할기 청킹 방법으로 전환합니다.
from nano_graphrag . _op import chunking_by_seperators
GraphRAG (..., chunk_func = chunking_by_seperators ,...)
nano-graphrag
에서는 훌륭한 LLM과 저렴한 LLM의 두 가지 유형이 필요합니다. 전자는 계획과 대응에 사용되고, 후자는 요약에 사용됩니다. 기본적으로 가장 좋은 것은 gpt-4o
이고 저렴한 것은 gpt-4o-mini
입니다.
자신만의 LLM 기능을 구현할 수 있습니다( _llm.gpt_4o_complete
참조).
async def my_llm_complete (
prompt , system_prompt = None , history_messages = [], ** kwargs
) -> str :
# pop cache KV database if any
hashing_kv : BaseKVStorage = kwargs . pop ( "hashing_kv" , None )
# the rest kwargs are for calling LLM, for example, `max_tokens=xxx`
...
# YOUR LLM calling
response = await call_your_LLM ( messages , ** kwargs )
return response
기본 항목을 다음으로 바꾸세요.
# Adjust the max token size or the max async requests if needed
GraphRAG ( best_model_func = my_llm_complete , best_model_max_token_size = ..., best_model_max_async = ...)
GraphRAG ( cheap_model_func = my_llm_complete , cheap_model_max_token_size = ..., cheap_model_max_async = ...)
deepseek-chat
LLM 모델로 사용하는 이 예를 참조할 수 있습니다.
LLM 모델로 ollama
사용하는 이 예를 참조할 수 있습니다.
nano-graphrag
는 best_model_func
사용하여 "response_format": {"type": "json_object"}
매개변수로 JSON을 출력합니다. 그러나 일부 오픈 소스 모델에서는 불안정한 JSON을 생성할 수 있습니다.
nano-graphrag
응답을 JSON으로 변환할 수 있는 사후 처리 인터페이스를 도입합니다. 이 기능의 서명은 다음과 같습니다.
def YOUR_STRING_TO_JSON_FUNC ( response : str ) -> dict :
"Convert the string response to JSON"
...
그리고 GraphRAG(...convert_response_to_json_func=YOUR_STRING_TO_JSON_FUNC,...)
로 자신만의 기능을 전달하세요.
예를 들어 json_repair를 참조하여 LLM에서 반환된 JSON 문자열을 복구할 수 있습니다.
기본 임베딩 함수를 _utils.EmbedddingFunc
인스턴스로 바꿀 수 있습니다.
예를 들어 기본적으로 OpenAI 임베딩 API를 사용하고 있습니다.
@ wrap_embedding_func_with_attrs ( embedding_dim = 1536 , max_token_size = 8192 )
async def openai_embedding ( texts : list [ str ]) -> np . ndarray :
openai_async_client = AsyncOpenAI ()
response = await openai_async_client . embeddings . create (
model = "text-embedding-3-small" , input = texts , encoding_format = "float"
)
return np . array ([ dp . embedding for dp in response . data ])
기본 임베딩 기능을 다음으로 바꾸세요.
GraphRAG ( embedding_func = your_embed_func , embedding_batch_num = ..., embedding_func_max_async = ...)
sentence-transformer
사용하여 임베딩을 로컬로 계산하는 예를 참조할 수 있습니다.
모든 저장소 관련 구성 요소를 자체 구현으로 교체할 수 있습니다. nano-graphrag
주로 세 가지 종류의 저장소를 사용합니다.
데이터의 키-json 쌍을 저장하기 위한 base.BaseKVStorage
GraphRAG(.., key_string_value_json_storage_cls=YOURS,...)
임베딩 인덱싱을 위한 base.BaseVectorStorage
nano-vectordb
백엔드로 사용합니다.hnswlib
저장소도 내장되어 있습니다. 이 예를 확인하세요.milvus-lite
백엔드로 구현하는 이 예제를 확인하세요(Windows에서는 사용할 수 없음).GraphRAG(.., vector_db_storage_cls=YOURS,...)
지식 그래프를 저장하기 위한 base.BaseGraphStorage
networkx
백엔드로 사용합니다.Neo4jStorage
가 내장되어 있습니다. 이 튜토리얼을 확인해 보세요.GraphRAG(.., graph_storage_cls=YOURS,...)
nano_graphrag.base
를 참조하면 각 구성 요소에 대한 자세한 인터페이스를 볼 수 있습니다.
FQA를 확인하세요.
ROADMAP.md를 참조하세요.
nano-graphrag
어떤 종류의 기여에도 열려 있습니다. 기여하기 전에 이 내용을 읽어보세요.
nano-graphrag
사용한 프로젝트프로젝트에서
nano-graphrag
사용하는 경우 풀 요청에 오신 것을 환영합니다. 다른 사람들이 이 저장소를 신뢰하는 데 도움이 될 것입니다❤️
nano-graphrag
GraphRAG
의 covariates
기능을 구현하지 않았습니다.nano-graphrag
원본과 다른 전역 검색을 구현합니다. 원본은 맵 축소와 같은 스타일을 사용하여 모든 커뮤니티를 컨텍스트에 채우는 반면 nano-graphrag
상위 K 중요 및 중앙 커뮤니티만 사용합니다(제어하려면 QueryParam.global_max_consider_community
사용, 기본값은 512 커뮤니티).