news 2026/10/17 2:44:53

56.实战PostgreSQL-pgvector-FastAPI构建轻量级RAG

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
56.实战PostgreSQL-pgvector-FastAPI构建轻量级RAG

实战:PostgreSQL + pgvector + FastAPI 构建轻量级 RAG

码海寻道 · 大模型、智能体与 RAG 工程组件系列第 56 篇

本篇用一个轻量方案串起 RAG 最小闭环:PostgreSQL 保存 Chunk 和业务元数据,pgvector 保存向量,FastAPI 提供检索接口。示例省略真实模型调用,但保留可替换的 Embedding 边界。

一、依赖和数据库准备

pipinstallfastapi uvicorn psycopg[binary]pgvector pydantic

PostgreSQL 启用扩展:

CREATEEXTENSIONIFNOTEXISTSvector;CREATETABLEknowledge_chunks(id bigserialPRIMARYKEY,tenant_idtextNOTNULL,document_idtextNOTNULL,contenttextNOTNULL,embedding vector(768)NOTNULL,statustextNOTNULLDEFAULT'published',created_at timestamptzNOTNULLDEFAULTnow());

768只是示例,必须与实际 Embedding 模型维度一致。

二、创建向量索引

开发阶段可以先用精确检索:

SELECTid,document_id,content,1-(embedding<=>'[0.1,0.2,0.3]'::vector)ASsimilarityFROMknowledge_chunksWHEREtenant_id='tenant-a'ANDstatus='published'ORDERBYembedding<=>'[0.1,0.2,0.3]'::vectorLIMIT5;

生产环境再根据数据规模和压测选择 HNSW 或 IVFFlat,并注意过滤条件、维护成本和召回率。

索引选择要用固定评测集和真实过滤条件压测,至少比较 Recall@K、P95 延迟、构建时间、内存和更新成本。向量维度、距离度量和归一化方式必须与 Embedding 服务契约一致,改变其中任何一项都应创建新版本索引。

三、Embedding 服务边界

classEmbeddingService:defembed_documents(self,texts:list[str])->list[list[float]]:# 替换为实际模型或供应商 SDKreturn[[0.0]*768for_intexts]defembed_query(self,text:str)->list[float]:returnself.embed_documents([text])[0]

服务边界应记录模型名、维度、归一化方式和版本。不要让入库和查询使用不同模型。

四、FastAPI 检索接口

fromfastapiimportFastAPI,HTTPExceptionfrompydanticimportBaseModel,FieldfrompsycopgimportAsyncConnection app=FastAPI()classSearchRequest(BaseModel):query:str=Field(min_length=1,max_length=4000)top_k:int=Field(default=5,ge=1,le=20)@app.post("/api/v1/search")asyncdefsearch(request:SearchRequest,tenant_id:str):vector=embedding_service.embed_query(request.query)asyncwithawaitAsyncConnection.connect(DATABASE_URL)asconn:rows=awaitconn.execute(""" SELECT id, document_id, content, embedding <=> %s::vector AS distance FROM knowledge_chunks WHERE tenant_id = %s AND status = 'published' ORDER BY embedding <=> %s::vector LIMIT %s """,(str(vector),tenant_id,str(vector),request.top_k),)return{"items":[dict(row)forrowinawaitrows.fetchall()]}

示例中的tenant_id在生产代码中必须来自认证上下文,不能由普通客户端随意传入。

检索接口还应限制top_k、查询长度、超时和返回字段,并在向量命中后用 PostgreSQL 重新确认文档状态、租户和权限。不要把完整 Chunk 原文无上限返回给前端或模型。

五、从检索到生成

defbuild_context(items:list[dict])->str:return"\n\n".join(f"[来源{i+1}]{item['content']}"fori,iteminenumerate(items))defbuild_prompt(question:str,context:str)->str:returnf"""只根据参考资料回答问题。 如果资料不足,请明确说明。 参考资料:{context}问题:{question}"""

实际项目还要加入引用元数据、Reranker、Token 限制和答案持久化。

六、入库接口和幂等

入库时使用document_id + chunk_index + embedding_model作为业务唯一键,重复任务不会产生重复 Chunk。正文发生变化时,应生成新版本而不是直接覆盖旧向量。

入库事务应先写业务事实和幂等记录,再异步生成 Embedding;向量写入成功后更新索引状态,最后切换服务版本。Embedding 失败、维度不匹配和数据库提交成功但向量写入失败,都要进入可重试或补偿状态。

七、轻量方案的边界

适合:

  • 原型和小规模生产;
  • 业务过滤和 JOIN 很多;
  • 团队已有 PostgreSQL 运维能力;
  • 查询并发和向量规模可控。

需要评估拆分到 Milvus 的信号:向量搜索明显影响业务 SQL、需要独立扩展、并发和索引规模持续增长。

八、测试清单

  • Embedding 维度与数据库一致;

  • 空查询和超长查询被拒绝;

  • 查询必须带认证租户范围;

  • 新文档写入后可见性可解释;

  • 删除和版本更新有补偿;

  • Recall@K 和 P95 延迟有基线;

  • 数据库参数化查询防止注入。

  • 查询超时、结果数量和上下文长度有上限;

  • 权限过滤和删除后的向量清理可验证;

  • Embedding、Chunk 和索引版本可以回滚。

结语

PostgreSQL + pgvector + FastAPI 是验证轻量 RAG 的好起点:组件少、业务关联方便,也能覆盖上传后的 Chunk 存储、向量检索和回答生成。等指标证明需要独立扩展时,再迁移到专用向量数据库。

下一篇将把 Milvus、Redis 和 MinIO 加入架构,构建更接近企业场景的知识库。

参考资料

  1. pgvector 官方项目
  2. PostgreSQL 官方文档
  3. FastAPI 官方文档

本文为“码海寻道”原创技术文章。SQL、pgvector 和 Embedding 示例需结合实际版本、维度和索引配置验证。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/17 2:44:28

Python 闭包:为什么函数能记住早就销毁的变量

我感觉的闭包 刚学 Python 的时候&#xff0c;跟着课程走&#xff0c;感觉 Python 就那样也不难啊&#xff0c;直到我碰到了闭包。闭包是我感觉从学 Python 开始&#xff0c;用的时间最长的一小节课程 &#xff0c;44分钟的课程反反复复看了好几遍。 后来真的弄明白了&#xff…

作者头像 李华
网站建设 2026/10/17 2:44:14

page_alloc build_all_zonelists

build_all_zonelists() 是内核中 zonelist 构建的统一入口函数&#xff0c;负责在系统启动和内存热插拔两种场景下&#xff0c;为 NUMA 节点建立内存分配时的 zone 尝试顺序。核心作用与定位zonelist 决定了分配内存时按什么顺序尝试各个 zone 和节点。build_all_zonelists() 根…

作者头像 李华
网站建设 2026/10/17 2:44:08

2026年大厂Agent开发岗真实门槛深度拆解,小白程序员必备!

本文深度剖析了2026年大厂Agent开发岗的真实门槛&#xff0c;指出会LangChain、LangGraph或跑通Agent Demo并不足以胜任工作。文章强调工程能力和业务思维的重要性&#xff0c;分析了架构设计、Tool Calling、线上稳定性、项目深挖等方面的关键要求&#xff0c;并提出了提升竞争…

作者头像 李华
网站建设 2026/10/17 2:42:43

FastReport 2022-3 VCL源码集成与跨Delphi版本定制指南

简介&#xff1a;本资源为FastReport 2022-3 VCL Enterprise完整源码包&#xff0c;专为Delphi中高级开发者设计&#xff0c;适用于D7至D12全版本VCL框架下的报表深度定制与二次开发场景。资源包含2000个文件&#xff0c;主体为559个Pascal源码&#xff08;.pas&#xff09;、7…

作者头像 李华
网站建设 2026/10/17 2:42:41

SolidJS 由 Ryan Carniato 发起,采用 MIT 开源协议,社区维护

2026 年的前端框架格局已经发生了深刻变化。React 用 Server Components 重新定义了组件模型&#xff0c;Vue 3.5 用 Vapor 模式抛弃了虚拟 DOM&#xff0c;Svelte 5 用 Runes 统一了响应式语法。 但在众多框架中&#xff0c;SolidJS 以其独特的"细粒度响应式"理念脱…

作者头像 李华