首页
学习
活动
专区
圈层
工具
发布
社区首页 >专栏 >大模型应用必备 SQL:2 小时学会「仅需用的」最小语法子集

大模型应用必备 SQL:2 小时学会「仅需用的」最小语法子集

作者头像
玄同765
发布2026-01-14 13:06:29
发布2026-01-14 13:06:29
250
举报
前置文章:《大模型应用为什么离不开 SQL?向量库替代不了的 3 个核心场景》

一、写在前面:为什么只讲「最小语法子集」?

大模型开发者不需要成为 SQL 专家 —— 我们只需要掌握「能满足大模型 3 类核心场景(上下文回溯 / 混合检索 / 合规审计)」的 15% 语法,就能覆盖 95% 的生产需求。

本文完全基于大模型应用的真实业务裁剪语法:

  • 跳过「存储过程 / 触发器 / 窗口函数」等 90% 大模型场景用不上的复杂特性;
  • 仅保留「表设计 + 核心查询 + 索引优化 + 权限控制」4 模块,2 小时即可直接上手写生产代码。

二、模块 1:大模型应用必用表设计(仅 2 种表结构)

大模型应用的存储需求 99% 可通过 「对话历史表 + RAG 文档表」覆盖,无需复杂设计。

语法 1:CREATE TABLE(创建表)
代码语言:javascript
复制
-- 【必用1】对话历史表(仅保留业务必填字段,大模型场景无需冗余字段)
CREATE TABLE llm_chat_history (
    id SERIAL PRIMARY KEY,       -- 自增ID:PG 10+ 推荐用「GENERATED ALWAYS AS IDENTITY PRIMARY KEY」(更符合SQL标准)
    user_id VARCHAR(64) NOT NULL,-- 用户标识(建议用UUID,避免重复)
    prompt TEXT NOT NULL,        -- 用户提问(用TEXT存长文本,VARCHAR有长度限制)
    answer TEXT NOT NULL,        -- 大模型回答
    model_name VARCHAR(50) NOT NULL, -- 调用模型(如gpt-3.5-turbo/llama3-8b)
    create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW()  -- UTC时间(分布式场景必用,避免时区偏移)
);

-- 【必用2】RAG文档表(pgvector 0.5.0+ 版本,含向量字段 | 需先安装pgvector插件)
CREATE EXTENSION IF NOT EXISTS vector; -- 自动安装pgvector(PG 11+ 支持)
CREATE TABLE rag_documents (
    id SERIAL PRIMARY KEY,
    doc_title VARCHAR(255) NOT NULL,  -- 文档标题
    doc_content TEXT NOT NULL,        -- 文档内容(分片后存储,单条≤1000字,提升检索效率)
    doc_meta JSONB,                   -- 动态元数据(如{"type":"技术文档","year":"2024"},PG10+ 原生支持高效查询)
    embedding VECTOR(1536) NOT NULL   -- 向量维度:适配OpenAI/智谱等主流模型,其他模型需同步修改维度
);

核心注意点

  • 大模型长文本必须用TEXT,禁用VARCHAR(有长度限制);
  • 动态元数据用JSONB(支持索引与嵌套查询,比 TEXT 高效 10 倍);
  • 时间字段强制用TIMESTAMP WITH TIME ZONE(统一 UTC 时区)。

三、模块 2:大模型核心查询语法(仅 3 种 SQL)

大模型应用的查询需求 95% 可通过 「上下文加载 + 混合检索 + 合规审计」覆盖。

语法 1:上下文加载(对话系统必用)
代码语言:javascript
复制
-- 【业务:加载当前用户最近5条对话,拼接为大模型上下文】
SELECT prompt, answer  -- 仅查询需要的字段,减少网络传输
FROM llm_chat_history 
WHERE user_id = 'user_001-72d3-4f90-960e-8422c64663aa'  -- 用户UUID过滤
ORDER BY create_time DESC   -- 按时间倒序(最新对话在前)
LIMIT 5;                    -- 限制条数(适配大模型上下文窗口上限)
语法 2:RAG 混合检索(pgvector 0.5.0+ 必用)
代码语言:javascript
复制
-- 【业务:2024年发布的技术文档中,与「vLLM推理加速」最相似的5篇】
-- 注意:替换'[0.1234, 0.5678, ...]'为实际生成的1536维embedding向量数组
-- pgvector 0.5.0+ 特性:<=#> 为**余弦距离**运算符,1-距离=相似度
SELECT 
    doc_title, doc_content,
    1 - (embedding <=#> '[0.1234, 0.5678, 0.9012, ...]') AS similarity  -- 余弦相似度计算
FROM rag_documents
WHERE doc_meta @> '{"type":"技术文档"}'  -- JSONB包含过滤:仅匹配技术文档
  AND doc_meta ->> 'year' = '2024'        -- JSONB取字符串值过滤:2024年发布
ORDER BY similarity DESC                   -- 按相似度降序
LIMIT 5;                                   -- 限制返回条数(适配大模型上下文)
语法 3:合规审计查询(金融 / 政务场景必用)
代码语言:javascript
复制
-- 【业务:查询2024-06-01至今,gpt-3.5-turbo模型的所有调用记录】
SELECT user_id, model_name, create_time
FROM llm_chat_history
WHERE model_name = 'gpt-3.5-turbo'
  AND create_time >= '2024-06-01T00:00:00+00'::TIMESTAMP WITH TIME ZONE;  -- 统一UTC时间格式

四、模块 3:大模型必用索引优化(仅 2 种索引)

索引是大模型 SQL 性能的核心,仅需掌握「复合 B-Tree 索引 + 向量近似索引」

语法 1:复合 B-Tree 索引(上下文 / 元数据查询必用)
代码语言:javascript
复制
-- 为对话历史表的核心查询条件建立复合索引(user_id+create_time DESC)
CREATE INDEX idx_chat_user_time ON llm_chat_history(user_id, create_time DESC);

-- 为RAG文档表的JSONB元数据建立GIN索引(支持高效的包含/取字段查询)
CREATE INDEX idx_doc_meta ON rag_documents USING GIN(doc_meta);
语法 2:向量近似索引(大模型检索必用)
代码语言:javascript
复制
-- 为embedding字段建立IVFFlat近似索引(pgvector官方推荐,召回率≈95%,速度比精确索引快100+倍)
-- 核心参数:nlist=1000(索引分区数,推荐值=数据量/1000)
CREATE INDEX idx_doc_embedding ON rag_documents USING ivfflat(embedding vector_cosine_ops) WITH (nlist = 1000);
ANALYZE rag_documents;  -- 必须执行:让PostgreSQL优化器识别数据分布,避免全表扫描

注意:不要遗漏ANALYZE操作,IVFFlat 作为近似索引,必须通过ANALYZE让优化器感知数据分布。


五、模块 4:大模型必用权限控制(仅 3 种语法)

为满足合规要求,大模型服务必须仅拥有最小查询权限

代码语言:javascript
复制
-- Step 1: 创建大模型服务专用账号
CREATE ROLE llm_service WITH LOGIN PASSWORD 'llm_2024_pwd_secure';  -- 建议用强密码

-- Step 2: 仅授权查询权限(最小权限原则)
GRANT SELECT ON llm_chat_history TO llm_service;
GRANT SELECT ON rag_documents TO llm_service;

-- Step 3: 撤销危险权限(强化合规,默认无但需明确禁用)
REVOKE INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM llm_service;

六、2 小时实战练习:一键初始化大模型存储脚本

以下脚本可直接复制到 PostgreSQL 运行,完成大模型存储的生产级初始化:

代码语言:javascript
复制
-- 环境要求:PostgreSQL 11+,已安装pgvector插件权限
-- Step 1: 安装/启用pgvector插件
CREATE EXTENSION IF NOT EXISTS vector;

-- Step 2: 创建2张核心表
CREATE TABLE llm_chat_history (id SERIAL PRIMARY KEY, user_id VARCHAR(64) NOT NULL, prompt TEXT NOT NULL, answer TEXT NOT NULL, model_name VARCHAR(50) NOT NULL, create_time TIMESTAMP WITH TIME ZONE DEFAULT NOW());
CREATE TABLE rag_documents (id SERIAL PRIMARY KEY, doc_title VARCHAR(255) NOT NULL, doc_content TEXT NOT NULL, doc_meta JSONB, embedding VECTOR(1536) NOT NULL);

-- Step 3: 创建必用索引
CREATE INDEX idx_chat_user_time ON llm_chat_history(user_id, create_time DESC);
CREATE INDEX idx_doc_meta ON rag_documents USING GIN(doc_meta);
CREATE INDEX idx_doc_embedding ON rag_documents USING ivfflat(embedding vector_cosine_ops) WITH (nlist = 1000);
ANALYZE rag_documents;  -- 必须添加:优化IVFFlat索引性能

-- Step 4: 创建服务账号并授权最小权限
CREATE ROLE llm_service WITH LOGIN PASSWORD 'llm_2024_pwd_secure';
GRANT SELECT ON llm_chat_history TO llm_service;
GRANT SELECT ON rag_documents TO llm_service;
REVOKE INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public FROM llm_service;

-- 脚本结束:已完成生产级大模型存储初始化

七、大模型 SQL 避坑指南(必看)

  1. 禁止用SELECT *:仅查询需要的字段,减少网络传输;
  2. 禁止用LIKE做语义模糊检索:大模型场景的模糊检索用向量库,SQL 仅做精确过滤(如用户 ID / 时间 / 元数据);
  3. 禁止存超长文本:RAG 文档必须分片为单条≤1000 字的记录,提升检索效率;
  4. 强制用 UTC 时间:避免分布式场景的时区偏移问题;
  5. 向量维度必须匹配:若使用其他模型(如智谱清言 1024 维),需同步修改VECTOR(n)的维度与索引。
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2025-12-17,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、写在前面:为什么只讲「最小语法子集」?
  • 二、模块 1:大模型应用必用表设计(仅 2 种表结构)
    • 语法 1:CREATE TABLE(创建表)
  • 三、模块 2:大模型核心查询语法(仅 3 种 SQL)
    • 语法 1:上下文加载(对话系统必用)
    • 语法 2:RAG 混合检索(pgvector 0.5.0+ 必用)
    • 语法 3:合规审计查询(金融 / 政务场景必用)
  • 四、模块 3:大模型必用索引优化(仅 2 种索引)
    • 语法 1:复合 B-Tree 索引(上下文 / 元数据查询必用)
    • 语法 2:向量近似索引(大模型检索必用)
  • 五、模块 4:大模型必用权限控制(仅 3 种语法)
  • 六、2 小时实战练习:一键初始化大模型存储脚本
  • 七、大模型 SQL 避坑指南(必看)
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档