GraphRAG چیست؟ ترکیب گراف دانش و RAG با آموزش عملی
GraphRAG با تبدیل موجودیتها و روابط اسناد به گراف دانش، بازیابی اطلاعات پیچیده و چندمرحلهای را بهبود میدهد. در این راهنما، تفاوت GraphRAG با RAG معمولی و روش ساخت نمونه فارسی با Python و API درواره را بررسی میکنیم.
RAG معمولی برای پاسخگویی براساس اسناد، فایلها و پایگاه دانش بسیار مفید است. در این معماری، سؤال کاربر به Embedding تبدیل میشود و سیستم قطعههای متنی مشابه را از یک پایگاه برداری بازیابی میکند.
این روش برای سؤالهای مستقیم عملکرد خوبی دارد:
مدت ضمانت محصول چقدر است؟
اگر پاسخ دقیق این سؤال داخل یکی از قطعههای متن باشد، Vector Search احتمالاً همان قطعه را پیدا میکند.
اما همه سؤالها به یک قطعه مشخص از متن محدود نیستند.
برای مثال:
کدام تأمینکنندگان با پروژههایی همکاری داشتهاند که مدیر آنها قبلاً در شرکت الف فعالیت میکرده است؟
پاسخ این سؤال ممکن است میان چند سند مختلف پراکنده باشد:
- یک سند نام مدیر پروژه را مشخص میکند.
- سند دیگر سوابق شغلی مدیر را توضیح میدهد.
- فایل سوم تأمینکنندگان پروژه را فهرست میکند.
- گزارش دیگری ارتباط پروژه با شرکت را نشان میدهد.
جستوجوی برداری میتواند قطعههای مشابه را پیدا کند، اما الزاماً رابطه میان «مدیر»، «شرکت»، «پروژه» و «تأمینکننده» را دنبال نمیکند.
GraphRAG برای حل چنین مسئلهای از ساختار گراف استفاده میکند.
پاسخ کوتاه: GraphRAG چیست؟
GraphRAG یا Graph Retrieval-Augmented Generation روشی برای تقویت RAG با استفاده از گراف دانش است.
در این معماری، اطلاعات فقط بهشکل قطعههای مستقل متن نگهداری نمیشوند. سیستم موجودیتها و ارتباط میان آنها را نیز استخراج میکند.
برای مثال:
امیر
→ مدیر پروژه
→ پروژه سپهر
→ استفاده میکند از
→ محصول سازمانی
یا:
شرکت الف
→ تأمینکننده
→ پروژه سپهر
پروژه سپهر
→ متعلق به
→ سازمان ب
هنگام دریافت سؤال، GraphRAG میتواند علاوه بر جستوجوی متنهای مشابه، مسیرهای مرتبط داخل گراف را نیز پیدا کند و زمینه کاملتری در اختیار مدل زبانی قرار دهد.
مستندات رسمی Microsoft GraphRAG این روش را رویکردی مبتنی بر گراف دانش برای بهبود پاسخگویی درباره اطلاعات پیچیده معرفی میکند.
چرا RAG معمولی همیشه کافی نیست؟
RAG معمولی عمدتاً روی شباهت معنایی میان سؤال و قطعههای متن تکیه میکند.
فرایند ساده آن چنین است:
سؤال کاربر
→ ساخت Embedding
→ جستوجوی برداری
→ بازیابی قطعههای مشابه
→ ارسال به مدل
→ تولید پاسخ
این معماری در بسیاری از کاربردها کافی است، اما چند محدودیت مهم دارد.
ارتباط قطعهها از بین میرود
هنگام Chunking، یک سند بزرگ به بخشهای کوچک تقسیم میشود. ممکن است اطلاعات یک رابطه میان چند قطعه مختلف پراکنده شود.
شباهت متنی با ارتباط واقعی یکسان نیست
دو قطعه میتوانند از نظر معنایی شبیه باشند، اما رابطه موردنیاز سؤال را نشان ندهند.
پرسشهای چندمرحلهای دشوارند
بعضی سؤالها به دنبالکردن چند رابطه نیاز دارند:
شخص
→ عضو تیم
→ مسئول محصول
→ وابسته به شرکت
→ دارای قرارداد با سازمان دیگر
سؤالهای کلی درباره کل مجموعه اسناد
سؤالی مانند زیر درباره یک قطعه مشخص نیست:
مهمترین موضوعها و ارتباطهای موجود در تمام گزارشهای سهماهه چه هستند؟
مقاله پژوهشی Microsoft با عنوان From Local to Global دقیقاً روی این نوع پرسشهای کلی تمرکز دارد. در این روش، از گراف موجودیتها و خلاصه گروههای مرتبط برای پاسخگویی درباره کل مجموعه داده استفاده میشود.
گراف دانش چیست؟
گراف دانش یا Knowledge Graph روشی برای نمایش اطلاعات بهصورت موجودیت و رابطه است.
هر گراف از دو جزء اصلی تشکیل میشود:
Node یا گره
گره یک موجودیت است:
- شخص
- شرکت
- محصول
- پروژه
- شهر
- سند
- رویداد
- مهارت
- واحد سازمانی
Edge یا یال
یال ارتباط میان دو موجودیت را نمایش میدهد:
- کار میکند در
- مدیریت میکند
- تولید میکند
- وابسته است به
- خریداری کرده است
- در آن قرار دارد
- مشارکت دارد در
- جایگزین است با
نمونه:
(علی) -[مدیریت میکند]-> (پروژه آریا)
(پروژه آریا) -[متعلق است به]-> (شرکت نمونه)
(شرکت نمونه) -[استفاده میکند از]-> (سامانه فروش)
هر Node و Edge میتواند ویژگی نیز داشته باشد:
{
"entity": "پروژه آریا",
"type": "Project",
"status": "active",
"start_date": "1405-01-15"
}
GraphRAG چگونه کار میکند؟
GraphRAG معمولاً دو فرایند اصلی دارد:
- ساخت و بهروزرسانی گراف
- بازیابی و پاسخگویی
مرحله اول: دریافت اسناد
منابع میتوانند شامل این موارد باشند:
- فایل PDF
- صفحه وب
- مستندات محصول
- گزارشهای سازمانی
- تیکتهای پشتیبانی
- اطلاعات CRM
- شرح پروژهها
- کاتالوگ محصولات
- مقالات پژوهشی
- صورتجلسهها
مرحله دوم: تقسیم اسناد
اسناد طولانی به قطعههای کوچکتر تقسیم میشوند. اندازه قطعه باید بهگونهای باشد که مدل بتواند موجودیتها و روابط هر بخش را تشخیص دهد.
مرحله سوم: استخراج موجودیت
مدل زبانی موجودیتهای هر قطعه را شناسایی میکند.
متن:
شرکت ستاره سیلوه درواره را برای ارائه دسترسی یکپارچه
به مدلهای هوش مصنوعی توسعه داده است.
خروجی احتمالی:
{
"entities": [
{
"name": "شرکت ستاره سیلوه",
"type": "Company"
},
{
"name": "درواره",
"type": "Platform"
},
{
"name": "مدلهای هوش مصنوعی",
"type": "Technology"
}
]
}
مرحله چهارم: استخراج رابطه
مدل ارتباط میان موجودیتها را مشخص میکند:
{
"relations": [
{
"source": "شرکت ستاره سیلوه",
"relation": "توسعه داده است",
"target": "درواره"
},
{
"source": "درواره",
"relation": "دسترسی فراهم میکند به",
"target": "مدلهای هوش مصنوعی"
}
]
}
مرحله پنجم: یکسانسازی نامها
ممکن است یک موجودیت با نامهای مختلف ظاهر شود:
شرکت ستاره سیلوه
ستاره سیلوه
شرکت سیلوه
سیستم باید تشخیص دهد که این نامها به یک موجودیت اشاره میکنند. این فرایند Entity Resolution نامیده میشود.
مرحله ششم: ساخت گراف
موجودیتها به Node و روابط به Edge تبدیل میشوند.
گراف میتواند در این ابزارها نگهداری شود:
- Neo4j Community Edition
- NetworkX
- PostgreSQL با طراحی رابطهای مناسب
- ArangoDB
- NebulaGraph
- Memgraph
- Microsoft GraphRAG
برای نمونه اولیه، NetworkX کافی است. در پروژههای بزرگتر، Graph Database جستوجو و پیمایش روابط را سادهتر میکند.
مرحله هفتم: ساخت خلاصه گروهها
در معماری Microsoft GraphRAG، موجودیتهای مرتبط در Community یا گروه قرار میگیرند. سپس برای هر گروه یک خلاصه ساخته میشود.
برای مثال:
گروه اول:
محصولات، قابلیتها و مدلهای هوش مصنوعی
گروه دوم:
مشتریان، قراردادها و پروژهها
گروه سوم:
تیمها، افراد و مسئولیتها
این خلاصهها برای پاسخگویی به سؤالهای کلی درباره کل مجموعه اسناد مفید هستند.
مرحله هشتم: پردازش سؤال
سیستم سؤال کاربر را تحلیل میکند و تشخیص میدهد:
- سؤال درباره چه موجودیتهایی است؟
- به کدام رابطهها نیاز دارد؟
- جستوجوی محلی کافی است؟
- آیا باید خلاصه چند Community بررسی شود؟
- آیا Vector Search نیز لازم است؟
مرحله نهم: بازیابی زیرگراف
بهجای ارسال کل گراف، فقط بخش مرتبط بازیابی میشود.
برای سؤال زیر:
چه پروژههایی توسط شرکت نمونه اجرا شدهاند و مدیر هر پروژه چه کسی بوده است؟
زیرگراف میتواند چنین باشد:
شرکت نمونه
├── اجرا کرده است → پروژه آریا
│ └── مدیریت میشود توسط → علی رضایی
└── اجرا کرده است → پروژه سپهر
└── مدیریت میشود توسط → سارا محمدی
مرحله دهم: تولید پاسخ
زیرگراف، متنهای مرجع و سؤال کاربر در اختیار مدل قرار میگیرند. مدل بر اساس این زمینه پاسخ نهایی را میسازد.
تفاوت GraphRAG با RAG معمولی
| معیار | RAG معمولی | GraphRAG |
|---|---|---|
| ساختار اصلی | قطعه متن و Embedding | موجودیت، رابطه و متن |
| روش بازیابی | شباهت برداری یا کلمهای | پیمایش گراف همراه با جستوجو |
| روابط چندمرحلهای | محدود | مناسبتر |
| سؤالهای کلی | معمولاً دشوارتر | قابل پشتیبانی با Community Summary |
| زمان آمادهسازی | کمتر | بیشتر |
| هزینه Indexing | کمتر | بیشتر |
| پیچیدگی پیادهسازی | پایینتر | بالاتر |
| مناسب اسناد ساده | بله | گاهی غیرضروری |
| مناسب شبکه روابط | محدود | بله |
| توضیح مسیر ارتباط | دشوارتر | سادهتر |
GraphRAG جایگزین کامل RAG نیست. در بسیاری از پروژهها، بهترین معماری ترکیبی از Vector Search، جستوجوی واژگانی و گراف است.
تفاوت GraphRAG با Knowledge Graph
Knowledge Graph ساختار داده است. GraphRAG یک معماری پاسخگویی مبتنی بر بازیابی است که از گراف دانش استفاده میکند.
Knowledge Graph
= موجودیتها و روابط
GraphRAG
= گراف دانش + بازیابی + مدل زبانی + تولید پاسخ
میتوان گراف دانش داشت و از مدل زبانی استفاده نکرد. همچنین میتوان RAG ساخت که هیچ گرافی نداشته باشد.
GraphRAG این دو را به یکدیگر متصل میکند.
تفاوت GraphRAG با Hybrid Search
Hybrid Search معمولاً جستوجوی واژگانی مانند BM25 را با Vector Search ترکیب میکند.
این روش برای یافتن موارد زیر مناسب است:
- عبارت دقیق
- کد خطا
- نام محصول
- جمله مشابه
- مفهوم مرتبط
اما GraphRAG ارتباط میان موجودیتها را دنبال میکند.
| سؤال | روش مناسبتر |
|---|---|
| سندی درباره خطای ۴۲۹ پیدا کن | Hybrid Search |
| متن مشابه این سؤال را پیدا کن | Vector Search |
| مدیر پروژه آریا چه کسی است؟ | Graph Search |
| مدیر پروژه آریا قبلاً در کدام شرکت بوده است؟ | GraphRAG |
| موضوعهای اصلی تمام گزارشها چیست؟ | GraphRAG با Global Search |
برای آشنایی بیشتر، مقاله Hybrid Search چیست؟ را مطالعه کنید.
Local Search در GraphRAG چیست؟
Local Search برای سؤالهایی مناسب است که درباره موجودیت یا رابطه مشخصی هستند.
مثال:
شرکت الف در کدام پروژهها مشارکت داشته است؟
فرایند احتمالی:
- شناسایی شرکت الف
- پیداکردن Node مربوط به آن
- پیمایش Edgeهای مرتبط
- بازیابی توضیحات و اسناد منبع
- ارسال زمینه به مدل
- تولید پاسخ
Local Search بخش کوچکی از گراف را بررسی میکند.
Global Search در GraphRAG چیست؟
Global Search برای سؤالهایی درباره کل مجموعه اطلاعات استفاده میشود:
مهمترین موضوعهای مطرحشده در گزارشهای مشتریان چیست؟
چه روندهایی در تمام پروژههای سال گذشته دیده میشوند؟
در Microsoft GraphRAG، خلاصه Communityها بررسی میشوند و پاسخهای جزئی در یک نتیجه نهایی ترکیب میشوند.
براساس توضیح پروژه GraphRAG در Microsoft Research، این معماری استخراج متن، تحلیل شبکه، پرامپتنویسی و خلاصهسازی را در یک جریان کامل ترکیب میکند.
DRIFT Search چیست؟
در نسخههای جدید Microsoft GraphRAG، روش DRIFT Search نیز ارائه شده است. نام آن از Dynamic Reasoning and Inference with Flexible Traversal گرفته شده است.
DRIFT تلاش میکند مزایای جستوجوی محلی و سراسری را ترکیب کند:
- از یک نمای کلی آغاز میکند
- مسیرهای مرتبط را دنبال میکند
- پرسشهای تکمیلی داخلی ایجاد میکند
- به بخشهای دقیقتر گراف میرسد
- نتیجه را با شواهد محلی ترکیب میکند
نوع Search مناسب باید براساس ماهیت سؤال انتخاب شود.
کاربردهای GraphRAG در بازار ایران
دستیار دانش سازمانی
ساخت ارتباط میان این موجودیتها:
کارمند
→ واحد سازمانی
→ پروژه
→ سند
→ مشتری
→ محصول
کاربر میتواند درباره ارتباط چند بخش سؤال بپرسد، بدون اینکه تمام اسناد را جداگانه جستوجو کند.
تحلیل پروژهها
GraphRAG میتواند افراد، وظایف، تصمیمها، تأخیرها و وابستگی پروژهها را به یکدیگر متصل کند.
نمونه سؤال:
کدام تصمیمها روی تأخیر پروژههایی اثر گذاشتهاند که با تأمینکننده الف کار میکردند؟
دستیار CRM
موجودیتهای احتمالی:
مشتری
→ شرکت
→ فرصت فروش
→ محصول
→ جلسه
→ تیکت
→ قرارداد
GraphRAG میتواند نمای مرتبطتری از تاریخچه مشتری ایجاد کند.
پشتیبانی محصول
میتوان ارتباط میان این موارد را ثبت کرد:
محصول
→ نسخه
→ قابلیت
→ خطا
→ راهحل
→ تیکت مشابه
سؤال کاربر فقط با شباهت متن بررسی نمیشود؛ نسخه محصول و ارتباط خطا با راهحل نیز در بازیابی اثر میگذارد.
فروشگاه اینترنتی
گراف میتواند روابط زیر را نگهداری کند:
محصول
→ برند
→ دستهبندی
→ ویژگی
→ لوازم جانبی
→ محصول سازگار
→ محصول جایگزین
برای مثال:
کدام کیف با لپتاپ انتخابشده سازگار است و در همان برند یک ماوس مناسب نیز دارد؟
تحلیل مقالات و منابع پژوهشی
موجودیتها:
نویسنده
→ مقاله
→ دانشگاه
→ موضوع
→ روش پژوهش
→ منبع引用شده
GraphRAG برای یافتن ارتباط میان پژوهشگران، موضوعها و مقالات مرتبط مفید است.
مدیریت زنجیره تأمین
روابط میان تأمینکننده، محصول، قطعه، انبار، سفارش و پروژه میتوانند در قالب گراف نمایش داده شوند.
چه زمانی GraphRAG مناسب نیست؟
GraphRAG همیشه بهترین گزینه نیست.
اسناد کم و سادهاند
اگر اطلاعات در چند فایل کوچک قرار دارد و سؤالها مستقیماند، RAG معمولی کافی است.
روابط اهمیت ندارند
اگر کاربر فقط به دنبال قطعه متن مشابه است، ساخت گراف ارزش زیادی اضافه نمیکند.
داده ساختار مشخصی ندارد
اگر نمیتوانید نوع موجودیتها و روابط مهم را تعریف کنید، گراف ممکن است شلوغ و کمفایده شود.
اطلاعات بهسرعت تغییر میکند
گراف باید همزمان با منابع اصلی بهروزرسانی شود. اگر جریان بهروزرسانی طراحی نشده باشد، ارتباطهای قدیمی در نتایج باقی میمانند.
هزینه Indexing محدود است
استخراج موجودیت، رابطه، خلاصه و Community به پردازش بیشتری از RAG ساده نیاز دارد.
پاسخ سریع اولویت اصلی است
پیمایش گراف و ترکیب چند منبع میتواند زمان پاسخ را افزایش دهد. برای سؤالهای ساده بهتر است مسیر مستقیمتری وجود داشته باشد.
معماری پیشنهادی GraphRAG با API درواره
اسناد
→ Chunking
→ استخراج موجودیت و رابطه با مدل
→ یکسانسازی موجودیتها
→ ساخت گراف دانش
→ افزودن Embedding
→ دریافت سؤال کاربر
→ انتخاب Local یا Global Search
→ بازیابی زیرگراف و متن
→ تولید پاسخ با API درواره
API درواره میتواند در دو مرحله استفاده شود:
مرحله Indexing
مدل زبانی از متن، موجودیت و رابطه استخراج میکند.
مرحله پاسخگویی
مدل براساس زیرگراف و متنهای بازیابیشده، پاسخ فارسی تولید میکند.
درواره خود یک Graph Database یا سامانه آماده GraphRAG نیست. گراف، Retriever، Pipeline و منطق بهروزرسانی باید در برنامه شما پیادهسازی شوند. درواره لایه دسترسی به مدلهای هوش مصنوعی را فراهم میکند.
ابزارهای قابل دسترسی برای پیادهسازی GraphRAG
NetworkX
کتابخانه متنباز Python برای ساخت و تحلیل گراف است. برای آموزش، آزمایش و نمونههای کوچک مناسب است.
Neo4j Community Edition
پایگاه داده گرافی قابل نصب روی سرور است و از زبان Cypher برای Query استفاده میکند.
بسته رسمی neo4j-graphrag قابلیتهایی مانند Retriever برداری، Hybrid Retriever، Text-to-Cypher و GraphRAG را ارائه میدهد. اطلاعات نسخهها و روش نصب در مستندات رسمی Neo4j GraphRAG موجود است.
Microsoft GraphRAG
پروژه متنباز Microsoft شامل Pipeline استخراج داده ساختاریافته از متن، ساخت گراف، Community Detection، خلاصهسازی و روشهای مختلف Query است. کد آن در مخزن رسمی Microsoft GraphRAG منتشر شده است.
PostgreSQL
برای گرافهای کوچک یا زمانی که زیرساخت موجود بر PostgreSQL است، میتوان Nodeها و Edgeها را در جدولهای رابطهای نگهداری کرد. برای پیمایشهای پیچیده، Graph Database انتخاب سادهتری است.
آموزش ساخت GraphRAG ساده با Python و API درواره
در این آموزش یک نمونه کوچک میسازیم که:
- چند متن دریافت میکند.
- موجودیتها و روابط را استخراج میکند.
- گراف میسازد.
- زیرگراف مرتبط را پیدا میکند.
- پاسخ را با API درواره تولید میکند.
این نمونه جایگزین Microsoft GraphRAG نیست، اما منطق پایه را نشان میدهد.
نصب کتابخانهها
pip install openai networkx
اتصال به API درواره
import json
import os
import networkx as nx
from openai import OpenAI
client = OpenAI(
api_key=os.environ["DARVAREH_API_KEY"],
base_url="https://api.darvareh.ir/v1"
)
MODEL_ID = os.environ["DARVAREH_MODEL_ID"]
Model ID را از فهرست فعلی مدلهای درواره انتخاب کنید. برای استخراج ساختاریافته، مدل باید در تولید JSON عملکرد مناسبی داشته باشد.
تعریف اسناد نمونه
documents = [
"""
شرکت آریا پروژه سپهر را اجرا میکند.
مدیر پروژه سپهر سارا محمدی است.
""",
"""
سارا محمدی پیش از پروژه سپهر در شرکت پارس فعالیت میکرد.
""",
"""
شرکت دادهور تأمینکننده زیرساخت پروژه سپهر است.
شرکت دادهور با شرکت آریا قرارداد همکاری دارد.
"""
]
استخراج موجودیت و رابطه
def extract_graph(text: str) -> dict:
response = client.chat.completions.create(
model=MODEL_ID,
response_format={
"type": "json_object"
},
messages=[
{
"role": "system",
"content": """
از متن فارسی، موجودیتها و روابط را استخراج کن.
فقط JSON معتبر با این ساختار برگردان:
{
"entities": [
{
"name": "نام استاندارد موجودیت",
"type": "Person | Company | Project | Product | Other"
}
],
"relations": [
{
"source": "نام موجودیت مبدأ",
"relation": "نوع رابطه کوتاه و فارسی",
"target": "نام موجودیت مقصد"
}
]
}
قواعد:
- فقط اطلاعات صریح متن را استخراج کن.
- نام یک موجودیت را در تمام خروجی یکسان بنویس.
- رابطه را کوتاه و روشن بنویس.
"""
},
{
"role": "user",
"content": text
}
],
temperature=0
)
content = response.choices[0].message.content
return json.loads(content)
پشتیبانی از response_format به مدل انتخابشده وابسته است. اگر مدل از JSON Mode پشتیبانی نمیکند، این پارامتر را حذف و خروجی را پیش از ورود به گراف بررسی کنید.
ساخت گراف
graph = nx.MultiDiGraph()
for document_id, document in enumerate(documents):
extracted = extract_graph(document)
for entity in extracted["entities"]:
graph.add_node(
entity["name"],
entity_type=entity["type"]
)
for relation in extracted["relations"]:
graph.add_edge(
relation["source"],
relation["target"],
relation=relation["relation"],
document_id=document_id
)
نمایش Nodeها:
for node, attributes in graph.nodes(data=True):
print(node, attributes)
نمایش روابط:
for source, target, attributes in graph.edges(data=True):
print(
source,
"->",
attributes["relation"],
"->",
target
)
خروجی احتمالی:
شرکت آریا -> اجرا میکند -> پروژه سپهر
پروژه سپهر -> مدیریت میشود توسط -> سارا محمدی
سارا محمدی -> فعالیت میکرد در -> شرکت پارس
شرکت دادهور -> تأمینکننده است برای -> پروژه سپهر
شرکت دادهور -> قرارداد همکاری دارد با -> شرکت آریا
تشخیص موجودیت سؤال
def extract_query_entities(question: str) -> list[str]:
response = client.chat.completions.create(
model=MODEL_ID,
response_format={
"type": "json_object"
},
messages=[
{
"role": "system",
"content": """
موجودیتهای اصلی سؤال را استخراج کن.
فقط JSON برگردان:
{
"entities": ["نام موجودیت"]
}
"""
},
{
"role": "user",
"content": question
}
],
temperature=0
)
content = response.choices[0].message.content
return json.loads(content)["entities"]
بازیابی زیرگراف
def retrieve_subgraph(
query_entities: list[str],
max_hops: int = 2
) -> list[str]:
lines = []
visited_edges = set()
for entity in query_entities:
if entity not in graph:
continue
nodes = nx.single_source_shortest_path_length(
graph.to_undirected(),
entity,
cutoff=max_hops
)
selected_nodes = set(nodes.keys())
for source, target, data in graph.edges(data=True):
if source not in selected_nodes:
continue
if target not in selected_nodes:
continue
edge_key = (
source,
data["relation"],
target
)
if edge_key in visited_edges:
continue
visited_edges.add(edge_key)
lines.append(
f"{source} --{data['relation']}--> {target}"
)
return lines
تولید پاسخ نهایی
def answer_with_graph(question: str) -> str:
entities = extract_query_entities(question)
graph_context = retrieve_subgraph(entities)
context_text = "\n".join(graph_context)
response = client.chat.completions.create(
model=MODEL_ID,
messages=[
{
"role": "system",
"content": """
فقط براساس روابط ارائهشده پاسخ بده.
اگر اطلاعات کافی نیست، کمبود اطلاعات را اعلام کن.
پاسخ را به زبان فارسی و کوتاه بنویس.
"""
},
{
"role": "user",
"content": f"""
سؤال:
{question}
روابط بازیابیشده:
{context_text}
"""
}
],
temperature=0.1
)
return response.choices[0].message.content
استفاده:
question = (
"مدیر پروژه سپهر قبلاً در کدام شرکت فعالیت میکرد "
"و تأمینکننده این پروژه کدام شرکت است؟"
)
print(answer_with_graph(question))
پاسخ مورد انتظار:
مدیر پروژه سپهر سارا محمدی است که قبلاً در شرکت پارس
فعالیت میکرد. شرکت دادهور نیز تأمینکننده زیرساخت
پروژه سپهر است.
این پاسخ به دنبالکردن چند رابطه نیاز دارد:
پروژه سپهر
→ مدیر
→ سارا محمدی
→ سابقه فعالیت
→ شرکت پارس
پروژه سپهر
→ تأمینکننده
→ شرکت دادهور
محدودیتهای نمونه ساده
نمونه بالا برای آموزش است و چند محدودیت دارد:
- نامهای مشابه را خودکار ادغام نمیکند
- املای متفاوت موجودیتها را تشخیص نمیدهد
- Community Detection ندارد
- Global Search پیادهسازی نشده است
- از Vector Search استفاده نمیکند
- گراف را فقط در حافظه نگه میدارد
- منبع دقیق هر ادعا را در پاسخ نمایش نمیدهد
- بهروزرسانی افزایشی ندارد
برای پروژه واقعی باید این اجزا بهتدریج اضافه شوند.
ترکیب GraphRAG و Vector Search
در معماری حرفهای لازم نیست بین گراف و Vector Search فقط یکی را انتخاب کنید.
جریان ترکیبی:
سؤال کاربر
├── Vector Search → قطعههای مشابه
├── Graph Search → موجودیتها و روابط
└── Keyword Search → نامها و عبارتهای دقیق
نتایج
→ Reranking
→ ساخت Context
→ مدل زبانی
→ پاسخ
Vector Search متن مشابه را پیدا میکند. Graph Search روابط را دنبال میکند. Keyword Search نامها و شناسههای دقیق را پوشش میدهد.
استفاده از Reranking در GraphRAG
ممکن است چند مسیر، Node و قطعه متن بازیابی شوند. Reranker میتواند موارد مرتبطتر با سؤال را در اولویت قرار دهد.
مراحل پیشنهادی:
- بازیابی Nodeهای مرتبط
- پیمایش یک یا دو رابطه
- دریافت متن منبع
- ترکیب با نتایج Vector Search
- Reranking
- انتخاب زمینه نهایی
- تولید پاسخ
راهنمای این مرحله را در مقاله Reranking چیست؟ بخوانید.
ارزیابی GraphRAG
GraphRAG باید با سؤالهایی ارزیابی شود که واقعاً به روابط نیاز دارند.
سؤال مستقیم
مدیر پروژه سپهر چه کسی است؟
سؤال یکمرحلهای
مدیر پروژه سپهر در کدام شرکت فعالیت میکرد؟
سؤال چندمرحلهای
کدام تأمینکننده با پروژهای همکاری کرده است
که مدیر آن قبلاً در شرکت پارس فعالیت میکرد؟
سؤال کلی
مهمترین گروههای شرکتها، پروژهها و افراد
در مجموعه اسناد چه هستند؟
معیارهای مهم:
- موجودیت درست استخراج شده است
- رابطه درست استخراج شده است
- Node تکراری ایجاد نشده است
- مسیر مرتبط بازیابی شده است
- متن منبع با رابطه سازگار است
- پاسخ تمام بخشهای سؤال را پوشش میدهد
- زمان پاسخ قابلقبول است
- مصرف مرحله Indexing کنترل شده است
بهینهسازی هزینه GraphRAG
ساخت گراف میتواند به درخواستهای متعددی نیاز داشته باشد. برای مدیریت بهتر:
فقط اسناد جدید را پردازش کنید
در هر بهروزرسانی، کل مجموعه را از ابتدا Index نکنید.
Schema مشخص تعریف کنید
بهجای استخراج هر نوع موجودیت، فقط انواع موردنیاز محصول را انتخاب کنید:
Person
Company
Project
Product
Document
روابط را محدود کنید
رابطههای بسیار متنوع باعث شلوغشدن گراف میشوند. فهرستی از روابط مهم تعریف کنید.
از مدل متناسب استفاده کنید
استخراج ساده موجودیت الزاماً به قویترین مدل نیاز ندارد. مدل قویتر را برای ادغام موجودیتهای پیچیده یا پاسخ نهایی استفاده کنید.
پردازش را گروهی انجام دهید
اسناد را در یک Pipeline پسزمینه پردازش کنید، نه هنگام پرسش کاربر.
خلاصهها را دوباره استفاده کنید
Community Summary را تا زمانی که دادههای آن گروه تغییر نکردهاند دوباره تولید نکنید.
اشتباهات رایج در GraphRAG
ساخت گراف بدون تعریف مسئله
ابتدا مشخص کنید کاربران چه نوع رابطههایی را جستوجو میکنند. ساخت گراف بسیار گسترده بدون کاربرد مشخص، پیچیدگی ایجاد میکند.
استخراج تمام اسمها
هر اسم یا عبارت موجود در متن لزوماً یک Node مفید نیست. نوع موجودیتها را محدود کنید.
نادیدهگرفتن Entity Resolution
اگر «شرکت آریا» و «آریا» دو Node جدا باشند، مسیرهای گراف ناقص میشوند.
حذف متن منبع
گراف خلاصهای از روابط است. بهتر است هر Edge به سند یا قطعه اصلی متصل باشد تا زمینه کامل هنگام پاسخگویی قابل بازیابی باشد.
پیمایش بیش از حد
افزایش تعداد Hopها میتواند تعداد زیادی رابطه نامرتبط وارد Context کند. از یک یا دو Hop شروع کنید.
استفاده از GraphRAG برای هر سؤال
سؤال ساده را میتوان با Vector Search یا جستوجوی مستقیم پاسخ داد. Router باید روش بازیابی را براساس نوع سؤال انتخاب کند.
بهروزرسانینکردن گراف
اگر سند حذف یا ویرایش شود، Nodeها و Edgeهای مربوط به آن نیز باید بهروزرسانی شوند.
چکلیست ساخت GraphRAG
طراحی
- کاربرد دقیق مشخص است
- نوع موجودیتها تعریف شدهاند
- روابط مهم تعریف شدهاند
- سؤالهای چندمرحلهای نمونهسازی شدهاند
Indexing
- اسناد به قطعه مناسب تقسیم میشوند
- موجودیتها استخراج میشوند
- روابط استخراج میشوند
- نامهای مشابه یکسانسازی میشوند
- هر Edge به منبع متصل است
- بهروزرسانی افزایشی وجود دارد
Retrieval
- موجودیت سؤال شناسایی میشود
- تعداد Hop محدود است
- Local Search تعریف شده است
- برای سؤالهای کلی مسیر جداگانه وجود دارد
- نتایج متنی و گرافی قابل ترکیباند
Generation
- فقط زمینه مرتبط به مدل ارسال میشود
- پاسخ براساس داده بازیابیشده تولید میشود
- نبود اطلاعات مشخص اعلام میشود
- مدل و Prompt ارزیابی شدهاند
عملیات
- زمان Indexing ثبت میشود
- تعداد Node و Edge بررسی میشود
- Queryهای بینتیجه ثبت میشوند
- نمونههای ناموفق به Dataset ارزیابی اضافه میشوند
- Model ID و Prompt Version ثبت میشوند
نقش API درواره در GraphRAG
درواره یک API یکپارچه و سازگار با OpenAI برای دسترسی به مدلهای مختلف فراهم میکند:
https://api.darvareh.ir/v1
در معماری GraphRAG میتوان از API درواره برای این وظایف استفاده کرد:
- استخراج موجودیت از متن فارسی
- استخراج روابط
- یکسانسازی نامها
- ساخت خلاصه Nodeها
- تولید Community Summary
- تحلیل سؤال کاربر
- انتخاب نوع جستوجو
- تولید پاسخ نهایی
- مقایسه مدلهای مختلف برای Indexing و Query
مزایای این معماری برای توسعهدهندگان ایرانی:
- استفاده از یک API Key
- پرداخت ریالی
- دسترسی به مدلهای مختلف با قرارداد مشترک
- امکان انتخاب مدل جداگانه برای استخراج و پاسخ
- کاهش تغییرات کد هنگام تعویض مدل
- امکان مقایسه کیفیت، سرعت و مصرف مدلها
درواره لایه مدل را فراهم میکند. ساخت گراف، ذخیره Node و Edge، Retrieval و نگهداری Pipeline در برنامه شما انجام میشود.
پرسشهای متداول
GraphRAG چیست؟
GraphRAG نوعی معماری RAG است که برای بازیابی اطلاعات از ساختار گرافی شامل موجودیتها و روابط استفاده میکند.
تفاوت GraphRAG و RAG چیست؟
RAG معمولی بیشتر قطعههای متن مشابه را بازیابی میکند. GraphRAG میتواند روابط میان اشخاص، شرکتها، محصولات، پروژهها و سایر موجودیتها را نیز دنبال کند.
گراف دانش چیست؟
گراف دانش اطلاعات را بهصورت Node و Edge نمایش میدهد. Node یک موجودیت و Edge رابطه میان دو موجودیت است.
آیا GraphRAG به Vector Database نیاز دارد؟
الزاماً خیر، اما ترکیب Vector Search و Graph Search در بسیاری از پروژهها نتیجه کاملتری ایجاد میکند.
آیا GraphRAG جایگزین RAG معمولی است؟
خیر. GraphRAG برای سؤالهای رابطهای، چندمرحلهای و کلی مناسبتر است. RAG معمولی برای بسیاری از سؤالهای مستقیم سادهتر و سریعتر است.
Microsoft GraphRAG چیست؟
Microsoft GraphRAG یک پروژه متنباز برای استخراج گراف از متن، ساخت Community، تولید خلاصه و اجرای روشهای Local، Global و DRIFT Search است.
آیا GraphRAG برای زبان فارسی کار میکند؟
بله. اگر مدل انتخابی بتواند موجودیتها و روابط فارسی را دقیق استخراج کند، میتوان گراف دانش فارسی ساخت. کیفیت باید با دادههای واقعی همان حوزه ارزیابی شود.
آیا Neo4j برای GraphRAG ضروری است؟
خیر. برای نمونههای کوچک میتوان از NetworkX یا حتی جدولهای پایگاه داده استفاده کرد. Neo4j پیمایش و Query گراف را در پروژههای بزرگتر سادهتر میکند.
GraphRAG چه کاربردهایی دارد؟
دستیار دانش سازمانی، CRM، پشتیبانی محصول، تحلیل پروژه، فروشگاه اینترنتی، جستوجوی پژوهشی و تحلیل ارتباط اسناد از کاربردهای آن هستند.
هزینه GraphRAG بیشتر از RAG است؟
مرحله Indexing معمولاً پردازش بیشتری نیاز دارد، زیرا موجودیت، رابطه و خلاصه استخراج میشوند. میزان مصرف به حجم اسناد، Schema، مدل و روش GraphRAG وابسته است.
بهترین مدل برای GraphRAG فارسی چیست؟
مدلی مناسب است که در درک متن فارسی، استخراج JSON و پیروی از Schema عملکرد خوبی داشته باشد. مدل مناسب را باید روی Dataset واقعی پروژه ارزیابی کرد.
چگونه GraphRAG را به API درواره متصل کنیم؟
در SDK سازگار با OpenAI، Base URL را روی آدرس زیر قرار دهید و Model ID مناسب را از فهرست جاری مدلهای درواره انتخاب کنید:
https://api.darvareh.ir/v1
جمعبندی
GraphRAG برای زمانی طراحی شده است که پاسخ سؤال فقط در یک قطعه متن قرار ندارد و باید ارتباط میان چند موجودیت یا سند دنبال شود.
در این معماری:
- اسناد به قطعههای کوچک تقسیم میشوند.
- مدل موجودیتها و روابط را استخراج میکند.
- گراف دانش ساخته میشود.
- سؤال کاربر تحلیل میشود.
- زیرگراف مرتبط بازیابی میشود.
- متنهای منبع به زمینه اضافه میشوند.
- مدل پاسخ نهایی را تولید میکند.
GraphRAG برای همه پروژهها ضروری نیست. اگر سؤالها ساده و اسناد محدود باشند، RAG معمولی انتخاب مناسبتری است. اما زمانی که داده شامل افراد، شرکتها، محصولات، پروژهها و ارتباطهای چندمرحلهای است، گراف میتواند زمینهای فراهم کند که جستوجوی برداری بهتنهایی قادر به بازسازی آن نیست.
برای شروع، لازم نیست یک معماری پیچیده ایجاد کنید. میتوانید با چند نوع Node، چند رابطه مشخص، NetworkX و یک Dataset کوچک آغاز کنید. پس از اثبات ارزش، Graph Database، Vector Search، Community Detection و Global Search را اضافه کنید.
برای استخراج موجودیت و رابطه فارسی و تولید پاسخ نهایی، میتوانید از API هوش مصنوعی درواره استفاده کنید. درواره دسترسی به مدلهای مختلف را از طریق یک API سازگار با OpenAI و پرداخت ریالی فراهم میکند.
مقالات مرتبط
- RAG چیست؟ راهنمای Retrieval-Augmented Generation
- Hybrid Search چیست؟ ترکیب BM25 و Vector Search
- Reranking چیست؟ افزایش دقت RAG با Cross-Encoder
- Embedding چیست؟
- Structured Outputs چیست؟
- AI Agent و Agent Skills چیست؟
منابع
- مستندات رسمی Microsoft GraphRAG
- پروژه GraphRAG در Microsoft Research
- مخزن رسمی Microsoft GraphRAG
- مقاله From Local to Global
- مستندات رسمی Neo4j GraphRAG برای Python
- مخزن رسمی Neo4j GraphRAG
این مقاله صرفاً با هدف آموزش و اطلاعرسانی تهیه شده است. پیش از استفاده عملی، مستندات رسمی سرویسها و صفحه سلب مسئولیت را مطالعه کنید.