Postgres mcp server
rag系列文章目录
文章目录
- rag系列文章目录
- 前言
- 一、传统RAG遇到的困难
- 二、Postgres mcp server介绍
- 三、交互过程
- 四、不足
- 总结
前言
传统 RAG(Retrieval-Augmented Generation),通过对文本切片向量化,然后召回相似的文本块,来增强大模型的知识。最近MCP爆火,MCP + database作为一种新型的检索增强,也越来越受到人们的关注,今天介绍一种常用的postgres mcp server,说明大模型通过mcp检索的过程。
一、传统RAG遇到的困难
RAG从出现到今天,也经过了几年的时间,虽然越来越出色,但是仍然有一些问题,比如:
1、 生成内容不完整:
由于RAG处理的是文档的切片,而这些切片的局部性意味着它无法看到整个文档的信息,因此在回答诸如“列出XXX”或“概括XXX”之类的问题时,答案通常不完整。也就是说,它不擅长总结性的问题。
2、 缺乏整体视角:
RAG无法确定回答一个问题需要多少个切片,也无法确定文档之间的联系。例如,在法律条款中,新的解释可能会覆盖旧的解释,但RAG无法确定哪个是最新的。
3、 多轮检索能力弱:
RAG 缺乏执行多轮、多查询条件检索的能力。
以上问题,在MCP+database场景下,可以通过多条件sql查询来增强检索,并且可以多轮变换sql进行优化查询。
二、Postgres mcp server介绍
在github上面有大量的mcp server,可以进行下载,postgres mcp server地址参考。
使用各种ai工具(比如Claude desktop或者cline等等),可以直接配置,配置如下:
{"mcpServers": {"postgres": {"command": "docker","args": ["run", "-i", "--rm", "mcp/postgres", "postgresql://host.docker.internal:5432/mydb"]}}
}
简单介绍下,这个mcp server,需要本地安装docker,并且下载mcp/postgres镜像,在使用这个mcp时,使用studio协议,也就是会直接命令行操作它,使用标准输入输出进行交互。交互命令:
docker run -i --rm mcp/postgres:latest postgresql://aaa:bb@localhost:5432/postgresdb
这里的- -rm参数,代表执行完毕后,docker容器是不保留的,通过docker ps -a查询不到。
通过上面的方式,支持mcp的工具都可以来操作postgres 数据库了,那么它是怎么操作的呢?下面做个演示,供大家理解。
- 查询这个mcp server里面的工具
docker run -i --rm mcp/postgres:latest postgresql://aaa:bb@localhost:5432/postgresdb <<< '{"jsonrpc":"2.0","method":"tools/list","params":{},"id":1}'
这个命令的含义是:启动mcp server容器进行交互(-i参数),将<<<后面的字符串作为输入,这个输入参数是指查询mcp server里面的工具。
结果如下:
{"result": {"tools": [{"name": "query","description": "Run a read-only SQL query","inputSchema": {"type": "object","properties": {"sql": {"type": "string"}}}}]},"jsonrpc": "2.0","id": 1
}
- 执行sql,查询postgres里面的数据
Mcp client是如何调用postgres数据库,进行查询的呢?执行命令
docker run -i --rm mcp/postgres:latest postgresql://aaa:bb@localhost:5432/postgresdb <<< '{"method":"tools/call","params":{"name":"query","arguments":{"sql":"SELECT name FROM student_info where age = 18"}},"jsonrpc":"2.0","id":1}'
这个命令的含义是:查询postgres,sql是:SELECT name FROM student_info where age = 18
Mcp返回如下:
{"result": {"content": [{"type": "text","text": "[\n {\n \"name\": \"张三\"\n }\n]"}],"isError": false},"jsonrpc": "2.0","id": 1
}
查询结果显示,年龄等于18的学生是张三。
三、交互过程
上面演示了,直接通过studio方式,调用mcp server。整个交互过程是怎么样的呢?
四、不足
Mcp+database这种检索增强方案,也有一定的不足。
1、 检索数据过量。因为sql是通过大模型生成的,可能存在查询数据过多的问题。如果查询一次性返回大量数据,将会消耗大量 token,甚至可能导致 MCP 客户端卡死。
2、 Text2sql的能力问题。Mcp+database该方案,依赖生成可执行的sql,如果prompt不佳,可能导致生成的sql存在问题。
总结
从上面看出,mcp+database方案,主要解决的是结构化数据的查询问题,是对RAG的一个补充,RAG更侧重于非结构化的数据处理问题。它并不会取代RAG,而是会完善RAG,在特定的领域,比如完全依赖于结构化数据的场景,可能会只需要mcp+database。
参考:文档1、文档2