Xây dựng GraphRAG với LangChain và Neo4j: Khi AI cần hiểu sâu quan hệ dữ liệu

Artificial Intelligence tutorial - IT technology blog
Artificial Intelligence tutorial - IT technology blog

Vấn đề của RAG truyền thống: Khi Vector thôi là chưa đủ

Nếu từng làm ứng dụng RAG (Retrieval-Augmented Generation), bạn chắc hẳn đã quen với quy trình: Chuyển dữ liệu thành Vector, đẩy vào Vector Database, rồi tìm kiếm theo độ tương đồng (semantic search). Cách này hoạt động rất tốt cho các câu hỏi tra cứu thông tin đơn lẻ. Tuy nhiên, khi đưa dự án vào thực tế, các yêu cầu phức tạp hơn sẽ bắt đầu làm khó hệ thống của bạn.

Hãy tưởng tượng bạn nạp 10.000 hồ sơ nhân sự và hàng trăm dự án của công ty vào hệ thống RAG. Với câu hỏi “Ai quản lý dự án A?”, AI trả lời rất nhanh. Nhưng nếu hỏi: “Liệt kê 5 kỹ sư Python từng làm việc với quản lý dự án A trong 2 năm qua?”, hệ thống thường sẽ bắt đầu trả lời sai lệch. Nguyên nhân là vì Vector Database chỉ tìm các đoạn văn bản có ý nghĩa gần giống nhau. Nó không thể hiểu được mạng lưới quan hệ chằng chịt giữa Nhân viên – Kỹ năng – Thời gian – Dự án.

RAG truyền thống đang bỏ qua cấu trúc logic của dữ liệu. Nó coi mọi thông tin là những mẩu văn bản rời rạc trôi nổi trong không gian đa chiều. Để giải quyết triệt để, chúng ta cần Knowledge Graph (Đồ thị tri thức) để kết nối các điểm dữ liệu này lại với nhau.

Khái niệm cốt lõi: Knowledge Graph và bước tiến GraphRAG

Knowledge Graph không lưu dữ liệu dưới dạng danh sách hay bảng biểu phẳng. Nó tổ chức thông tin theo các Node (thực thể) và Relationship (mối quan hệ). Ví dụ: Node “Nguyễn Văn A” kết nối với Node “Dự án AI” thông qua quan hệ “LÀ_QUẢN_LÝ”.

GraphRAG là sự giao thoa giữa cấu trúc chặt chẽ của Đồ thị tri thức và khả năng ngôn ngữ của LLM. Thay vì chỉ quét các đoạn văn bản tương đồng, hệ thống sẽ truy vấn trực tiếp các đường đi (path) trên đồ thị. Điều này giúp lấy ra thông tin có tính logic cao và chính xác hơn hẳn.

Thực tế triển khai cho thấy, GraphRAG giúp giảm tới 70-80% hiện tượng “ảo giác” (hallucination) ở AI đối với dữ liệu doanh nghiệp. Mọi thông tin AI trả về đều dựa trên các mối quan hệ thực tế đã được định nghĩa sẵn, thay vì tự suy diễn dựa trên xác suất từ ngữ.

Sự khác biệt thực tế giữa Vector RAG và GraphRAG:

  • Vector RAG: Giỏi tìm kiếm theo ý định, nhưng yếu khi phải truy xuất các mối quan hệ đa tầng (multi-hop).
  • GraphRAG: Mạnh về logic và thực thể, có khả năng kết nối các dữ liệu nằm xa nhau trong bộ nhớ nhưng có liên quan về mặt quản lý hoặc nghiệp vụ.

Thực hành chi tiết: Tích hợp Knowledge Graph với LangChain

Chúng ta sẽ sử dụng Neo4j – cơ sở dữ liệu đồ thị phổ biến nhất và LangChain để điều phối luồng xử lý.

1. Chuẩn bị môi trường

Cài đặt các thư viện Python cần thiết. Bạn nên dùng Python 3.9 trở lên để đảm bảo tính tương thích.

pip install langchain langchain-community langchain-openai neo4j python-dotenv

Cách nhanh nhất để có Neo4j là dùng Docker để khởi tạo môi trường local trong vài giây:

docker run --name neo4j -p 7474:7474 -p 7687:7687 -d -e NEO4J_AUTH=neo4j/password neo4j:latest

2. Kết nối LangChain với Neo4j

Sử dụng đối tượng Neo4jGraph để tạo cầu nối. Đây là nơi LangChain sẽ gửi các câu lệnh truy vấn xuống cơ sở dữ liệu.

import os
from langchain_community.graphs import Neo4jGraph

os.environ["NEO4J_URI"] = "bolt://localhost:7687"
os.environ["NEO4J_USERNAME"] = "neo4j"
os.environ["NEO4J_PASSWORD"] = "password"

graph = Neo4jGraph()

3. Xây dựng dữ liệu mẫu

Hãy giả lập một kịch bản quản lý dự án bằng ngôn ngữ Cypher. Đây là nền tảng để AI thực hiện các bước suy luận sau này:

graph.query("""
MERGE (p1:Person {name: "Alice"})
MERGE (p2:Person {name: "Bob"})
MERGE (p3:Person {name: "Charlie"})
MERGE (s1:Skill {name: "Python"})
MERGE (s2:Skill {name: "React"})
MERGE (proj:Project {name: "AI Platform"})

MERGE (p1)-[:HAS_SKILL]->(s1)
MERGE (p2)-[:HAS_SKILL]->(s1)
MERGE (p3)-[:HAS_SKILL]->(s2)
MERGE (p1)-[:MANAGES]->(proj)
MERGE (p2)-[:WORKS_ON]->(proj)
MERGE (p3)-[:WORKS_ON]->(proj)
""")

4. Triển khai GraphCypherQAChain

Sức mạnh của LangChain nằm ở GraphCypherQAChain. Thành phần này tự động dịch câu hỏi tiếng Việt của người dùng thành câu lệnh Cypher chuẩn xác.

from langchain_openai import ChatOpenAI
from langchain.chains import GraphCypherQAChain

llm = ChatOpenAI(model="gpt-4o", temperature=0)

chain = GraphCypherQAChain.from_llm(
    llm=llm, 
    graph=graph, 
    verbose=True,
    allow_dangerous_requests=True 
)

response = chain.invoke({"query": "Ai quản lý dự án AI Platform và họ giỏi ngôn ngữ gì?"})
print(response["result"])

Khi thực thi, hệ thống sẽ tự động thực hiện 4 bước ngầm:

  1. LLM bóc tách các thực thể quan trọng như “Alice” và “AI Platform”.
  2. Nó tự viết mã Cypher để tìm quan hệ MANAGESHAS_SKILL.
  3. Truy vấn trực tiếp vào Neo4j để lấy dữ liệu thô.
  4. LLM tổng hợp lại thành câu trả lời tự nhiên: “Người quản lý là Alice, và cô ấy có kỹ năng Python.”

Tại sao phương pháp này hiệu quả?

Tính minh bạch là ưu điểm lớn nhất. Với RAG thông thường, bạn phải tinh chỉnh các tham số như top_k hay threshold rất cảm tính. Với GraphRAG, logic được cố định bằng các sợi dây quan hệ. Nếu đồ thị xác nhận Alice là quản lý, AI không bao giờ nhầm sang Bob.

Ngoài ra, bạn có thể kết hợp cả hai: dùng Vector search để tìm các điểm bắt đầu, sau đó dùng Knowledge Graph để mở rộng tìm kiếm. Phương pháp lai (Hybrid Search) này đang trở thành tiêu chuẩn cho các hệ thống AI doanh nghiệp hiện nay.

Kết luận

Xây dựng GraphRAG không hề khó nếu bạn đã quen với hệ sinh thái LangChain. Thay vì cố gắng cải thiện độ chính xác bằng cách tăng kích thước Vector Embedding, việc cấu trúc lại dữ liệu theo dạng đồ thị thường mang lại kết quả đột phá hơn nhiều.

Nếu dự án của bạn yêu cầu sự chính xác tuyệt đối về mặt logic quan hệ, hãy thử tích hợp Neo4j ngay. Chúc bạn ứng dụng thành công vào sản phẩm của mình.

Share: