تطبيق 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
نصيحة
يرجى تعيين مفتاح OpenAI API في البيئة: export OPENAI_API_KEY="sk-..."
.
نصيحة
إذا كنت تستخدم 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 أو نموذج التضمين آخر، تحقق من التقدم.
تحميل نسخة من رواية ترنيمة عيد الميلاد لتشارلز ديكنز:
curl https://raw.githubusercontent.com/gusye1234/nano-graphrag/main/tests/mock_data.txt > ./book.txt
استخدم مقتطف بايثون أدناه:
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" )))
في المرة القادمة التي تقوم فيها بتهيئة GraphRAG
من نفس working_dir
، سيتم إعادة تحميل جميع السياقات تلقائيًا.
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 كمفتاح، لذلك لا توجد قطعة مكررة.ومع ذلك، في كل مرة تقوم فيها بالإدراج، ستتم إعادة حساب مجتمعات الرسم البياني وسيتم إعادة إنشاء تقارير المجتمع
يدعم 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
هما dataclass
في Python. استخدم help(GraphRAG)
و help(QueryParam)
لرؤية جميع المعلمات المتاحة! أو قم بمراجعة قسم "التقدمات" لرؤية بعض الخيارات.
فيما يلي المكونات التي يمكنك استخدامها:
يكتب | ماذا | أين |
---|---|---|
ماجستير | OpenAI | مدمج |
أمازون بيدروك | مدمج | |
ديب سيك | أمثلة | |
ollama | أمثلة | |
التضمين | OpenAI | مدمج |
أمازون بيدروك | مدمج | |
محولات الجملة | أمثلة | |
قاعدة بيانات المتجهات | nano-vectordb | مدمج |
hnswlib | المدمج في، أمثلة | |
milvus-lite | أمثلة | |
فايس | أمثلة | |
تخزين الرسم البياني | networkx | مدمج |
neo4j | مدمج (وثيقة) | |
التصور | رسوم بيانية | أمثلة |
التقطيع | حسب حجم الرمز | مدمج |
عن طريق مقسم النص | مدمج |
يعني Built-in
أن لدينا هذا التنفيذ داخل nano-graphrag
. examples
تعني أن لدينا هذا التنفيذ داخل برنامج تعليمي ضمن مجلد الأمثلة.
تحقق من الأمثلة/المعايير لرؤية عدد قليل من المقارنات بين المكونات.
نرحب دائما بالمساهمة بالمزيد من المكونات.
GraphRAG(...,always_create_working_dir=False,...)
سوف يتخطى خطوة إنشاء dir. استخدمه إذا قمت بتبديل جميع مكوناتك إلى مخازن غير الملفات. 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
. يمكنك اللعب به واستبدال أي مطالبة بالداخل.
بعض المطالبات الهامة:
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، أحدهما رائع والآخر رخيص. يستخدم الأول للتخطيط والاستجابة، ويستخدم الأخير للتلخيص. افتراضيًا، الخيار الرائع هو 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
يمكنك الرجوع إلى هذا المثال الذي يستخدم ollama
كنموذج LLM
سيستخدم nano-graphrag
best_model_func
لإخراج JSON مع المعلمات "response_format": {"type": "json_object"}
. ومع ذلك، هناك بعض النماذج مفتوحة المصدر التي قد تنتج JSON غير مستقر.
يقدم nano-graphrag
واجهة ما بعد العملية لتحويل الاستجابة إلى JSON. توقيع هذا func أدناه:
def YOUR_STRING_TO_JSON_FUNC ( response : str ) -> dict :
"Convert the string response to JSON"
...
وقم بتمرير func الخاص بك عن طريق GraphRAG(...convert_response_to_json_func=YOUR_STRING_TO_JSON_FUNC,...)
.
على سبيل المثال، يمكنك الرجوع إلى json_repair لإصلاح سلسلة JSON التي تم إرجاعها بواسطة LLM.
يمكنك استبدال وظائف التضمين الافتراضية بأي مثيل _utils.EmbedddingFunc
.
على سبيل المثال، الافتراضي هو استخدام OpenAI embedding 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
بشكل أساسي ثلاثة أنواع من التخزين:
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
بتنفيذ ميزة covariates
في GraphRAG
nano-graphrag
بحثًا عالميًا مختلفًا عن البحث الأصلي. يستخدم الأصل أسلوبًا يشبه تقليل الخريطة لملء جميع المجتمعات في السياق، بينما يستخدم nano-graphrag
فقط المجتمعات المهمة والمركزية من أعلى K (استخدم QueryParam.global_max_consider_community
للتحكم، الافتراضي هو 512 مجتمعًا).