rag系列文章目录


前言

传统 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

Logo

一站式 AI 云服务平台

更多推荐