Implementasi GraphRAG yang sederhana dan mudah diretas
? GraphRAG bagus dan kuat, tetapi implementasi resminya sulit/menyakitkan untuk dibaca atau diretas .
? Proyek ini menyediakan GraphRAG yang lebih kecil, lebih cepat, dan lebih bersih , namun tetap mempertahankan fungsionalitas inti (lihat tolok ukur dan masalah).
? Tidak termasuk tests
dan petunjuk, nano-graphrag
berisi sekitar 1.100 baris kode .
? Kecil namun portabel (faiss, neo4j, ollama...), asinkron dan diketik sepenuhnya.
Instal dari sumber (disarankan)
# clone this repo first
cd nano-graphrag
pip install -e .
Instal dari PyPi
pip install nano-graphrag
Tip
Harap setel kunci OpenAI API di lingkungan: export OPENAI_API_KEY="sk-..."
.
Tip
Jika Anda menggunakan Azure OpenAI API, lihat .env.example untuk mengatur Azure OpenAI Anda. Kemudian teruskan GraphRAG(...,using_azure_openai=True,...)
untuk mengaktifkan.
Tip
Jika Anda menggunakan Amazon Bedrock API, pastikan kredensial Anda diatur dengan benar melalui perintah seperti aws configure
. Kemudian aktifkan dengan mengkonfigurasi seperti ini: 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",...)
. Lihat contoh skrip.
Tip
Jika Anda tidak memiliki kunci apa pun, lihat contoh penggunaan transformers
dan ollama
ini. Jika Anda ingin menggunakan LLM atau Model Penyematan lain, periksa Kemajuan.
unduh salinan A Christmas Carol oleh Charles Dickens:
curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
Gunakan cuplikan python di bawah ini:
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" )))
Lain kali Anda menginisialisasi GraphRAG
dari working_dir
yang sama, semua konteks akan dimuat ulang secara otomatis.
graph_func . insert ([ "TEXT1" , "TEXT2" ,...])
nano-graphrag
mendukung penyisipan tambahan, tidak ada komputasi atau data duplikat yang akan ditambahkan:
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
menggunakan md5-hash konten sebagai kuncinya, sehingga tidak ada potongan duplikat.Namun, setiap kali Anda memasukkan, komunitas grafik akan dihitung ulang dan laporan komunitas akan dibuat ulang
nano-graphrag
juga mendukung penyisipan dan kueri RAG yang naif:
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" )
)
Untuk setiap metode NAME(...)
, ada metode asinkron yang sesuai aNAME(...)
await graph_func . ainsert (...)
await graph_func . aquery (...)
...
GraphRAG
dan QueryParam
adalah dataclass
dengan Python. Gunakan help(GraphRAG)
dan help(QueryParam)
untuk melihat semua parameter yang tersedia! Atau periksa bagian Kemajuan untuk melihat beberapa opsi.
Di bawah ini adalah komponen yang dapat Anda gunakan:
Jenis | Apa | Di mana |
---|---|---|
LLM | OpenAI | Bawaan |
Batuan Dasar Amazon | Bawaan | |
Pencarian Mendalam | contoh | |
ollama | contoh | |
Penyematan | OpenAI | Bawaan |
Batuan Dasar Amazon | Bawaan | |
Transformator kalimat | contoh | |
Basis Data Vektor | nano-vectordb | Bawaan |
hnswlib | Contoh bawaan | |
milvus-lite | contoh | |
faiss | contoh | |
Penyimpanan Grafik | networkx | Bawaan |
neo4j | Bawaan (dokumen) | |
Visualisasi | grafikml | contoh |
Potongan | berdasarkan ukuran token | Bawaan |
dengan pemisah teks | Bawaan |
Built-in
berarti kita memiliki implementasi tersebut di dalam nano-graphrag
. examples
berarti kita memiliki implementasi itu di dalam tutorial di bawah folder contoh.
Periksa contoh/tolok ukur untuk melihat beberapa perbandingan antar komponen.
Selalu dipersilakan untuk menyumbangkan lebih banyak komponen.
GraphRAG(...,always_create_working_dir=False,...)
akan melewati langkah pembuatan dir. Gunakan jika Anda mengalihkan semua komponen ke penyimpanan non-file. graph_func.query
mengembalikan jawaban akhir tanpa streaming.
Jika Anda ingin berinteraksi nano-graphrag
dalam proyek Anda, Anda dapat menggunakan param=QueryParam(..., only_need_context=True,...)
, yang hanya akan mengembalikan konteks yang diambil dari grafik, seperti:
# 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...
...
Anda dapat mengintegrasikan konteks tersebut ke dalam perintah khusus Anda.
nano-graphrag
menggunakan perintah dari objek dict nano_graphrag.prompt.PROMPTS
. Anda dapat memainkannya dan mengganti prompt apa pun di dalamnya.
Beberapa petunjuk penting:
PROMPTS["entity_extraction"]
digunakan untuk mengekstrak entitas dan relasi dari potongan teks.PROMPTS["community_report"]
digunakan untuk mengatur dan meringkas deskripsi cluster grafik.PROMPTS["local_rag_response"]
adalah templat prompt sistem dari generasi pencarian lokal.PROMPTS["global_reduce_rag_response"]
adalah template prompt sistem dari generasi pencarian global.PROMPTS["fail_response"]
adalah respons cadangan ketika tidak ada yang terkait dengan kueri pengguna. nano-graphrag
memungkinkan Anda menyesuaikan metode chunking Anda sendiri, lihat contohnya.
Beralih ke metode pemotongan pemisah teks bawaan:
from nano_graphrag . _op import chunking_by_seperators
GraphRAG (..., chunk_func = chunking_by_seperators ,...)
Dalam nano-graphrag
, kita membutuhkan dua jenis LLM, yang bagus dan yang murah. Yang pertama digunakan untuk merencanakan dan merespons, yang terakhir digunakan untuk membuat ringkasan. Secara default, yang terbaik adalah gpt-4o
dan yang murah adalah gpt-4o-mini
Anda dapat menerapkan fungsi LLM Anda sendiri (lihat _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
Ganti yang default dengan:
# 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 = ...)
Anda dapat merujuk pada contoh ini yang menggunakan deepseek-chat
sebagai model LLM
Anda dapat merujuk pada contoh ini yang menggunakan ollama
sebagai model LLM
nano-graphrag
akan menggunakan best_model_func
untuk menghasilkan JSON dengan params "response_format": {"type": "json_object"}
. Namun ada beberapa model sumber terbuka yang mungkin menghasilkan JSON tidak stabil.
nano-graphrag
memperkenalkan antarmuka pasca-proses bagi Anda untuk mengonversi respons ke JSON. Tanda tangan fungsi ini ada di bawah:
def YOUR_STRING_TO_JSON_FUNC ( response : str ) -> dict :
"Convert the string response to JSON"
...
Dan teruskan fungsi Anda sendiri dengan GraphRAG(...convert_response_to_json_func=YOUR_STRING_TO_JSON_FUNC,...)
.
Misalnya, Anda bisa merujuk ke json_repair untuk memperbaiki string JSON yang dikembalikan oleh LLM.
Anda dapat mengganti fungsi penyematan default dengan instance _utils.EmbedddingFunc
apa pun.
Misalnya, yang default menggunakan API penyematan OpenAI:
@ 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 ])
Ganti fungsi penyematan default dengan:
GraphRAG ( embedding_func = your_embed_func , embedding_batch_num = ..., embedding_func_max_async = ...)
Anda dapat merujuk ke contoh yang menggunakan sentence-transformer
untuk menghitung penyematan secara lokal.
Anda dapat mengganti semua komponen terkait penyimpanan ke implementasi Anda sendiri, nano-graphrag
terutama menggunakan tiga jenis penyimpanan:
base.BaseKVStorage
untuk menyimpan pasangan data key-json
GraphRAG(.., key_string_value_json_storage_cls=YOURS,...)
base.BaseVectorStorage
untuk mengindeks embeddings
nano-vectordb
sebagai backend.hnswlib
bawaan, lihat contoh ini.milvus-lite
sebagai backend (tidak tersedia di Windows).GraphRAG(.., vector_db_storage_cls=YOURS,...)
base.BaseGraphStorage
untuk menyimpan grafik pengetahuan
networkx
sebagai backend.Neo4jStorage
bawaan untuk grafik, lihat tutorial ini.GraphRAG(.., graph_storage_cls=YOURS,...)
Anda dapat merujuk ke nano_graphrag.base
untuk melihat detail antarmuka untuk setiap komponen.
Periksa FAQ.
Lihat PETA JALAN.md
nano-graphrag
terbuka untuk kontribusi apa pun. Baca ini sebelum Anda berkontribusi.
nano-graphrag
Selamat datang untuk menarik permintaan jika proyek Anda menggunakan
nano-graphrag
, ini akan membantu orang lain mempercayai repo ini❤️
nano-graphrag
tidak mengimplementasikan fitur covariates
GraphRAG
nano-graphrag
mengimplementasikan pencarian global yang berbeda dari aslinya. Yang asli menggunakan gaya seperti pengurangan peta untuk mengisi semua komunitas ke dalam konteks, sementara nano-graphrag
hanya menggunakan K komunitas penting dan pusat teratas (gunakan QueryParam.global_max_consider_community
untuk mengontrol, defaultnya adalah 512 komunitas).