TiDB 向量搜尋實戰:2026年用 TiDB 建構 AI 應用完全指南

分布式数据库

2026年,為什麼 TiDB 向量搜尋是 AI 應用的遊戲規則改變者

傳統 AI 應用架構有一個痛點:你需要一個關聯式資料庫存業務資料,還需要一個向量資料庫存 Embedding。兩套資料庫意味著資料同步、一致性維護、運維成本翻倍。

TiDB 8.0+ 引入的向量搜尋功能徹底改變了這個局面——一個資料庫同時支援 SQL 和向量搜尋。你可以在同一個查詢中同時做關聯式過濾和語意檢索,這就是 HTAP + Vector 的威力。

特性 TiDB Vector Milvus Pinecone Weaviate
SQL 支援 原生 GraphQL
向量搜尋 原生 原生 原生 原生
交易支援 ACID 有限 有限
HTAP
部署方式 自託管/雲 自託管/雲 僅雲 自託管/雲
混合查詢 SQL+Vector 標量過濾 元資料過濾 GraphQL過濾
水平擴展 自動 手動 自動 手動
維度上限 16384 32768 2048 65535
索引類型 HNSW IVF/HNSW 自動 HNSW
開源

TiDB 8.0+ 向量索引設定

pip install tidb-vector sqlalchemy pymysql
from sqlalchemy import create_engine, Column, Integer, String, Text
from sqlalchemy.orm import declarative_base, Session
from tidb_vector.sqlalchemy import VectorType

Base = declarative_base()

class Document(Base):
    __tablename__ = "documents"
    id = Column(Integer, primary_key=True)
    content = Column(Text)
    category = Column(String(50))
    source = Column(String(100))
    embedding = Column(VectorType(1536))

engine = create_engine("mysql+pymysql://root:@localhost:4000/testdb", echo=True)
Base.metadata.create_all(engine)
CREATE VECTOR INDEX idx_doc_embedding ON documents(embedding)
WITH METRIC = 'cosine', DIMENSION = 1536;

完整 Python 實作:插入、搜尋、混合查詢

import openai
from tidb_vector.sqlalchemy import vec_cosine_distance

client = openai.OpenAI(api_key="sk-xxx")

def get_embedding(text: str) -> list[float]:
    response = client.embeddings.create(model="text-embedding-3-small", input=text)
    return response.data[0].embedding

def vector_search(session, query: str, top_k: int = 10):
    query_embedding = get_embedding(query)
    results = session.query(
        Document.id, Document.content, Document.category,
        vec_cosine_distance(Document.embedding, query_embedding).label("distance")
    ).order_by("distance").limit(top_k).all()
    return results

def hybrid_search(session, query: str, category: str = None, top_k: int = 10):
    query_embedding = get_embedding(query)
    q = session.query(
        Document.id, Document.content, Document.category,
        vec_cosine_distance(Document.embedding, query_embedding).label("distance")
    )
    if category:
        q = q.filter(Document.category == category)
    return q.order_by("distance").limit(top_k).all()

RAG 應用:用 TiDB 建構檢索增強生成

class TiDBRAG:
    def __init__(self, engine, openai_api_key: str):
        self.engine = engine
        self.llm_client = openai.OpenAI(api_key=openai_api_key)

    def retrieve(self, query: str, top_k: int = 5):
        with Session(self.engine) as session:
            return vector_search(session, query, top_k)

    def generate(self, query: str, context: list) -> str:
        context_text = "\n".join([f"[{c.category}] {c.content}" for c in context])
        response = self.llm_client.chat.completions.create(
            model="gpt-4o",
            messages=[{"role": "user", "content": f"參考資料:\n{context_text}\n\n問題:{query}"}],
            temperature=0.1
        )
        return response.choices[0].message.content

    def query(self, question: str) -> str:
        context = self.retrieve(question)
        return self.generate(question, context)

5 個常見陷阱

1. 向量維度不匹配

Embedding 模型輸出的維度必須與表定義的維度一致。

2. 忽略索引建立

沒有向量索引時,搜尋退化為全表掃描。

3. 批量插入未最佳化

逐條插入效率極低,應使用批量操作。

4. 距離度量不一致

插入時和查詢時必須使用相同的距離度量。

5. 連線池未設定

高併發下,預設連線池會導致連線耗盡。


10 個錯誤排查

# 錯誤現象 可能原因 排查方法
1 維度不匹配錯誤 Embedding維度與表定義不一致 檢查模型輸出維度和VectorType參數
2 搜尋結果為空 向量索引未建立 SHOW INDEX FROM documents
3 搜尋效能極慢 缺少向量索引 檢查HNSW索引是否存在
4 連線逾時 連線池耗盡 調整pool_size和max_overflow
5 距離計算異常 度量不一致 確認索引和查詢使用同一度量
6 記憶體溢位 批量插入資料量過大 分批插入
7 精度不夠 ef_search太小 增大ef_search值
8 插入失敗 向量包含NaN/Inf 插入前檢查embedding有效性
9 混合查詢慢 關聯式過濾未走索引 為過濾列建立B-Tree索引
10 結果排序錯誤 距離和相似度混淆 cosine距離越小越相似

效能調校建議

CREATE VECTOR INDEX idx_doc_embedding ON documents(embedding)
WITH METRIC = 'cosine', DIMENSION = 1536,
     EF_CONSTRUCTION = 256, M = 16;

SET SESSION tidb_vector_ef_search = 128;

線上工具推薦


總結:TiDB 向量搜尋將 SQL 和向量檢索統一在一個資料庫中,是 2026 年建構 AI 應用的最佳選擇之一。它消除了關聯式資料庫和向量資料庫之間的資料同步痛點,支援 ACID 交易 + 語意檢索的混合查詢。

本站提供瀏覽器本地工具,免註冊即可試用 →

#TiDB#向量搜索#向量数据库#语义检索#HTAP#RAG#AI应用#Python