news 2026/10/26 10:11:34

解决Milvus容器问题,实现LangChain RAG完整流程,大模型开发必看

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
解决Milvus容器问题,实现LangChain RAG完整流程,大模型开发必看

本文详细记录了Milvus容器反复重启、端口拒绝等问题的解决过程,并成功实现LangChain RAG检索系统。文章介绍了Milvus+LangChain+Ollama的完整架构配置,提供了从环境搭建到代码实现的详细步骤,解决了开发者在本地构建RAG系统时常见的典型问题。适用于本地RAG、私有大模型和知识库系统等场景,是开发者的实用参考资料。


本文记录一次从 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 均可支持。

pip install -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-etcd image: quay.io/coreos/etcd:v3.5.5 volumes: - ./rag-volumes/etcd:/etcd command: > etcd -advertise-client-urls=http://127.0.0.1:2379 -listen-client-urls http://0.0.0.0:2379 --data-dir /etcd rag-minio: container_name: rag-milvus-minio image: minio/minio:RELEASE.2023-03-20T20-16-18Z environment: MINIO_ACCESS_KEY: minioadmin MINIO_SECRET_KEY: minioadmin ports: - "19000:9000" - "19001:9001" volumes: - ./rag-volumes/minio:/minio_data command: minio server /minio_data --console-address ":9001" rag-milvus: container_name: rag-milvus-standalone image: milvusdb/milvus:v2.4.0 command: ["milvus", "run", "standalone"] environment: ETCD_ENDPOINTS: rag-etcd:2379 MINIO_ADDRESS: rag-minio:9000 volumes: - ./rag-volumes/milvus:/var/lib/milvus ports: - "19530:19530" - "9091:9091" depends_on: - rag-etcd - rag-minionetworks: default: name: rag-milvus-net

启动命令:

docker compose up -d

四、验证 Milvus 是否正常

telnet 验证端口

telnet 127.0.0.1 19530

若看到如下输出:

Connected to 127.0.0.1.HTTP/1.1 400 Bad Request

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

Python 连接 Milvus

from pymilvus import connections, utility, Collectionconnections.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)

from langchain_ollama import OllamaEmbeddingsembeddings = OllamaEmbeddings( model="bge-m3", base_url="http://192.168.31.161:11434")

构造文档

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

文本切分

from langchain_text_splitters import RecursiveCharacterTextSplittersplitter = RecursiveCharacterTextSplitter( chunk_size=300, chunk_overlap=50)docs = splitter.split_documents(docs)

写入 Milvus

from langchain_community.vectorstores import Milvusvectorstore = 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)

from langchain_ollama import ChatOllamallm = ChatOllama( model="qwen2.5:7b", temperature=0)

Prompt & LCEL RAG Chain

from langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnablePassthroughprompt = 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 生效。

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

from langchain_ollama import ChatOllama, OllamaEmbeddingsfrom langchain_community.vectorstores import Milvusfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_core.documents import Documentfrom langchain_core.prompts import ChatPromptTemplatefrom langchain_core.runnables import RunnablePassthrough# 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:链路清晰、可组合

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

如何学习AI大模型?

如果你对AI大模型入门感兴趣,那么你需要的话可以点击这里大模型重磅福利:入门进阶全套104G学习资源包免费分享!

这份完整版的大模型 AI 学习和面试资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

这是一份大模型从零基础到进阶的学习路线大纲全览,小伙伴们记得点个收藏!


第一阶段:从大模型系统设计入手,讲解大模型的主要方法;

第二阶段:在通过大模型提示词工程从Prompts角度入手更好发挥模型的作用;

第三阶段:大模型平台应用开发借助阿里云PAI平台构建电商领域虚拟试衣系统;

第四阶段:大模型知识库应用开发以LangChain框架为例,构建物流行业咨询智能问答系统;

第五阶段:大模型微调开发借助以大健康、新零售、新媒体领域构建适合当前领域大模型;

第六阶段:以SD多模态大模型为主,搭建了文生图小程序案例;

第七阶段:以大模型平台应用与开发为主,通过星火大模型,文心大模型等成熟大模型构建大模型行业应用。

100套AI大模型商业化落地方案

大模型全套视频教程

200本大模型PDF书籍

👉学会后的收获:👈

• 基于大模型全栈工程实现(前端、后端、产品经理、设计、数据分析等),通过这门课可获得不同能力;

• 能够利用大模型解决相关实际项目需求: 大数据时代,越来越多的企业和机构需要处理海量数据,利用大模型技术可以更好地处理这些数据,提高数据分析和决策的准确性。因此,掌握大模型应用开发技能,可以让程序员更好地应对实际项目需求;

• 基于大模型和企业数据AI应用开发,实现大模型理论、掌握GPU算力、硬件、LangChain开发框架和项目实战技能, 学会Fine-tuning垂直训练大模型(数据准备、数据蒸馏、大模型部署)一站式掌握;

• 能够完成时下热门大模型垂直领域模型训练能力,提高程序员的编码能力: 大模型应用开发需要掌握机器学习算法、深度学习框架等技术,这些技术的掌握可以提高程序员的编码能力和分析能力,让程序员更加熟练地编写高质量的代码。

LLM面试题合集

大模型产品经理资源合集

大模型项目实战合集

👉获取方式:
😝有需要的小伙伴,可以保存图片到wx扫描二v码免费领取【保证100%免费】🆓

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

2026健身器材出海新思路:海外红人营销如何提前完成心智占位

健身器材的购买,很少始于“我现在要买一台器械”。更多时候,它来自更早期、也更模糊的心理触发点——对健康状态的隐性焦虑、对身材变化的自我察觉、对居家空间功能性的重新审视。这些触发并不直接指向某个产品,而是以情绪、状态或生活场景的…

作者头像 李华
网站建设 2026/10/26 5:11:31

Oracle数据库26ai首个通用版引质疑

上周,Oracle宣布Oracle AI Database 26ai企业版Linux x86-64通用版正式发布,但19c版本长达13年的支持周期以及AI锁定的潜在风险可能会让用户在升级时三思而行。Oracle起家于数据库业务,尽管其云计算和AI计划的新闻铺天盖地,但它至…

作者头像 李华
网站建设 2026/10/25 12:31:10

纳米抗体(VHH):特性优异的新型抗体工具 多领域临床应用潜力显著

纳米抗体(VHH)是源自考驼科动物的天然单域抗体,凭借小型化的分子结构与独特的理化特性,兼具高特异性、高稳定性、高亲和力的核心优势,且具备低成本易生产、体内分布迅速的产业化与临床应用优势,能穿透传统抗…

作者头像 李华
网站建设 2026/10/19 2:32:37

AI原生应用领域中AI代理的动态调整策略

AI原生应用领域中AI代理的动态调整策略 关键词:AI原生应用、AI代理、动态调整策略、智能适应、强化学习、上下文感知、多模态交互 摘要:在AI原生应用(AI-Native Applications)的浪潮中,AI代理(AI Agent&…

作者头像 李华
网站建设 2026/10/23 1:32:49

没想到,Momenta单月智驾搭载量近9万了......

点击下方卡片,关注“自动驾驶之心”公众号 戳我-> 领取自动驾驶近30个方向学习路线 编辑 | 自动驾驶之心 本文只做学术分享,如有侵权,联系删文 >>自动驾驶前沿信息获取→自动驾驶之心知识星球 这两天看到了中国汽车工业协会发布的《…

作者头像 李华
网站建设 2026/10/26 7:18:42

OFTP2系列之二:OFTP2和OFTP1有什么区别?

1986 年欧洲电信传输数据交换组织(Odette)首次推出了 OFTP协议1.0版,经过20年的发展Odette于2007年发布OFTP协议2.0版,这是该标准发展历程中的里程碑式升级。OFTP2与OFTP1的核心差异在于网络适配、安全机制、文件处理能力与业务流程,OFTP2全面…

作者头像 李华