چیت‌شیت

گراف‌ها و گراف‌های دانش

Graphs and Knowledge Graphs

ماتریس‌های گراف، لاپلاسین و انتقال پیام، پیوند موجودیت‌ها، استخراج روابط و حافظه‌ی ترکیبی گراف.

  • ۱۲ بخش
  • ۴ درس مرتبط
  • کد و دستورها عیناً از دوره‌ی اصلی
فهرست مطالب
  1. ماتریس‌های گراف
  2. وظایف گراف در کد
  3. افراز طیفی با numpy
  4. متن به گراف دانش
  5. پیوند یک اشاره
  6. استخراج، اعتبارسنجی، ساخت
  7. حافظه‌ی ترکیبی: Mem0
  8. تنظیمات Mem0Config و مقادیر پیش‌فرض
  9. خرابی‌ها و راهکارها
  10. مخفف‌ها
  11. پرسش‌ها
  12. نکات

ماتریس‌های گراف

مفهوم‌ها
ماتریس مجاورت
مقدار $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)
یک دور GNNmessage_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)                                 # اهمیت گره

متن به گراف دانش

گام‌به‌گام
  1. NERاشاره‌های به موجودیت را در متن بیابید.
  2. مرجع‌گزینی (Coref)ارجاع «او» را قبل از RE به موجودیت درست حل کنید.
  3. پیوند موجودیتنگاشت هر اشاره به شناسه‌ی پایگاه دانش یکتا.
  4. استخراج روابطاستخراج سه‌گانه‌های (فاعل، رابطه، مفعول) همراه با اسپن‌ها.
  5. اعتبارسنجیتطبیق هر جزء سه‌گانه با متن مبدأ. سه‌گانه‌های پشتیبانی‌نشده را رد کنید.
  6. نگاشت به هستی‌شناسینگاشت روابط به شناسه‌های استاندارد، مثلاً P108 برای کارفرما.
  7. بارگذاری در گرافذخیره‌ی هر سه‌گانه با شناسه سند و char-span آن.

پیوند یک اشاره

گام‌به‌گام
  1. نمایه‌ی نام‌های مستعارجستجوی اشاره با حروف کوچک. نمایه‌ی معمولی 10 تا 30 کاندید ارائه می‌دهد.
  2. نبود کاندیدتابع disambiguate خروجی None, 0.0 می‌دهد.
  3. امتیاز بافتهمپوشانی ژاکارد توکن‌های بافت و توکن‌های توضیحات.
  4. پیشینامتیاز به صورت jac + 0.1 * prior از PRIORS محاسبه می‌شود.
  5. گزینه‌ی امبدینگاسپن را با تگ‌های [MENTION] مشخص کنید. بیشترین کسینوس را برگزینید.
  6. NILهیچ ورودی پایگاه دانش تطبیق ندارد. یک آستانه روی بالاترین امتیاز بگذارید.
  7. ادغامنگه‌داشتن یک شناسه‌ی پایگاه دانش برای هر خوشه‌ی مرجع‌گزینی.

استخراج، اعتبارسنجی، ساخت

کد
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

معماری
کسینوستطابق دقیقزیرگرافadd()text, user_id, metadataVectorStoreمشابهت معناییKVStoreuser_id, fact_type, entityGraphStoreیال‌های تایپ‌شده، پرچم معتبر بودنامتیاز ترکیب (Fusion score)مرتبط بودن، اهمیت، تازگیsearch()مواردی fused top_k

تنظیمات Mem0Config و مقادیر پیش‌فرض

پیش‌فرض‌ها
تنظیمپیش‌فرضنکته
w_relevance0.6برای ایجنت‌های بازیابی افزایش دهید
w_importance0.2برای ایجنت‌های انطباق افزایش دهید
w_recency0.2برای ایجنت‌های چت افزایش دهید
recency_halflife_s86400.0تازگی در هر نیمه‌عمر نصف می‌شود
importance0.5روی هر رکورد در زمان افزودن تنظیم کنید
scopeuserیا نشست یا ایجنت
top_k5جستجوی برداری ابتدا 3 برابر داده‌ی بیشتر بیرون می‌کشد
KV hit relevance0.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 گزارش دهید.
  • برای هر بار نوشتن حافظه یک دامنه برگزینید: کاربر، نشست، یا ایجنت.