下载docker-mcp
https://github.com/docker/mcp-gateway/releases/latest@import url(http://www.blogjava.net/CuteSoft_Client/CuteEditor/Load.ashx?type=style&file=SyntaxHighlighter.css);@import url(/css/cuteeditor.css);
移到:
Linux ~/.docker/cli-plugins/docker-mcp
macOS ~/.docker/cli-plugins/docker-mcp
Windows %USERPROFILE%\.docker\cli-plugins
向大模型输入问题,让大模型回答。
大模型的做法是,先自己去寻找相关信息,再汇总出答案。这个过程有可能不靠谱,大模型自己寻找出他自己认为是对的信息,可能是错的,所以做出的答案,就是错的。
于是改成,让程序找出相关信息,再给大模型汇总。程序员编程后找出的信息肯定是对的,大模型汇总的结果,以大模型的能力,结果也是对的。
但这种方式有问题,就是会多次调用大模型,大模型通常是部署在远端的,就会产生性能问题。所以在大模型内部,让大模型自己去调用工具。
要大模型自己调用工具,就得靠系统提示词了,当然系统提示词不用自己写,将在n8n中流程导出json,再向deepseek提问,就可以生成提示词了。
调用的工具不止一个,就会产生协同问题,如何将a工具产生的结果作为参数调用b工具,这里的做法就是使用few shot,意思是在提示词中要要提供例子,如调用工具产生结果r1,{"input": r1}以这个参数调用工具b,这样工具b内部通过fromAI("input")就能获取到input参数的值了。
这个过程中大模型实际只做汇总,利用了大模型的长处,避免了大模型的短处。
程序去找信息,如果是从数据库中找出相关文档的方式,就是通常据说的RAG。
但在做RAG的过程中,难免碰到需求,如:用户输入关键词,直播回答某些预先答案。
象这种的实现方式,如果采用将答案弄成文档,再去让程序找到相关文档,再让大模型汇总这种方式也是不可靠。因为找到文档也是靠概率。
因此需使用新的方式,这种方式就是让程序调用工具,得出结果作为相关信息,再让大模型做汇总。这个过程出来的结果就是可靠的了。
为什么大模型会去调用工具呢
如果工具处理的方式不够,需要思考,那就需要加入大模型进去,进行协助,这种工具就是智能体了。整个架构就是所谓的多智能体的方式了。
所以总体的思路,就是让大模型做最擅长的活,汇总,信息提供由外部去做。整个结果就是可控的了。
克隆源码:
git clone https://github.com/zilliztech/mcp-server-milvus.git
添加Dockerfile
FROM python:3.12-slim
WORKDIR /app
# 安装系统依赖
RUN apt-get update && apt-get install -y \
curl \
git \
build-essential \
&& rm -rf /var/lib/apt/lists/*
# 使用 pip 安装 uv(替代 curl 方式)
#RUN pip install --no-cache-dir uv -i https://pypi.tuna.tsinghua.edu.cn/simple
RUN curl -LsSf https://astral.sh/uv/install.sh | sh
# 或者使用更可靠的方式
# RUN pip install --no-cache-dir uv==0.3.0
# 复制依赖文件
COPY pyproject.toml uv.lock README.md ./
# 为 uv 设置镜像源环境变量
ENV UV_INDEX_URL=https://pypi.tuna.tsinghua.edu.cn/simple
# 使用 uv 安装依赖
# 3. (关键)在构建时安装Python依赖到系统,而非虚拟环境
RUN pip install uv && \
uv pip install --system -r pyproject.toml
# RUN uv pip install --system -r pyproject.toml -i https://pypi.tuna.tsinghua.edu.cn/simple
# 复制源代码
COPY src/ ./src/
# 暴露端口
EXPOSE 8000
CMD ["uv", "run", "src/mcp_server_milvus/server.py", "--sse", "--milvus-uri", "http://milvus:19530", "--port", "8000"]
docker-compose.yaml
services:
mcp-milvus-server:
build: .
container_name: mcp-milvus-server
extra_hosts:
- "host.docker.internal:host-gateway"
environment:
- MILVUS_URI=http://host.docker.internal:19530
# - MILVUS_TOKEN=http://localhost:19530
# - MILVUS_DB=http://localhost:19530
ports:
- "8012:8000"
volumes:
- ./src:/app/src
# depends_on:
# milvus:
# condition: service_healthy
command: uv run src/mcp_server_milvus/server.py --sse --milvus-uri http://milvus:19530 --port 8000
networks:
- n8n_network
volumes:
milvus_data:
milvus_conf:
etcd_data:
minio_data:
networks:
n8n_network:
external: true
login-mcp-milvus-server.sh
BIN_PATH=$(cd `dirname $0`; pwd)
cd $BIN_PATH/mcp-server-milvus
docker compose exec -it mcp-milvus-server /bin/bash
logs-mcp-milvus-server.sh
BIN_PATH=$(cd `dirname $0`; pwd)
cd $BIN_PATH/mcp-server-milvus
docker compose logs -f
start-mcp-milvus-server.sh
BIN_PATH=$(cd `dirname $0`; pwd)
cd $BIN_PATH/mcp-server-milvus
docker compose up -d
docker compose logs -f
shutdown-mcp-milvus-server.sh
BIN_PATH=$(cd `dirname $0`; pwd)
cd $BIN_PATH/mcp-server-milvus
docker compose down
restart-mcp-milvus-server.sh
BIN_PATH=$(cd `dirname $0`; pwd)
cd $BIN_PATH
pwd
./shutdown-mcp-milvus-server.sh
./start-mcp-milvus-server.sh
如果想在某些垂直领域找比较好的模型, 可到下面这个网址查看:
传统的搜索是全文搜索, 即用户提供关键字, 系统将此关键字去数据库中的文本查找, 看文本是否含此关键字, 如有则返回.
这种有个缺点, 如果提供的是关键字的同义词, 则无法搜索了.
于是最新的人工智能技术能解决这个问题, 即只提供同义词之类的也能找出来.
为什么能查找出来呢, 系统将待搜索的文本转成向量, 再将关键词转成向量, 查找欧氏距离或余弦相似度最近的那组向量, 再将此对应的文本返回.
由于文本长度太长, 通常是将文本切割成文本块, 再逐个存储. 这样会导致返回的文本有缺失.
于是产生不同的存储策略, 将文本的属性作为元数据保存了下来, 如果精准的知道其属性, 则可以直接查属性而找到文本.
也可以将此文本生成一段摘要, 也作为元数据保存下来, 关键字先和摘要匹配, 如果相近即返回.
也可以将文本转成全文索引的格式保存下来, 再以文本是否含此关键字进行搜索, 如有则返回.
这样返回的文本多了, 搜索的准确度自然就提高了.
这里推荐Milvus数据库, 将以上机制都放在服务器端, 用户只需调包即可实现, 大大简化的编程.
代码实现:
书本代码: