GraphRAG - Khi Vector DB "bó tay" trước câu hỏi khó

AI Hunter

Member
Chúng ta đã đi cùng nhau một chặng đường dài. Hệ thống RAG (Retrieval Augmented Generation) của anh em hiện tại đang chạy bằng Vector Database (ChromaDB/Qdrant).

Nó hoạt động rất tốt với câu hỏi: "Ai là tác giả cuốn sách X?" (Tìm kiếm tương đồng).
Nhưng nó sẽ "ngáo" ngay lập tức với câu hỏi: "Mối quan hệ giữa ông tác giả cuốn sách X và bê bối tài chính năm 2024 có ảnh hưởng gì đến giá cổ phiếu công ty Y không?"

Tại sao? Vì Vector DB lưu trữ thông tin dưới dạng các điểm rời rạc trong không gian. Nó không hiểu Mối Quan Hệ (Relationships) giữa các điểm đó.

Hôm nay, chúng ta sẽ đến với "trùm cuối" của RAG hiện tại: GraphRAG - Kết hợp đồ thị tri thức (Knowledge Graph) để AI biết tư duy logic như thám tử Sherlock Holmes.

GraphRAG - Khi Vector DB bó tay trước câu hỏi khó.jpg

1. Vấn đề: Vector Search bị "cận thị"​


Hãy tưởng tượng bạn có 2 đoạn văn bản nằm ở 2 file khác nhau:
1. "Steve Jobs sáng lập ra Apple."
2. "Apple vừa ra mắt iPhone 16."

Nếu user hỏi: "Sản phẩm mới nhất của công ty do Steve Jobs sáng lập là gì?"

Vector Search thông thường rất dễ tạch vì từ khóa "Steve Jobs" và "iPhone 16" nằm quá xa nhau, không có sự tương đồng về ngữ nghĩa trực tiếp trong một chunk. Đây gọi là bài toán Multi-hop Reasoning (Suy luận đa bước).

2. Giải pháp: Knowledge Graph (Đồ thị tri thức)​


Thay vì lưu văn bản thô, chúng ta sẽ trích xuất ra các Thực thể (Entities)Mối quan hệ (Relationships):

Mã:
(Steve Jobs) --[SÁNG_LẬP]--> (Apple) --[RA_MẮT]--> (iPhone 16)

Khi nhìn vào đồ thị này, AI có thể đi từ nút
Mã:
Steve Jobs
, lần theo các cạnh để tìm ra
Mã:
iPhone 16
một cách dễ dàng.

3. Triển khai: Từ lý thuyết đến Code​


Để làm được trò này, chúng ta cần 2 thứ:
  1. Database: Neo4j (Ông trùm trong làng Graph DB).
  2. Extraction: Dùng LLM + Pydantic (Kiến thức bài 11) để bóc tách dữ liệu.

Bước 1: Dựng Neo4j bằng Docker​


Anh em chạy lệnh này để kéo Neo4j về:

[CODE lang="bash"]
docker run -d \
--name neo4j \
-p 7474:7474 -p 7687:7687 \
-e NEO4J_AUTH=neo4j/password123 \
neo4j:latest
[/CODE]

Truy cập http://localhost:7474 để xem giao diện quản trị.

Bước 2: Trích xuất Triples (Bộ ba) bằng Pydantic​


Đây là lúc kiến thức bài trước tỏa sáng. Chúng ta cần ép AI trả về dữ liệu dạng:
Mã:
Source Node -> Relationship -> Target Node

[CODE lang="python"]
from pydantic import BaseModel, Field
from typing import List
import instructor
from openai import OpenAI

# 1. Định nghĩa cấu trúc Node và Edge
class Node(BaseModel):
id: str
type: str # Person, Company, Product...

class Edge(BaseModel):
source: str
target: str
relation: str # FOUNDED, CREATED, WORKS_FOR...

class KnowledgeGraph(BaseModel):
nodes: List[Node]
edges: List[Edge]

# 2. Setup Client (như bài trước)
client = instructor.from_client(OpenAI(api_key="sk-proj-xxxx"))

text = "Steve Jobs sáng lập Apple vào năm 1976. Năm 2024, Apple ra mắt iPhone 16 với tính năng AI."

# 3. Bóc tách dữ liệu
kg = client.chat.completions.create(
model="gpt-4o",
response_model=KnowledgeGraph,
messages=[
{"role": "user", "content": f"Extract knowledge graph from: {text}"},
],
)

# Kết quả sẽ là danh sách các nodes và edges chuẩn chỉnh!
print(kg.model_dump_json(indent=2))
[/CODE]

Bước 3: Đẩy vào Neo4j​


Sau khi đã có List Nodes và Edges, chúng ta dùng thư viện
Mã:
neo4j
của Python để đẩy vào DB.

[CODE lang="python"]
from neo4j import GraphDatabase

driver = GraphDatabase.driver("bolt://localhost:7687", auth=("neo4j", "password123"))

def add_graph(tx, nodes, edges):
# Tạo Nodes
for node in nodes:
tx.run("MERGE (n:Entity {id: $id, type: $type})", id=node.id, type=node.type)

# Tạo Edges (Quan hệ)
for edge in edges:
query = """
MATCH (a:Entity {id: $source}), (b:Entity {id: $target})
MERGE (a)-[r:RELATION {type: $relation}]->(b)
"""
tx.run(query, source=edge.source, target=edge.target, relation=edge.relation)

with driver.session() as session:
session.execute_write(add_graph, kg.nodes, kg.edges)
print("Đã xây dựng xong đồ thị tri thức! 🚀")
[/CODE]

4. Vậy GraphRAG hoạt động thế nào khi Chat?​


Quy trình xử lý (Pipeline) sẽ nâng cấp như sau:

  1. User hỏi: "Sản phẩm mới của công ty Steve Jobs?"
  2. Entity Extraction: AI trích xuất từ khóa trong câu hỏi: "Steve Jobs".
  3. Graph Query: Hệ thống tìm node "Steve Jobs" trong Neo4j, sau đó lấy tất cả các node hàng xóm (Neighbor nodes) liên quan trong vòng 2 bước nhảy (2-hop).
    Kết quả tìm thấy: Apple, iPhone 16, Năm 1976...
  4. Context Construction: Gom toàn bộ thông tin từ Graph + thông tin từ Vector DB (Hybrid Search).
  5. Answer: LLM tổng hợp và trả lời chính xác 100%.

Tổng kết​


GraphRAG không dành cho tay mơ. Nó tốn kém tài nguyên hơn (phải chạy thêm Neo4j), tốn token hơn (phải trích xuất entities). Nhưng đổi lại, nó mang lại khả năng "hiểu biết sâu" (Deep Understanding) mà RAG truyền thống không thể chạm tới.

Nếu bạn đang xây dựng AI cho Y tế (Thuốc A kỵ Thuốc B), Pháp luật (Luật A liên quan Nghị định B), hoặc Tài chính (Công ty mẹ sở hữu công ty con), thì GraphRAG là bắt buộc.
 
Back
Top