چیتشیت
گرافها و گرافهای دانش
Graphs and Knowledge Graphs
ماتریسهای گراف، لاپلاسین و انتقال پیام، پیوند موجودیتها، استخراج روابط و حافظهی ترکیبی گراف.
فهرست مطالب
ماتریسهای گراف
مفهومها- ماتریس مجاورت
- مقدار $A[i][j] = 1$ برای یک یال. برای گراف بدون جهت متقارن است.
- ماتریس درجه
- ماتریس قطری $D$ با درجهی هر گره. یک مثلث نتیجهی diag(2, 2, 2) را میدهد.
- لاپلاسین
- $L = D - A$. نیمهمعین مثبت است. همهی مقادیر ویژه $\ge 0$ هستند.
- مقادیر ویژهی صفر
- تعداد آنها برابر با شمار مؤلفههای همبند است.
- مقدار فیدلر
- کوچکترین مقدار ویژهی غیرصفر. مقدار کوچک نشاندهندهی یک گلوگاه است.
- انتقال پیام
- $H^{(k+1)} = \sigma(A_{\text{norm}} H^{(k)} W)$. مجموع درایههای هر سطر $A_{\text{norm}}$ برابر 1 است.
- لایهی GCN
- فرمول $\sigma(\hat{D}^{-1/2} \hat{A} \hat{D}^{-1/2} H W)$ با خودحلقه (self-loop)های $\hat{A} = A + I$.
- الگوریتم PageRank
- فرمول $(1-d)/n + d \sum \text{score}(u) / \text{out}(u)$ با d=0.85.
وظایف گراف در کد
کار و کد| وظیفه | کد |
|---|---|
| ساخت یک گراف | Graph(n_nodes, directed=False) |
| افزودن یک یال | add_edge(u, v, weight=1.0) |
| فواصل گام پرش و ترتیب پیمایش | `bfs(graph, start)` returns order, distances |
| یافتن مؤلفهها | connected_components(graph) |
| افراز به دو خوشه | spectral_clustering(graph, k=2) |
| یک دور GNN | message_passing(graph, features, weight_matrix) |
| رتبهبندی گرهها | pagerank(graph, damping=0.85, max_iter=100, tol=1e-6) |
| مقادیر ویژهی لاپلاسین، صعودی | np.linalg.eigvalsh(L) |
افراز طیفی با numpy
کدpython
D = np.diag(A.sum(axis=1)) # ماتریس درجه
L = D - A # لاپلاسین
eigenvalues, eigenvectors = np.linalg.eigh(L) # ترتیب صعودی
eigenvalues[1] # مقدار فیدلر
fiedler = eigenvectors[:, 1] # بردار فیدلر
group_a = np.where(fiedler >= 0)[0] # یک خوشه
group_b = np.where(fiedler < 0)[0] # خوشهی دیگر
G = nx.karate_club_graph() # 34 گره، 78 یال
nx.number_connected_components(G)
nx.pagerank(G) # اهمیت گره
متن به گراف دانش
گامبهگام- NERاشارههای به موجودیت را در متن بیابید.
- مرجعگزینی (Coref)ارجاع «او» را قبل از RE به موجودیت درست حل کنید.
- پیوند موجودیتنگاشت هر اشاره به شناسهی پایگاه دانش یکتا.
- استخراج روابطاستخراج سهگانههای (فاعل، رابطه، مفعول) همراه با اسپنها.
- اعتبارسنجیتطبیق هر جزء سهگانه با متن مبدأ. سهگانههای پشتیبانینشده را رد کنید.
- نگاشت به هستیشناسینگاشت روابط به شناسههای استاندارد، مثلاً
P108برای کارفرما. - بارگذاری در گرافذخیرهی هر سهگانه با شناسه سند و char-span آن.
پیوند یک اشاره
گامبهگام- نمایهی نامهای مستعارجستجوی اشاره با حروف کوچک. نمایهی معمولی 10 تا 30 کاندید ارائه میدهد.
- نبود کاندیدتابع
disambiguateخروجیNone, 0.0میدهد. - امتیاز بافتهمپوشانی ژاکارد توکنهای بافت و توکنهای توضیحات.
- پیشینامتیاز به صورت
jac + 0.1 * priorازPRIORSمحاسبه میشود. - گزینهی امبدینگاسپن را با تگهای [MENTION] مشخص کنید. بیشترین کسینوس را برگزینید.
- NILهیچ ورودی پایگاه دانش تطبیق ندارد. یک آستانه روی بالاترین امتیاز بگذارید.
- ادغامنگهداشتن یک شناسهی پایگاه دانش برای هر خوشهی مرجعگزینی.
استخراج، اعتبارسنجی، ساخت
کدpython
def verify(triples, text):
verified = []
for t in triples:
s, e = t["span"]
if text[s:e] != t["evidence"]: # اسپن باید با متن مبدأ مطابقت داشته باشد
continue
verified.append(t)
return verified
triples = extract(doc) # الگوهای رجکس PATTERNS، هر کدام یک شناسهی P
graph = build_graph(verify(triples, doc)) # فاعل به رابطه، مفعول
for rel, obj, ev in graph.get("Tim Cook", []): # متغیر ev جملهی مبدأ است
if rel == "P169": # مدیرعاملِ
حافظهی ترکیبی: Mem0
معماریتنظیمات Mem0Config و مقادیر پیشفرض
پیشفرضها| تنظیم | پیشفرض | نکته |
|---|---|---|
w_relevance | 0.6 | برای ایجنتهای بازیابی افزایش دهید |
w_importance | 0.2 | برای ایجنتهای انطباق افزایش دهید |
w_recency | 0.2 | برای ایجنتهای چت افزایش دهید |
recency_halflife_s | 86400.0 | تازگی در هر نیمهعمر نصف میشود |
importance | 0.5 | روی هر رکورد در زمان افزودن تنظیم کنید |
scope | user | یا نشست یا ایجنت |
top_k | 5 | جستجوی برداری ابتدا 3 برابر دادهی بیشتر بیرون میکشد |
KV hit relevance | 0.4 | ارتباط ثابت برای رکوردهای فقط-KV |
خرابیها و راهکارها
عیبیابیموجودیت پرتکرار همیشه برنده است
- علت
- سوگیری محبوبیت
- راهحل
- فاینتیون روی دادههای دامنه
موجودیت صحیح هرگز امتیاز نمیگیرد
- علت
- بازخوانی پایین کاندیدها
- راهحل
- ابتدا بازخوانی اشارهها @ 30 را بسنجید
موجودیت اشتباه برای یک نام جدید
- علت
- اشاره در پایگاه دانش موجود نیست
- راهحل
- پیشبینی NIL
«او اپل را تأسیس کرد» از دست رفت
- علت
- عدم اجرای مرجعگزینی قبل از RE
- راهحل
- ابتدا مرجعگزینی (coref) را اجرا کنید
سهگانههایی که در متن پشتیبانی نمیشوند
- علت
- توهم LLM
- راهحل
- اعتبارسنجی تکتک اسپنها در برابر متن مبدأ
امکان کوئری زدن به گراف وجود ندارد
- علت
- دریفت روابط استخراج باز اطلاعات
- راهحل
- تجمیع و نگاشت به شناسههای استاندارد
افت بازخوانی برداری
- علت
- انحراف امبدینگ همگام با رشد پیکره متنی
- راهحل
- محاسبهی مجدد امبدینگ رکوردهای N-تای پرکاربرد
50 یال در هر پیام
- علت
- اکسترکتور پر سر و صدا
- راهحل
- محدود کردن نوشتنهای گراف در هر فراخوانی
add
مخففها
اصطلاحها- BFS / DFS
- جستجوی سطح اول با صف، عمق اول با پشته. هر دو $O(V + E)$.
- GCN
- شبکهی پیچشی گراف. انتقال پیام با نرمالسازی متقارن.
- EL
- پیوند موجودیت. نگاشت یک اشاره به یک ورودی یکتای پایگاه دانش.
- KB
- پایگاه دانش. ویکیداده، ویکیپدیا، DBpedia یا پایگاه دانش دامنه.
- NIL
- پیشبینی اینکه هیچ ورودی پایگاه دانشی تطابق ندارد.
- RE
- استخراج روابط. تبدیل متن به سهگانههای (فاعل، رابطه، مفعول).
- AEVS
- روش نیلکوبی-استخراج-اعتبارسنجی-تکمیل. استخراج با اسپن تأییدشده.
- Open IE
- استخراج باز اطلاعات؛ هر عبارت فعلی یک رابطه است. بازخوانی بالا، دقت پایین.
- Mem0g
- یالهای تایپشده با اعتبار زمانی برای کوئریهای روابط.
پرسشها
پرسش و پاسخ- چرا BFS برای فاصلهی گام پرش؟
- سطح BFS یک گره، کوتاهترین مسیر آن در گراف بدون وزن است.
- بردار فیدلر چگونه افراز میکند؟
- درایههای مثبت به یک خوشه میروند. درایههای منفی به خوشهی دیگر.
- تعداد K دور انتقال پیام چه چیزی را میبیند؟
- همسایگی در فاصلهی K-گام پرش از هر گره.
- چرا دو رقم برای EL گزارش میشود؟
- ابهامزدایی 99% روی بازخوانی کاندید 80%، در عمل یک پایپلاین 80% است.
- چرا یک یال نامعتبر علامتگذاری میشود؟
- کوئریهای زمانی زیرگراف معتبر-در-زمان را پیمایش میکنند.
- چرا سه مخزن حافظه؟
- یک مخزن برای دو دسته از سه دستهی کوئری ناکارآمد است.
نکات
نکتهها- در محیط عملیاتی از networkx استفاده کنید. از کد صفر برای یادگیری عملکرد آن بهره ببرید.
- به هر سهگانه یک char-span مبدأ و یک شناسه سند اختصاص دهید.
- قبل از merge، روابط استخراج باز اطلاعات را روی یک هستیشناسی بسته نگاشت کنید.
- بین 60 تا 80 درصد کار مهندسی را به استانداردسازی اختصاص دهید.
- برای روابط محدود به زمان، زمان شروع
P580و زمان پایانP582را اضافه کنید. - صحت درون پایگاه دانش (
P@1) و نرخ تشخیص NIL را روی AIDA-CoNLL گزارش دهید. - برای هر بار نوشتن حافظه یک دامنه برگزینید: کاربر، نشست، یا ایجنت.