Cấu trúc Dữ liệu: AI Assistant
Tài liệu này chi tiết về cấu trúc cơ sở dữ liệu cho module AI Assistant, bao gồm hỗ trợ cho pgvector.
1. Tổng quan
Module AI Assistant sử dụng cơ sở dữ liệu PostgreSQL với tiện ích mở rộng pgvector. Nó tuân theo cấu trúc đa thuê bao nơi tất cả nội dung cơ sở tri thức, các vector và lịch sử trò chuyện được cô lập bởi orgId.
Mô hình Tên miền Cốt lõi
2. Định nghĩa các Bảng
kb_sources
Sổ đăng ký chính cho các tệp và liên kết được thêm vào cơ sở tri thức.
| Trường | Kiểu | Mô tả |
|---|---|---|
id | uuid | PK. |
org_id | uuid | Phạm vi tổ chức. |
name | text | Tên hiển thị của nguồn. |
type | enum | drive, document, url. |
status | enum | indexing, synced, error. |
external_id | text | ID trong hệ thống đích (ví dụ: Drive File ID). |
kb_chunks
Các đoạn văn bản riêng lẻ kèm theo vector nhúng.
| Trường | Kiểu | Mô tả |
|---|---|---|
id | uuid | PK. |
source_id | uuid | FK đến kb_sources.id. |
content | text | Đoạn văn bản thô. |
embedding | vector(1536) | Embedding tương thích OpenAI. |
chunk_index | integer | Thứ tự sắp xếp trong nguồn. |
chat_sessions
Các luồng trò chuyện bền vững của người dùng.
| Trường | Kiểu | Mô tả |
|---|---|---|
id | uuid | PK. |
org_id | uuid | Phạm vi tổ chức. |
user_id | uuid | Chủ sở hữu phiên làm việc. |
title | text | Tiêu đề tự động tạo cho cuộc trò chuyện. |
chat_messages
Các trao đổi riêng lẻ trong một phiên làm việc.
| Trường | Kiểu | Mô tả |
|---|---|---|
id | uuid | PK. |
session_id | uuid | FK đến chat_sessions.id. |
role | enum | user, assistant. |
content | text | Nội dung tin nhắn (Markdown). |
citations | jsonb | Mảng các { sourceId, excerpt, score }. |
3. Đánh chỉ mục Tìm kiếm Vector
Bảng kb_chunks sử dụng chỉ mục IVFFlat hoặc HNSW để tối ưu hóa các tìm kiếm độ tương đồng cosine.
-- Ví dụ tạo chỉ mục
CREATE INDEX ON kb_chunks
USING ivfflat (embedding vector_cosine_ops)
WITH (lists = 100);Ví dụ Truy vấn Truy xuất
SELECT content, source_id, 1 - (embedding <=> :query_vector) AS score
FROM kb_chunks
WHERE org_id = :org_id
ORDER BY embedding <=> :query_vector
LIMIT 5;4. Cô lập Đa thuê bao
Tất cả các truy vấn PHẢI lọc theo org_id. Điều này được thực thi tại lớp dịch vụ bằng cách trích xuất organizationId từ Platform JWT.
// Thực thi Cô lập
const relevantChunks = await db.select()
.from(kbChunks)
.where(and(
eq(kbChunks.orgId, orgId),
cosineDistance(kbChunks.embedding, queryVector).lt(0.2)
))
.limit(5);