news 2026/5/9 8:01:30

基于RAG与PostgreSQL为AI助手构建持久化记忆系统的实战指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
基于RAG与PostgreSQL为AI助手构建持久化记忆系统的实战指南

1. 项目概述:为你的AI助手构建一个持久化、可关联的“第二大脑”

如果你和我一样,每天都在和Cursor、Claude Desktop这类AI编程助手打交道,那你肯定遇到过这个痛点:每次开启一个新的对话,AI助手就像得了“健忘症”,完全不记得我们之前讨论过的项目细节、技术决策或者代码片段。你不得不一遍又一遍地粘贴上下文,或者手动搜索历史记录,效率大打折扣。RAG Memory PostgreSQL MCP Server这个项目,就是为了彻底解决这个问题而生的。它本质上是一个遵循Model Context Protocol (MCP)标准的服务器,为你的AI助手提供了一个基于PostgreSQL/Supabase后端、功能强大的“长期记忆”系统。

想象一下,你正在开发一个复杂的微服务项目。上周,你通过AI助手深入研究了“如何用gRPC实现服务间认证”,相关的代码示例、架构图和讨论要点,都被这个记忆服务器自动捕获并结构化存储。今天,当你开始编写一个新的认证中间件时,你只需要问一句:“我们之前讨论过的gRPC认证方案是什么?”AI助手就能立刻从它的“记忆库”中,精准地调出所有相关上下文,仿佛你们从未中断过对话。这不仅仅是简单的聊天历史记录,而是一个具备知识图谱语义搜索文档管理能力的智能记忆中枢。

这个项目特别适合开发者、技术写作者、研究员以及任何需要与AI进行深度、连续性协作的人。它把零散、易逝的对话信息,转化为了一个可查询、可关联、可扩展的持久化知识库。接下来,我将带你从零开始,深入拆解这个项目的设计思路、核心功能,并分享我在部署和使用过程中踩过的坑和总结出的实战技巧,让你也能为自己的AI工作流装上一个强大的“外挂大脑”。

2. 核心架构与设计思路拆解

2.1 为什么是MCP + PostgreSQL + RAG?

这个项目的技术选型堪称“黄金组合”,每一层都经过了深思熟虑。

第一层:MCP (Model Context Protocol)这是项目的“连接器”。MCP是由Anthropic提出的一种开放协议,旨在标准化AI模型与外部工具、数据源之间的交互方式。你可以把它理解为AI世界的“USB协议”。通过实现一个MCP Server,我们的记忆系统就能被任何支持MCP的客户端(如Cursor, Claude Desktop, Windsurf)无缝识别和调用。这意味着你不需要为每个AI工具单独开发插件,一套记忆系统,全平台通用。这种设计极大地提升了生态兼容性和未来的可扩展性。

第二层:PostgreSQL/Supabase这是项目的“记忆皮层”。选择PostgreSQL作为存储后端,主要基于其可靠性成熟度以及强大的扩展能力。特别是通过pgvector扩展,PostgreSQL可以直接存储和计算向量嵌入(embeddings),这是实现语义搜索的基石。而Supabase作为PostgreSQL的托管服务,提供了开箱即用的数据库、认证和实时功能,极大地简化了部署和运维复杂度。使用Supabase,你可以在几分钟内获得一个生产就绪的数据库,无需操心服务器维护。

第三层:RAG (Retrieval-Augmented Generation)这是项目的“思考方式”。RAG的核心思想不是让AI模型死记硬背所有信息,而是在需要时,从外部知识库中检索最相关的信息,然后基于这些信息生成回答。这个项目完美实现了RAG流程:

  1. 存储(Store):将对话、文档等内容存入数据库。
  2. 处理(Process):对内容进行分块(Chunking),将其拆分成适合检索的片段。
  3. 嵌入(Embed):为每个文本块生成向量表示(Embedding),并存入pgvector
  4. 检索(Retrieve):当用户提问时,将问题也转化为向量,并在向量空间中进行相似度搜索,找到最相关的文本块。
  5. 生成(Generate):AI模型结合检索到的上下文,生成最终回答。

这种架构的优势在于,记忆是模块化可更新的。你可以随时向知识库添加新信息,而无需重新训练整个AI模型,成本极低,灵活性极高。

2.2 两种嵌入模式:隐私与效率的权衡

项目提供了两种生成文本嵌入(Embeddings)的模式,这是设计上的一个关键决策点,直接关系到使用体验和隐私安全。

MODE=local(本地模式,默认)

  • 原理:在本地运行一个轻量级的嵌入模型(Xenova/all-MiniLM-L12-v2)。首次运行时会自动下载约50MB的模型文件。
  • 优点
    • 绝对隐私:所有文本处理都在你的机器上完成,数据不出本地,适合处理敏感代码或商业文档。
    • 零成本:没有API调用费用。
  • 缺点
    • 速度较慢:依赖于本地CPU/GPU算力,处理大量文本时会有明显延迟。
    • 占用资源:需要加载模型到内存。

MODE=openai(OpenAI模式)

  • 原理:调用OpenAI的text-embedding-3-smallAPI来生成嵌入向量。
  • 优点
    • 极速:官方宣称比本地模式快10-100倍,体验流畅。
    • 省心:无需管理本地模型,不消耗本地计算资源。
  • 缺点
    • 有成本:虽然嵌入模型很便宜(约$0.02/百万token),但长期大量使用仍需考虑。
    • 数据出域:文本内容需要发送到OpenAI的服务器。

实操心得:模式选择建议我的经验是,在开发调试或处理高度敏感信息时,使用local模式。在日常高频使用、追求流畅体验且内容不敏感时,切换到openai模式。两种模式生成的向量维度都是384,并且项目做了兼容性设计,这意味着你可以在两种模式间无缝切换,已有的嵌入数据仍然有效,这给了我们很大的灵活性。

2.3 工具集模式:按需装配你的“记忆工具箱”

项目提供了三种工具集模式(TOOLS_MODE),这是一个非常实用的设计,体现了对用户场景的深入理解。

  • full(完整模式,默认):包含全部21个工具。适合想要完全控制所有功能的高级用户或系统管理员。
  • client(客户端模式):仅包含10个核心工具,如processDocument(处理文档)、hybridSearch(混合搜索)、createEntities(创建实体)等。这是我最推荐给绝大多数日常用户的模式。它屏蔽了那些用于数据维护和清理的“危险”工具(如各种delete操作),让你可以安全、专注地进行知识的增删改查,避免误操作。
  • maintenance(维护模式):包含11个管理工具,用于文档处理流水线、实体链接、批量嵌入等后台任务。通常在初始化知识库或进行大规模数据迁移时使用。

这种设计允许用户根据自身角色(终端用户 vs 管理员)来配置服务器,既保证了功能的完整性,又提升了日常使用的安全性和简洁性。

3. 从零开始的实战部署与配置指南

3.1 第一步:搭建你的记忆“仓库”(Supabase 准备)

记忆需要地方存放,我们首先需要设置好Supabase项目。

  1. 创建Supabase项目:访问 Supabase官网 ,注册并登录。点击“New Project”,填写项目名称(如my-ai-memory),设置数据库密码,并选择一个离你较近的区域以获得更低延迟。免费计划完全足够个人或小团队初期使用。

  2. 获取连接凭证:项目创建完成后,进入Project Settings -> API

    • SUPABASE_URL:在页面顶部找到“Project URL”,格式如https://xxxxxx.supabase.co
    • SUPABASE_SERVICE_KEY:在“Project API keys”区域,找到“service_role”的secret值。请注意:这个密钥拥有绕过行级安全策略(RLS)的权限,务必像保护密码一样保护它,不要泄露在客户端代码中。在这里使用它是安全的,因为MCP服务器运行在你的本地环境。
  3. 初始化数据库表:进入SQL Editor页面。将项目README中提供的Database Schema部分的SQL语句(包含创建rag_entities,rag_relationships等表的语句)复制过来,并执行。这一步会创建记忆系统所需的所有数据表,并启用pgvector扩展。

3.2 第二步:配置你的AI工作台(以Cursor为例)

这里以目前最流行的AI IDE——Cursor为例,展示如何接入MCP服务器。其他客户端(Claude Desktop, VS Code, Windsurf)的配置逻辑类似,只是配置文件的位置和格式略有不同。

  1. 定位配置文件:Cursor的MCP配置文件通常位于用户主目录下的.cursor/mcp.json。如果该文件或目录不存在,手动创建即可。
  2. 编辑配置文件:用文本编辑器打开(或创建)~/.cursor/mcp.json文件。将以下配置模板填入,并替换为你自己的Supabase凭证。
{ "mcpServers": { "rag-memory-pg": { "command": "npx", "args": ["-y", "rag-memory-pg-mcp@latest"], "env": { "SUPABASE_URL": "https://your-project-id.supabase.co", // 替换为你的URL "SUPABASE_SERVICE_KEY": "your-service-role-secret-key", // 替换为你的密钥 "MODE": "openai", // 或 "local" "OPENAI_API_KEY": "sk-your-openai-api-key", // 如果MODE=openai,此项必填 "TOOLS_MODE": "client" // 推荐日常使用 } } } }
  1. 重启Cursor:保存配置文件后,完全关闭并重新启动Cursor。这是关键一步,因为MCP配置通常在启动时加载。
  2. 验证连接:重启后,在Cursor的聊天框中,你应该能看到AI助手(通常是Claude)的回复中,提到了可用的工具(Tools)。或者,你可以尝试直接问它:“你现在有哪些可用的工具?”如果配置成功,它应该会列出rag-memory-pg服务器提供的工具,例如processDocumenthybridSearch等。

踩坑记录:环境变量与重启我最开始配置时,修改了mcp.json但忘记重启Cursor,导致工具一直不出现,排查了半天。另一个常见问题是环境变量值格式错误,比如SUPABASE_URL末尾多了斜杠,或者密钥包含特殊字符未正确转义。确保你的JSON格式正确,并且值都用双引号包裹。

3.3 第三步:核心工具实战与技巧

配置成功后,你就可以开始使用这个“第二大脑”了。下面通过几个核心场景,展示如何与它交互。

场景一:喂给它一篇技术文档(使用processDocument这是最常用的功能。假设你读到了一篇关于“React Server Components”的精彩博客,想让它成为AI助手知识的一部分。

你可以直接对AI助手说: “请使用processDocument工具,帮我保存这篇关于React Server Components的文章。” AI助手会向你询问文档内容。你可以将文章内容粘贴给它,或者更高效地,直接告诉它文档ID和内容:

工具调用:processDocument 参数: { "id": "react-server-components-deep-dive-2024", "content": "(这里粘贴完整的文章内容)... React Server Components allow you to render components on the server...", "maxChunkSize": 1000, "overlap": 100, "metadata": {"source": "Blog", "topic": "Frontend", "author": "Next.js Team"} }
  • id:给文档一个唯一标识符,方便后续管理。建议使用有意义的、带版本的名称。
  • maxChunkSizeoverlap:这是RAG的核心参数。maxChunkSize决定每个文本块的最大长度(字符数)。overlap是块与块之间的重叠字符数,用于防止在句子或段落中间被切断,保证上下文的连贯性。对于技术文档,我通常设置maxChunkSize为800-1000,overlap为100-150。
  • metadata:这是一个JSON对象,你可以存放任何想关联的信息,如分类、标签、来源、日期等。强大的元数据过滤是未来进行精细化检索的关键。

场景二:构建领域知识图谱(使用createEntitiescreateRelations为了让AI理解概念间的联系,我们可以手动构建知识图谱。例如,定义“微服务架构”中的核心概念。

工具调用:createEntities 参数: { "entities": [ { "name": "Microservices", "entityType": "ARCHITECTURE", "observations": ["An architectural style that structures an application as a collection of loosely coupled services."] }, { "name": "Docker", "entityType": "TECHNOLOGY", "observations": ["A platform for developing, shipping, and running applications in containers."] }, { "name": "Kubernetes", "entityType": "PLATFORM", "observations": ["An open-source system for automating deployment, scaling, and management of containerized applications."] } ] }

然后,建立它们之间的关系:

工具调用:createRelations 参数: { "relations": [ { "from": "Microservices", "to": "Docker", "relationType": "COMMONLY_USED_WITH" }, { "from": "Microservices", "to": "Kubernetes", "relationType": "COMMONLY_ORCHESTRATED_BY" }, { "from": "Docker", "to": "Kubernetes", "relationType": "CAN_BE_MANAGED_BY" } ] }

现在,当你询问“微服务通常如何部署?”时,AI不仅能检索到相关的文档片段,还能通过知识图谱知道Microservices与Docker、Kubernetes的强关联,从而给出更精准、更具洞察力的回答。

场景三:进行智能检索(使用hybridSearch当你的知识库积累了一定内容后,检索就成了核心操作。hybridSearch工具结合了语义搜索(基于向量相似度)和文本搜索(基于关键词匹配),效果最好。

工具调用:hybridSearch 参数: { "query": "How to handle authentication in a distributed system?", "limit": 5 }
  • query:你的自然语言问题。务必使用英文,因为底层的嵌入模型是针对英文优化的,使用英文查询能获得最佳的语义匹配效果。
  • limit:返回最相关结果的数量。

这个工具会返回一个包含相关文档块(chunks)的列表,每个结果都附带有相似度分数和来源文档信息,AI助手会自动将这些内容作为上下文来生成回答。

4. 高级优化与性能调优

4.1 启用全文搜索(FTS)以提升大规模检索性能

当你的文档数量超过几百个时,纯向量搜索可能会变慢。PostgreSQL内置的全文搜索(Full-Text Search, FTS)功能可以极大地提升关键词检索的速度。项目支持自动检测并利用FTS。

操作步骤:

  1. 在Supabase的SQL Editor中,运行项目提供的supabase-fts-setup.sql脚本(你可以在项目GitHub仓库找到它)。这个脚本会为rag_chunks表的content字段创建一个GIN索引,并添加一个用于全文搜索的生成列。
  2. 完成后,无需修改任何配置。服务器会自动检测到FTS索引已存在,并在执行hybridSearch时,优先使用更高效的全文搜索进行初筛,再结合向量搜索进行精排。

启用FTS前后的对比:

特性未启用FTS启用FTS后
检索速度较慢(需全表扫描或向量计算)极快(利用GIN索引)
搜索能力基础关键词匹配支持词干提取(如“running”匹配“run”)、忽略停用词(“the”, “a”)、短语精确搜索(“exact phrase”
资源占用需要额外的索引存储空间

对于文档型知识库,强烈建议在项目初期就启用FTS,这将为未来的 scalability 打下坚实基础。

4.2 分块(Chunking)策略的艺术

文本分块是RAG效果好坏的决定性因素之一。不合理的分块会导致检索到的上下文不完整或包含无关信息。

  • 原则一:保持语义完整性:分块边界应尽量落在自然段落、标题或代码块的结束处。避免在句子中间、函数定义中间切断。这就是为什么需要设置overlap(重叠)参数,它像一个“安全缓冲区”,确保边界附近的语义信息不会丢失。
  • 原则二:大小适中maxChunkSize并非越大越好。过大的块(如3000字符)可能包含多个主题,稀释了核心信息的向量表示;过小的块(如200字符)可能缺乏足够的上下文。对于技术文档和代码,500-1500字符是一个不错的起点。
  • 实战技巧:分层分块:对于结构清晰的文档(如API文档,有H1, H2, H3标题),可以采用更智能的策略。例如,将每个主要章节(H1)作为一个大块,同时将每个子章节(H2)也作为独立的块,并建立父子关系。虽然当前工具未直接支持,但你可以通过预处理文档,并利用metadata字段来标记块之间的层级关系,为未来更复杂的检索逻辑铺路。

4.3 元数据(Metadata)的妙用

metadata字段是一个强大的过滤器,但常常被忽视。你可以用它来实现垂直搜索

例如,你在知识库中存放了来自“官方文档”、“团队会议记录”、“个人学习笔记”等不同来源的内容。你可以为每个文档添加{"source": "meeting", "project": "project-alpha"}这样的元数据。

未来,当你想搜索“关于project-alpha的会议决策”时,理想的流程是:先通过元数据过滤出所有source=meetingproject=project-alpha的文档,再在这些文档中进行语义搜索。目前hybridSearch可能不支持复杂的元数据过滤,但你可以通过listDocuments工具先筛选出目标文档ID,再进行搜索。这是一个值得关注的功能演进方向。

5. 常见问题排查与维护心得

5.1 安装与连接问题

问题:Cursor重启后,仍然看不到MCP工具。

  • 检查点1:配置文件路径与格式。确保~/.cursor/mcp.json路径正确,并且JSON格式无误(可以使用在线JSON校验工具)。最常见的错误是缺少逗号或括号不匹配。
  • 检查点2:环境变量值。确认SUPABASE_URLSUPABASE_SERVICE_KEY已正确替换,且密钥有效(没有过期或被撤销)。可以尝试在终端用curl命令测试Supabase连接。
  • 检查点3:客户端版本。确保你使用的Cursor/Claude Desktop等客户端版本支持MCP。过旧的版本可能不兼容。
  • 检查点4:查看客户端日志。Cursor通常会在输出窗口或特定日志文件中报告MCP服务器启动错误。根据错误信息(如“无法连接到数据库”、“命令未找到”)进行针对性排查。

问题:使用npx命令启动时报错或超时。

  • 网络问题npx需要从npm仓库下载包。确保你的网络环境可以访问registry.npmjs.org。可以尝试设置npm镜像或使用npm install -g rag-memory-pg-mcp进行全局安装,然后修改配置文件中的commandrag-memory-pg-mcp
  • 权限问题:在全局安装时,可能需要sudo权限(Linux/macOS)。

5.2 搜索效果不佳

问题:检索到的内容似乎不相关。

  • 确认查询语言确保你的搜索查询(query)是英文。这是影响嵌入质量最关键的因素。即使用中文提问,也应先将其翻译成英文再进行检索。
  • 调整分块策略:尝试减小maxChunkSize并增加overlap,看看是否能让检索到的块更聚焦。
  • 检查嵌入模式:如果你使用的是local模式,且是首次运行,请确认嵌入模型是否已成功下载。可以查看服务器的启动日志。
  • 审视知识库质量:“垃圾进,垃圾出”。确保你存入的文档内容清晰、结构良好。杂乱无章或翻译质量很差的文本,其向量表示也会很模糊。

5.3 数据库管理与维护

问题:如何清理测试数据或旧数据?如果你在配置时使用了TOOLS_MODE: full,则可以直接使用deleteDocumentsdeleteEntities等工具。如果使用的是更安全的client模式,则需要通过Supabase的Dashboard直接操作数据库SQL。

-- 慎用!删除所有文档及相关块 DELETE FROM rag_chunks; DELETE FROM rag_documents; -- 删除所有知识图谱数据 DELETE FROM rag_relationships; DELETE FROM rag_entity_embeddings; DELETE FROM rag_entities;

问题:数据量大了以后,搜索变慢。

  1. 首先,确保已启用全文搜索(FTS),这是提升性能最有效的一步。
  2. 其次,检查是否为rag_chunks表的embedding向量列创建了索引。pgvector支持多种索引(如IVFFlat, HNSW)。你可以在Supabase SQL Editor中运行:
    CREATE INDEX ON rag_chunks USING ivfflat (embedding vector_cosine_ops) WITH (lists = 100);
    对于海量数据(>100万条),使用HNSW索引性能更好,但创建更慢、占用空间更大。
  3. 考虑定期归档或删除非常陈旧的、不再需要的数据。

5.4 安全与成本考量

  • 密钥安全SUPABASE_SERVICE_KEYOPENAI_API_KEY是最高机密。确保你的mcp.json配置文件不被上传到公开的Git仓库。可以将这些值设置为系统环境变量,然后在配置文件中引用,如"SUPABASE_SERVICE_KEY": "${SUPABASE_KEY}"(具体语法取决于你的客户端支持情况)。
  • OpenAI API成本控制:如果使用openai模式,请注意嵌入API的调用量。虽然单价低,但无节制地处理海量文档也会产生费用。建议先从local模式开始,在处理大批量文档或对延迟敏感时,再切换到openai模式。可以在OpenAI后台设置用量提醒。

我个人在深度使用这个工具几个月后,最大的体会是:它不仅仅是一个技术工具,更是一种工作流的变革。它迫使我去更有结构地整理和沉淀碎片化的知识,而AI助手则成为了一个真正“懂我”和“懂我项目”的伙伴。从最初的简单文档存储,到后来构建起复杂的项目知识图谱,这个过程本身就是一个极佳的学习和知识内化过程。如果你也厌倦了在重复的上下文切换中消耗精力,那么花点时间搭建这个“第二大脑”,绝对是值得的投资。

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

终极指南:如何利用Deep Research进行自动驾驶技术深度研究

终极指南:如何利用Deep Research进行自动驾驶技术深度研究 【免费下载链接】deep-research An AI-powered research assistant that performs iterative, deep research on any topic by combining search engines, web scraping, and large language models. The g…

作者头像 李华
网站建设 2026/5/9 7:59:43

栈与队列:原理、实现及面试高频应用场景

大家好,欢迎继续学习《算法面试60讲(2026最新版全真题带解析)》专栏!上一篇我们系统学习了数组与链表这两个最基础的数据结构,吃透了它们的定义、底层原理和面试真题,今天这一篇,我们将学习另外…

作者头像 李华
网站建设 2026/5/9 7:56:23

终极Handlebars.js成本分析:开发与维护的完整资源投入指南

终极Handlebars.js成本分析:开发与维护的完整资源投入指南 【免费下载链接】handlebars.js Minimal templating on steroids. 项目地址: https://gitcode.com/gh_mirrors/ha/handlebars.js Handlebars.js作为一款"Minimal templating on steroids"…

作者头像 李华
网站建设 2026/5/9 7:55:32

揭秘ChatGPT微盘股实验:完整追踪AI驱动的交易决策与执行过程

揭秘ChatGPT微盘股实验:完整追踪AI驱动的交易决策与执行过程 【免费下载链接】LLM-Trading-Lab This repo powers my experiment where ChatGPT manages a real-money micro-cap stock portfolio. 项目地址: https://gitcode.com/GitHub_Trending/ch/LLM-Trading-…

作者头像 李华
网站建设 2026/5/9 7:47:30

如何高效实现跨平台3D模型转换:Blender MMD Tools专业指南

如何高效实现跨平台3D模型转换:Blender MMD Tools专业指南 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools …

作者头像 李华
网站建设 2026/5/9 7:46:33

Kimi-VL-A3B-Thinking从零开始:Jetson Orin Nano边缘设备部署尝试

Kimi-VL-A3B-Thinking从零开始:Jetson Orin Nano边缘设备部署尝试 1. 模型简介 Kimi-VL-A3B-Thinking是一款高效的开源混合专家(MoE)视觉语言模型,专为边缘计算设备优化设计。这个多模态模型仅激活语言解码器中的2.8B参数&#…

作者头像 李华