资讯动态

从Transformer原理到PostgreSQL实战:构建大模型智能搜索系统

发布时间:2026/8/10 14:43:32 来源:尧图企业网站定制
在业务中引入大模型能力时很多开发者会面临一个困境理解了Transformer的原理却不知道如何将大模型与现有数据系统结合实现真正的智能应用。网上资料要么是纯理论推导要么是简单的API调用缺乏从核心原理到工程落地的完整闭环。本文将为你打通这条路径从Transformer的底层工作原理讲起逐步深入到如何利用PostgreSQL这一强大的关系型数据库构建一个支持向量检索、与大模型协同工作的智能搜索系统。无论你是想深入理解大模型技术栈的学生还是需要在项目中落地AI能力的后端工程师都能从本文获得可直接复用的代码、配置与架构思路。1. 背景与核心概念为什么是大模型与数据库的结合在人工智能的浪潮中大语言模型LLM已成为技术核心但其真正的价值在于与业务数据的结合。一个孤立的大模型就像一个博学但记忆空白的学者而数据库则是它庞大、精准且不断更新的记忆库。将两者结合才能催生出智能问答、个性化推荐、知识库检索等实际应用。Transformer 它是当前绝大多数大模型的基石架构。你可以将其理解为一个极其高效的“信息理解与加工厂”。传统的循环神经网络RNN处理序列数据是一个字一个字“看”的速度慢且难以捕捉长距离依赖。Transformer则通过自注意力Self-Attention机制让模型能够同时“关注”输入序列中的所有部分并动态计算它们之间的关联权重从而并行化处理并更好地理解上下文。正是这一创新使得训练参数量巨大的模型成为可能催生了GPT、BERT等模型的诞生。大模型LLM 通常指基于Transformer架构、在海量文本数据上预训练、拥有数百亿甚至千亿参数的模型。其核心能力是理解和生成人类语言。但在垂直领域应用中它面临“幻觉”生成不准确信息和知识截止的问题。因此我们需要为它接入最新的、私有的、结构化的数据源——这就是数据库的角色。PostgreSQL 作为功能最强大的开源关系数据库之一它不仅是存储结构化数据的利器更通过其强大的扩展生态如pgvector具备了处理AI时代新数据类型如向量的能力。这使得PostgreSQL能够在一个系统内同时管理传统的业务数据用户、订单和AI模型所需的向量化表示文本、图像的嵌入向量简化了系统架构。智能搜索 这是两者结合的典型场景。传统关键词搜索匹配的是字符无法理解语义。例如搜索“苹果”无法区分水果公司还是手机。智能搜索通过以下流程工作将用户查询语句如“推荐几款续航长的轻薄笔记本”通过大模型或专门的嵌入模型转化为一个高维向量即语义编码。在PostgreSQL中利用pgvector扩展对数据库里所有商品描述、文章内容等预先计算好的向量进行相似度搜索如余弦相似度。返回与查询向量最相似的Top K个结果。这个过程匹配的是语义因此即使商品描述中没有“续航长”三个字但只要其语义相近也能被检索出来。本文的旅程将从理解Transformer如何产生这些“向量”开始最终落地到一个基于PostgreSQL的、可运行的智能搜索原型系统。2. 环境准备与版本说明在开始实战之前我们需要搭建一个统一的开发环境。以下组件和版本经过兼容性测试建议你使用相同或相近的版本以避免不必要的依赖冲突。操作系统 Ubuntu 22.04 LTS 或 macOS Monterey (12.x) 及以上。Windows用户建议使用WSL2Ubuntu发行版。Python环境 Python 3.9 或 3.10。推荐使用conda或venv创建独立环境。# 创建并激活虚拟环境 python -m venv llm_pg_env source llm_pg_env/bin/activate # Linux/macOS # llm_pg_env\Scripts\activate # WindowsPostgreSQL数据库 版本 15 或 16。pgvector扩展对这些版本支持良好。# Ubuntu 安装示例 sudo apt update sudo apt install postgresql-15 postgresql-contrib-15Python关键库# requirements.txt transformers4.36.0 # Hugging Face Transformer库用于加载模型和生成向量 torch2.1.0 # PyTorch深度学习框架 sentence-transformers2.2.2 # 专门用于生成句子向量的库封装了常用模型 psycopg2-binary2.9.9 # PostgreSQL Python适配器 pgvector0.2.0 # pgvector的Python客户端用于在Python中操作向量类型 openai1.3.0 # 可选如需使用OpenAI的嵌入API numpy1.24.0使用pip install -r requirements.txt安装。pgvector扩展 这是让PostgreSQL支持向量类型和向量相似度搜索的核心。它需要作为插件编译并加载到数据库中。# 从源码编译安装pgvector在数据库服务器上执行 git clone --branch v0.5.0 https://github.com/pgvector/pgvector.git cd pgvector make sudo make install # 可能需要postgresql-server-dev-xx包示例项目结构llm_pg_project/ ├── requirements.txt ├── config.py # 数据库连接等配置 ├── database.py # 数据库连接与初始化创建扩展、表 ├── embedding_service.py # 向量生成服务本地模型或API ├── data_loader.py # 模拟业务数据加载与向量化 ├── search_engine.py # 智能搜索核心逻辑 └── main.py # 主程序入口演示流程3. 核心原理拆解从Attention到向量嵌入要真正用好大模型必须理解其核心——Transformer中的Attention机制以及它如何产出我们用于检索的“向量”。3.1 Transformer与Attention机制精讲Transformer模型摒弃了RNN的循环结构完全依赖注意力机制来建立输入和输出之间的全局依赖关系。其核心是“缩放点积注意力”Scaled Dot-Product Attention。1. 自注意力Self-Attention流程 假设我们有一个句子“The cat sat on the mat”经过嵌入层后得到一组向量X。步骤1创建Q, K, V 将X分别乘以三个可训练的参数矩阵W_Q,W_K,W_V得到查询Query、键Key、值Value三组向量。Q代表当前词要“问”什么K代表每个词能“回答”什么V是每个词实际包含的“信息”。步骤2计算注意力分数 计算Q与所有K的点积然后除以√(dk)dk是K的维度进行缩放防止点积过大导致softmax梯度消失。这步得到的是原始关联度。步骤3应用Softmax 对分数进行softmax归一化得到权重和为1。这个权重代表了在编码当前词时应该“注意”句子中其他词的程度。步骤4加权求和 将权重与对应的V向量加权求和得到当前词的输出向量。这个输出向量包含了整个句子的上下文信息。为什么有效在“The cat sat on the mat”中当模型处理“sat”这个词时通过自注意力它能高权重地关联到“cat”和“on”从而更好地理解“坐”这个动作的主语和方位。2. 多头注意力Multi-Head Attention 单一组的注意力可能只关注到一种类型的依赖关系如语法依赖。多头注意力将Q, K, V投影到多个不同的子空间即多个“头”并行执行注意力计算最后将结果拼接并投影。这允许模型同时关注来自不同位置的不同表示子空间的信息例如一个头关注主谓关系另一个头关注指代关系。3. 位置编码Positional Encoding 由于Transformer没有循环和卷积它需要显式地注入序列中词的位置信息。这是通过在词嵌入向量上加上一个与位置相关的正弦/余弦函数值向量来实现的。3.2 从模型输出到向量嵌入Embedding我们通常所说的“文本向量”或“嵌入向量”指的是文本经过模型编码后在某个特定层的输出表示。编码器输出如BERT BERT使用Transformer编码器。对于句子分类或语义相似度任务我们常取[CLS]标记对应的最终层输出向量作为整个句子的表示。对于更精细的表示也可以对最后一层所有词向量的平均值或最大值进行池化。解码器输出如GPT GPT使用Transformer解码器。要获取文本的向量表示通常将输入文本通过模型取最后一个词元或所有词元平均在最终隐藏层的状态。在实际应用中我们常使用专门的句子嵌入模型如sentence-transformers库提供的all-MiniLM-L6-v2这些模型在预训练Transformer基础上使用对比学习等目标在语义相似度任务上进行了微调产出的向量在语义相似度计算上表现更优。向量是什么本质上是一个固定长度的浮点数数组例如384维或768维。在这个高维空间中语义相近的文本其向量在空间中的距离如余弦距离也更近。这就是我们能用向量进行语义搜索的数学基础。4. 实战构建基于PostgreSQL的智能搜索系统现在我们将把理论付诸实践构建一个完整的智能图书搜索系统。该系统能根据用户用自然语言描述的需求从图书库中找出最相关的书籍。4.1 数据库初始化与pgvector配置首先确保PostgreSQL服务已启动然后通过psql命令行或任何客户端连接到数据库。-- 1. 创建专用数据库和用户 CREATE DATABASE book_search; CREATE USER llm_user WITH PASSWORD your_secure_password; GRANT ALL PRIVILEGES ON DATABASE book_search TO llm_user; -- 2. 连接到 book_search 数据库后创建 pgvector 扩展 \c book_search CREATE EXTENSION IF NOT EXISTS vector; -- 3. 创建存储图书信息和向量的表 CREATE TABLE books ( id SERIAL PRIMARY KEY, title TEXT NOT NULL, author TEXT, description TEXT, -- 图书详细描述 embedding vector(384), -- 假设我们使用384维的向量模型 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); -- 4. 为向量列创建索引以加速相似度搜索 -- 使用 ivfflat 索引适用于高维向量的近似最近邻搜索 CREATE INDEX ON books USING ivfflat (embedding vector_cosine_ops) WITH (lists 100); -- lists 参数需要根据数据量调整通常 sqrt(行数)关键点解释vector(384) 定义了一个384维的向量数据类型。维度必须与你使用的嵌入模型输出维度一致。ivfflat索引 PostgreSQL的pgvector支持多种索引。ivfflatInverted File with Flat compression是一种近似最近邻索引它通过聚类将向量空间划分为多个列表lists搜索时只在最有可能的列表中进行精确比较在精度和速度之间取得平衡。vector_cosine_ops表示该索引用于优化余弦相似度运算。4.2 实现向量生成服务我们将使用sentence-transformers库中的轻量级模型来生成文本向量。# embedding_service.py from sentence_transformers import SentenceTransformer import numpy as np import logging logging.basicConfig(levellogging.INFO) logger logging.getLogger(__name__) class LocalEmbeddingService: 本地嵌入模型服务 def __init__(self, model_nameall-MiniLM-L6-v2): 初始化本地嵌入模型。 :param model_name: 模型名称可选 all-MiniLM-L6-v2(384维), paraphrase-MiniLM-L3-v2等 logger.info(f正在加载嵌入模型: {model_name}) self.model SentenceTransformer(model_name) self.dimension self.model.get_sentence_embedding_dimension() logger.info(f模型加载完成向量维度: {self.dimension}) def generate_embedding(self, text): 为单个文本生成嵌入向量。 :param text: 输入文本 :return: numpy.ndarray 形状为 (dimension,) if not text or not isinstance(text, str): raise ValueError(输入文本必须是非空字符串) # 模型.encode() 返回的就是 numpy array embedding self.model.encode(text, normalize_embeddingsTrue) return embedding def generate_embeddings_batch(self, texts): 为一批文本生成嵌入向量效率更高。 :param texts: 文本列表 :return: numpy.ndarray 形状为 (len(texts), dimension) embeddings self.model.encode(texts, normalize_embeddingsTrue, show_progress_barFalse) return embeddings # 使用示例 if __name__ __main__: service LocalEmbeddingService() sample_text 这是一本关于深度学习与自然语言处理的入门书籍适合初学者。 vector service.generate_embedding(sample_text) print(f向量维度: {vector.shape}) print(f向量前10维: {vector[:10]})4.3 数据加载与向量化入库模拟一个图书数据集生成描述文本的向量并存入PostgreSQL。# data_loader.py import psycopg2 from psycopg2.extras import execute_values from embedding_service import LocalEmbeddingService import sys import os sys.path.append(os.path.dirname(os.path.abspath(__file__))) from config import DB_CONFIG # 假设配置在config.py中 class DataLoader: def __init__(self, db_config): self.db_config db_config self.embedding_service LocalEmbeddingService() self.conn None def connect(self): 建立数据库连接 try: self.conn psycopg2.connect(**self.db_config) print(数据库连接成功) except Exception as e: print(f数据库连接失败: {e}) raise def close(self): 关闭数据库连接 if self.conn: self.conn.close() print(数据库连接已关闭) def create_sample_books(self): 创建示例图书数据 books [ { title: 深度学习入门基于Python的理论与实现, author: 斋藤康毅, description: 一本用Python从头实现深度学习框架的经典入门书涵盖神经网络、误差反向传播、卷积网络等核心概念代码清晰易懂。 }, { title: 自然语言处理实战, author: 霍布森·莱恩科尔·霍华德汉纳斯·马克斯, description: 通过实际项目驱动讲解如何使用现代NLP工具库如spaCy, transformers解决文本分类、情感分析、机器翻译等实际问题。 }, { title: PostgreSQL实战, author: 谭峰张文升, description: 深入讲解PostgreSQL的核心原理、高级特性、性能优化与运维管理包含大量生产环境案例。 }, { title: 人工智能一种现代的方法第四版, author: 斯图尔特·罗素彼得·诺维格, description: 人工智能领域的权威教材全面覆盖智能Agent、搜索、知识表示、机器学习、自然语言处理等主题。 }, { title: 利用Python进行数据分析原书第2版, author: 韦斯·麦金尼, description: pandas库创始人撰写系统介绍使用Python进行数据清洗、处理、分析和可视化的完整流程是数据科学家的必备参考书。 } ] return books def insert_books_with_embeddings(self): 将图书数据及其向量嵌入插入数据库 books self.create_sample_books() descriptions [book[description] for book in books] print(正在生成文本向量...) # 批量生成向量提高效率 embeddings self.embedding_service.generate_embeddings_batch(descriptions) # 准备插入数据 data_to_insert [] for i, book in enumerate(books): # 将numpy数组转换为列表以便psycopg2处理 # pgvector的适配器会自动将列表识别为vector类型 embedding_list embeddings[i].tolist() data_to_insert.append(( book[title], book[author], book[description], embedding_list )) # 执行批量插入 insert_sql INSERT INTO books (title, author, description, embedding) VALUES %s try: cur self.conn.cursor() execute_values(cur, insert_sql, data_to_insert) self.conn.commit() print(f成功插入 {len(data_to_insert)} 条图书记录) cur.close() except Exception as e: self.conn.rollback() print(f插入数据时发生错误: {e}) raise if __name__ __main__: # config.py 示例内容 # DB_CONFIG { # dbname: book_search, # user: llm_user, # password: your_secure_password, # host: localhost, # port: 5432 # } loader DataLoader(DB_CONFIG) try: loader.connect() loader.insert_books_with_embeddings() finally: loader.close()4.4 实现智能搜索引擎这是系统的核心接收用户自然语言查询将其向量化然后在数据库中进行相似度搜索。# search_engine.py import psycopg2 from psycopg2.extras import RealDictCursor import numpy as np from embedding_service import LocalEmbeddingService from config import DB_CONFIG class IntelligentSearchEngine: def __init__(self, db_config, embedding_serviceNone): self.db_config db_config self.embedding_service embedding_service or LocalEmbeddingService() self.conn psycopg2.connect(**db_config) # 确保pgvector扩展已加载并注册向量类型适配器 with self.conn.cursor() as cur: cur.execute(CREATE EXTENSION IF NOT EXISTS vector;) self.conn.commit() def search_by_vector(self, query_vector, top_k5): 使用余弦相似度进行向量搜索。 :param query_vector: 查询向量 (list 或 np.array) :param top_k: 返回最相似的结果数量 :return: 搜索结果列表 # 确保查询向量是列表格式 if isinstance(query_vector, np.ndarray): query_vector query_vector.tolist() search_sql SELECT id, title, author, description, 1 - (embedding %s::vector) as cosine_similarity FROM books ORDER BY embedding %s::vector LIMIT %s; # 注意pgvector的 运算符计算的是余弦距离1 - 余弦相似度 # 所以 1 - (embedding %s) 得到的就是余弦相似度 try: with self.conn.cursor(cursor_factoryRealDictCursor) as cur: cur.execute(search_sql, (query_vector, query_vector, top_k)) results cur.fetchall() return results except Exception as e: print(f搜索过程中发生错误: {e}) self.conn.rollback() return [] def search_by_text(self, query_text, top_k5): 接收自然语言查询自动向量化并搜索。 :param query_text: 用户查询文本 :param top_k: 返回最相似的结果数量 :return: 搜索结果列表 print(f处理查询: {query_text}) # 1. 将查询文本转化为向量 query_vector self.embedding_service.generate_embedding(query_text) print(查询向量生成完毕) # 2. 执行向量相似度搜索 results self.search_by_vector(query_vector, top_k) return results def display_results(self, results): 格式化显示搜索结果 if not results: print(未找到相关结果。) return print(f\n找到 {len(results)} 个相关结果:) print( * 80) for i, res in enumerate(results, 1): print(f{i}. 《{res[title]}》 - {res[author]}) print(f 相似度: {res[cosine_similarity]:.4f}) print(f 简介: {res[description][:150]}...) # 截取部分描述 print(- * 80) def close(self): 关闭数据库连接 if self.conn: self.conn.close() # 主程序演示 if __name__ __main__: engine IntelligentSearchEngine(DB_CONFIG) # 示例查询 test_queries [ 我想找一本教我用Python处理数据的书, 有没有介绍神经网络基础原理的教材, 推荐数据库优化方面的实战指南, 关于机器翻译和文本理解的最新进展 ] for query in test_queries: print(f\n{#*60}) print(f查询: {query}) print(f{#*60}) results engine.search_by_text(query, top_k3) engine.display_results(results) engine.close()4.5 运行与结果验证运行python search_engine.py你将看到类似以下的输出############################################################ 查询: 我想找一本教我用Python处理数据的书 ############################################################ 处理查询: 我想找一本教我用Python处理数据的书 查询向量生成完毕 找到 3 个相关结果: 1. 《利用Python进行数据分析原书第2版》 - 韦斯·麦金尼 相似度: 0.8721 简介: pandas库创始人撰写系统介绍使用Python进行数据清洗、处理、分析和可视化的完整流程是数据科学家的必备参考书... -------------------------------------------------------------------------------- 2. 《深度学习入门基于Python的理论与实现》 - 斋藤康毅 相似度: 0.6215 简介: 一本用Python从头实现深度学习框架的经典入门书涵盖神经网络、误差反向传播、卷积网络等核心概念代码清晰易懂... -------------------------------------------------------------------------------- 3. 《自然语言处理实战》 - 霍布森·莱恩科尔·霍华德汉纳斯·马克斯 相似度: 0.5873 简介: 通过实际项目驱动讲解如何使用现代NLP工具库如spaCy, transformers解决文本分类、情感分析、机器翻译等实际问题...结果分析查询1“用Python处理数据”与《利用Python进行数据分析》一书描述高度相关相似度最高0.87。查询2“神经网络基础原理”成功匹配到了《深度学习入门》。查询3“数据库优化”匹配到了《PostgreSQL实战》。查询4“机器翻译和文本理解”匹配到了《自然语言处理实战》和《人工智能一种现代的方法》。系统成功理解了查询的语义而非简单关键词匹配。即使描述中没有完全相同的词汇也能找到相关书籍。5. 常见问题与排查思路在实际部署和运行过程中你可能会遇到以下典型问题。问题现象可能原因排查步骤与解决方案安装pgvector扩展失败提示“找不到vector类型”1. 扩展未正确编译安装。2. 未在目标数据库中执行CREATE EXTENSION vector;。1. 在PostgreSQL服务器上确认pgvector已安装find /usr -name vector* 2/dev/null。2. 使用psql连接到你的数据库执行CREATE EXTENSION vector;。3. 检查是否安装postgresql-server-dev-xx包用于编译。Python插入向量时报错“can‘t adapt type ‘numpy.ndarray’”psycopg2无法直接处理numpy数组。在插入前将numpy数组转换为Python列表embedding.tolist()。pgvector的适配器会自动识别列表为向量。向量相似度搜索速度非常慢1. 数据量较大但未建立索引。2.ivfflat索引参数lists设置不合理。3. 使用精确搜索而非索引扫描。1. 确保已对embedding列创建索引CREATE INDEX ... USING ivfflat ...。2. 对于百万级数据lists可设置为sqrt(行数)或行数/1000。创建索引后需用一些查询数据运行ANALYZE;。3. 确认查询使用了索引EXPLAIN ANALYZE查看执行计划。搜索结果的语义相关性不高1. 使用的嵌入模型与领域不匹配。2. 文本预处理清洗、分词不一致。3. 向量未归一化。1. 尝试不同的句子嵌入模型如all-mpnet-base-v2效果更好但更慢或针对特定领域微调的模型。2. 确保入库文本和查询文本的预处理方式一致如去除特殊字符、统一大小写。3. 在生成向量时使用normalize_embeddingsTrue保证向量是单位向量使余弦相似度计算更准确。数据库连接失败1. PostgreSQL服务未运行。2. 连接参数主机、端口、用户名、密码、数据库名错误。3. 权限不足。1. 检查服务状态sudo systemctl status postgresql。2. 使用psql命令行工具测试连接。3. 检查pg_hba.conf文件确保允许本地或远程连接。内存不足加载大模型失败嵌入模型尤其是大型模型需要较多GPU/CPU内存。1. 换用更小的模型如all-MiniLM-L6-v2仅80MB。2. 确保有足够可用内存。对于CPU推理模型加载需要约模型文件大小2-3倍的内存。3. 考虑使用API服务如OpenAI Embeddings替代本地模型。6. 最佳实践与工程建议将大模型与PostgreSQL结合投入生产环境需要考虑更多工程化因素。1. 向量索引策略优化索引选择pgvector支持ivfflat和hnsw索引。ivfflat适合中等规模数据集构建快hnsw适合大规模高精度搜索但构建慢、占用空间大。根据数据量和性能要求选择。索引参数调优ivfflat的lists参数至关重要。一个经验公式是lists sqrt(行数)。对于千万级数据可能需要数千个lists。在数据代表性样本上构建索引后用测试查询评估召回率。索引重建 当表中新增大量数据后原有的索引可能不再均衡需要定期重建索引以保持搜索性能REINDEX INDEX index_name;。2. 嵌入模型选型与部署平衡速度与质量 在本地部署场景下需要在嵌入质量和推理速度/资源消耗之间权衡。all-MiniLM-L6-v2是一个很好的起点。如果质量不满足可升级到all-mpnet-base-v2。模型池化 在高并发场景为每个请求单独加载模型不可行。应实现一个模型服务池使用类似FastAPI搭建一个独立的嵌入微服务供其他业务服务调用。异步处理 对于批量数据入库的向量化任务应采用异步队列如Celery Redis处理避免阻塞主业务流程。3. 数据管道与更新策略增量更新 业务数据是动态的。需要设计一个管道监听源数据变化如数据库CDC自动触发相关文本内容的重新向量化并更新PostgreSQL中的向量记录。版本管理 如果更换了嵌入模型新旧模型生成的向量空间不同无法直接比较。解决方案是要么全量重新计算向量要么在表中为不同模型版本保留不同的向量列并在查询时指定版本。4. 混合搜索策略关键词 向量混合搜索 纯向量搜索可能无法完美处理所有情况如精确匹配产品编号。可以实现一个混合搜索方案-- 示例结合关键词匹配分数和向量相似度分数 SELECT *, (ts_rank(to_tsvector(english, description), plainto_tsquery(english, :keyword_query)) * 0.3) ((1 - (embedding :query_vector)) * 0.7) AS combined_score FROM books WHERE to_tsvector(english, description) plainto_tsquery(english, :keyword_query) OR (embedding :query_vector) 0.3 -- 向量距离阈值 ORDER BY combined_score DESC LIMIT 10;元数据过滤 在向量搜索前或后结合业务元数据如分类、价格区间、时间范围进行过滤可以大幅提升搜索的精准度和效率。5. 性能监控与运维监控指标 监控向量搜索的延迟、QPS、索引缓存命中率。监控嵌入模型的推理延迟和错误率。查询分析 定期使用EXPLAIN (ANALYZE, BUFFERS)分析慢查询优化索引或调整查询语句。备份与恢复 包含向量数据的数据表体积可能增长很快。制定合理的备份策略并测试恢复流程。通过遵循这些最佳实践你可以构建一个健壮、高效且可扩展的智能搜索系统使其能够平滑地集成到现有的技术栈中并处理真实业务场景下的复杂需求。从理解Transformer的原理开始到最终在PostgreSQL中运行起一个语义搜索应用这条路径清晰地展示了如何将前沿的AI技术与成熟的数据基础设施相结合创造出真正的业务价值。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价