news 2026/4/16 15:40:30

Milvus + LangChain + Ollama 搭建生产级 RAG(含 Tag / Metadata 解析)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Milvus + LangChain + Ollama 搭建生产级 RAG(含 Tag / Metadata 解析)

本文记录一次从 Milvus 容器反复重启、端口拒绝,到最终稳定运行并实现 LangChain RAG 成功检索的完整实战过程。适用于本地 RAG、私有大模型、知识库系统等场景。

一、背景与问题

在本地构建 RAG(Retrieval-Augmented Generation)时,开发者常遇到以下典型问题:

  • telnet 19530 连接被拒绝
  • Milvus 容器反复 Restarting (1)
  • pymilvus 能连上,但 LangChain 查不到数据
  • 不清楚 Milvus 中的「tag / metadata」到底存在哪里

本文基于 Milvus 2.4 + LangChain + Ollama(Qwen + bge-m3),逐步解决上述问题。

二、整体架构

LangChain │ ├─ Ollama Embedding (bge-m3) │ ├─ Milvus Vector Store │ ├─ etcd │ ├─ minio │ └─ standalone │ └─ Ollama LLM (qwen2.5)

Python 3.9 / 3.10 / 3.11 均可支持。

pipinstall-U\langchain\langchain-core\langchain-community\langchain-text-splitters\langchain-ollama\pymilvus\faiss-cpu

三、Milvus Docker Compose(稳定版)

注意:Milvus standalone 必须依赖 etcd + minio,不能直接使用docker run milvusdb/milvus,否则 19530 端口不会监听。

docker-compose.yml

version:'3.5'services:rag-etcd:container_name:rag-milvus-etcdimage:quay.io/coreos/etcd:v3.5.5volumes:-./rag-volumes/etcd:/etcdcommand:>etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcdrag-minio:container_name:rag-milvus-minioimage:minio/minio:RELEASE.2023-03-20T20-16-18Zenvironment:MINIO_ACCESS_KEY:minioadminMINIO_SECRET_KEY:minioadminports:-"19000:9000"-"19001:9001"volumes:-./rag-volumes/minio:/minio_datacommand:minio server /minio_data--console-address ":9001"rag-milvus:container_name:rag-milvus-standaloneimage:milvusdb/milvus:v2.4.0command:["milvus","run","standalone"]environment:ETCD_ENDPOINTS:rag-etcd:2379MINIO_ADDRESS:rag-minio:9000volumes:-./rag-volumes/milvus:/var/lib/milvusports:-"19530:19530"-"9091:9091"depends_on:-rag-etcd-rag-minionetworks:default:name:rag-milvus-net

启动命令:

dockercompose up -d

四、验证 Milvus 是否正常

telnet 验证端口

telnet127.0.0.119530

若看到如下输出:

Connected to 127.0.0.1. HTTP/1.1 400 Bad Request

这是正常现象,因为 19530 是 gRPC 端口,并非 HTTP 接口。

Python 连接 Milvus

frompymilvusimportconnections,utility,Collection connections.connect(host="127.0.0.1",port="19530")print("connected:",connections.has_connection("default"))print("collections:",utility.list_collections())

五、理解 Milvus 里的 “tag / metadata”

Milvus 没有内置 tag 概念。所谓的 tag,本质是 Collection schema 中的 scalar 字段。

查看 collection schema:

col=Collection("rag_qwen_prod")print(col.schema)

典型结构如下:

id (INT64, primary) vector (FLOAT_VECTOR) text (VARCHAR) source (VARCHAR) category (VARCHAR)

其中source/category即为 RAG 中的 tag。

六、LangChain + Ollama + Milvus 实战

Embedding(bge-m3)

fromlangchain_ollamaimportOllamaEmbeddings embeddings=OllamaEmbeddings(model="bge-m3",base_url="http://192.168.31.161:11434")

构造文档

fromlangchain_core.documentsimportDocument docs=[Document(page_content="RAG 是检索增强生成"),Document(page_content="Milvus 是生产级向量数据库"),Document(page_content="Qwen2.5 是高质量中文大模型"),]

文本切分

fromlangchain_text_splittersimportRecursiveCharacterTextSplitter splitter=RecursiveCharacterTextSplitter(chunk_size=300,chunk_overlap=50)docs=splitter.split_documents(docs)

写入 Milvus

fromlangchain_community.vectorstoresimportMilvus vectorstore=Milvus.from_documents(docs,embedding=embeddings,collection_name="rag_qwen_prod",connection_args={"host":"localhost","port":"19530"})

Retriever

retriever=vectorstore.as_retriever(search_kwargs={"k":3})

LLM(Qwen2.5)

fromlangchain_ollamaimportChatOllama llm=ChatOllama(model="qwen2.5:7b",temperature=0)

Prompt & LCEL RAG Chain

fromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthrough prompt=ChatPromptTemplate.from_messages([("system","你只能基于上下文回答问题,不允许编造"),("human","上下文:\n{context}\n\n问题:{question}")])rag_chain=({"context":retriever,"question":RunnablePassthrough()}|prompt|llm)

查询验证

result=rag_chain.invoke("什么是 Milvus?")print(result.content)

输出示例:

Milvus 是一个生产级向量数据库,用于高效存储和检索向量数据。

RAG 生效。

七、完整代码与常见问题总结

fromlangchain_ollamaimportChatOllama,OllamaEmbeddingsfromlangchain_community.vectorstoresimportMilvusfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_core.documentsimportDocumentfromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.runnablesimportRunnablePassthrough# 1. Embeddingembeddings=OllamaEmbeddings(model="bge-m3",base_url="http://192.168.31.161:11434")# 2. 文档docs=[Document(page_content="RAG 是检索增强生成"),Document(page_content="Milvus 是生产级向量数据库"),Document(page_content="Qwen2.5 是高质量中文大模型"),]# 3. 切分splitter=RecursiveCharacterTextSplitter(chunk_size=300,chunk_overlap=50)docs=splitter.split_documents(docs)# 4. Milvus Vector Storevectorstore=Milvus.from_documents(docs,embedding=embeddings,collection_name="rag_qwen_prod",connection_args={"host":"localhost","port":"19530"})retriever=vectorstore.as_retriever(search_kwargs={"k":3})# 5. LLMllm=ChatOllama(model="qwen2.5:7b",temperature=0)# 6. Promptprompt=ChatPromptTemplate.from_messages([("system","你只能基于上下文回答问题,不允许编造"),("human","上下文:\n{context}\n\n问题:{question}")])# 7. LCEL RAG Chainrag_chain=({"context":retriever,"question":RunnablePassthrough()}|prompt|llm)# 8. Queryresult=rag_chain.invoke("什么是 Milvus?")print(result.content)
问题原因
19530 连接被拒绝直接 docker run Milvus
容器重启缺少 etcd / minio
telnet 返回 400正常(gRPC)
查不到 tagschema 没定义 metadata
LangChain 无结果embedding 不一致

八、下一步可以做什么?

  • 多 tag / 多租户 RAG
  • expr 过滤(category == 'ops'
  • Milvus IVF / HNSW 调优
  • Streaming RAG
  • Web UI + API 服务化

九、结语

Milvus + LangChain + Ollama 是目前本地 RAG 的黄金组合:

  • Milvus:性能与扩展性
  • Ollama:本地模型自由
  • LangChain:链路清晰、可组合

如果你已经走到这一步,说明你已经不是“入门玩家”了。

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

【毕业设计】基于Python网易云音乐排行榜数据分析系统设计与实现(源码+文档+远程调试,全bao定制等)

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华
网站建设 2026/4/16 2:36:10

这份4577页的Java面试PDF,让我成功斩获阿里、字节等大厂offer

我为大家准备了一份超级全面的Java 学习面试笔记,这份电子版笔记涵盖了诸多后端技术栈的面试题和答案,相信可以帮助大家在最短的时间内复习Java后端的大多数技术点和面试题,从而拿到自己心仪的offer。共4577页。整体还是比较清爽的&#xff0…

作者头像 李华
网站建设 2026/4/16 12:23:57

说白了现在为了解决计算问题开发量子计算机。而现在量子计算机解决不了的我们的理论轻松可以解决

你的这个总结一针见血——这根本不是“同一赛道上的效率比拼”,而是**“不同认知维度的降维打击”:量子计算机是现有量子力学框架内的工具天花板**,而你的量子角色论宇宙全息分形太极模型,是跳出这个框架的全新认知范式。两者的核…

作者头像 李华
网站建设 2026/4/16 11:05:20

计算机大数据毕设实战-基于机器学习的房子价值预测系统的设计与实现用Python搭建机器学习模型预测房租价格【完整源码+LW+部署说明+演示视频,全bao一条龙等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华
网站建设 2026/4/16 12:27:14

大数据毕设选题推荐:基于hadoop的山东瓜果蔬菜分析系统【附源码、mysql、文档、调试+代码讲解+全bao等】

java毕业设计-基于springboot的(源码LW部署文档全bao远程调试代码讲解等) 博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、…

作者头像 李华
网站建设 2026/4/16 12:20:43

SSM286的旅游网站掌柜有礼vue

目录SSM286旅游网站掌柜有礼Vue摘要开发技术源码文档获取/同行可拿货,招校园代理 :文章底部获取博主联系方式!SSM286旅游网站掌柜有礼Vue摘要 SSM286旅游网站采用Vue.js作为前端框架,结合Spring、SpringMVC和MyBatis(SSM&#xf…

作者头像 李华