Mirage Flow 本地知识库构建:基于开源模型的私有化ChatGPT方案

news2026/3/18 13:06:58
Mirage Flow 本地知识库构建基于开源模型的私有化ChatGPT方案1. 引言你是不是也遇到过这样的场景公司内部有一堆产品手册、技术文档、会议纪要每次想查点东西都得在文件夹里翻半天。或者你想让AI帮你分析一些内部数据但又担心把敏感信息上传到云端不安全。我之前就经常被这些问题困扰。后来发现其实完全可以在自己的电脑或服务器上搭建一个专属的智能问答助手。它不仅能理解你上传的文档还能像ChatGPT一样和你对话最关键的是所有数据都在本地安全又可控。今天要聊的Mirage Flow就是这样一个方案。它不是什么高深莫测的黑科技而是一套用开源工具拼起来的“乐高积木”。我会带你一步步从零开始把它搭建起来。整个过程就像组装一台电脑我们把文档处理、向量搜索、大模型对话这几个核心部件组合好一个属于你自己的“私有ChatGPT”就诞生了。2. 准备工作理清思路与备好工具在动手之前我们先花几分钟搞清楚Mirage Flow到底是怎么工作的。别担心不用懂复杂的算法你只需要把它想象成一个超级图书管理员。核心工作流程很简单就三步学习资料文档处理与存储你把公司手册、产品文档PDF、Word、TXT都行交给它。它会把每一段文字都“读”一遍并转换成一种叫“向量”的数学形式可以理解为给每段话生成一个独特的“指纹”然后存进一个专门的数据库里。查找资料问题检索当你提问时比如“我们产品的退货政策是什么”系统会先把你的问题也转换成“向量指纹”然后去数据库里快速找出那些“指纹”最相似的文档片段。组织答案智能回答系统把找到的相关文档片段和你原来的问题打包在一起交给本地运行的大语言模型比如ChatGLM、Qwen等。模型就像一个有经验的员工根据你提供的“参考资料”组织语言生成一个准确、流畅的回答并且可以像聊天一样流式地显示出来。整个过程你的文档、你的问题、生成的答案全都在你自己的机器上流转没有一刻离开你的环境。接下来看看我们需要准备哪些“零件”一台电脑或服务器建议配置不要太低。如果只是测试学习有16GB内存的电脑基本够用。如果想处理大量文档或追求更快速度内存最好在32GB以上并且有NVIDIA显卡GPU会快很多。安装Docker这是我们的“集装箱”系统能让我们把各种复杂的软件环境打包好一键运行避免配置冲突。去Docker官网根据你的操作系统Windows/macOS/Linux下载安装即可。一个向量数据库我们选择ChromaDB。它轻量、易用特别适合我们这种知识库场景而且和后续工具集成得很好。一个大语言模型LLM这是大脑。我们选择在本地部署一个开源模型比如ChatGLM3-6B或Qwen-7B。它们对中文支持好在消费级显卡上也能跑起来。我会以ChatGLM3为例。Mirage Flow的核心它其实是一套编排工具负责把上面几个部件串联起来。我们会使用LangChain这个流行的框架来实现文档加载、切割、向量化、检索和对话链的构建。好了思路和工具清单都清楚了我们这就开始动手组装。3. 第一步搭建基础环境与模型万事开头难但第一步我们只做两件简单的事启动向量数据库和把大语言模型“请”到本地来。3.1 启动向量数据库 ChromaDB打开你的终端命令行工具输入下面这行命令docker run -d --name chromadb -p 8000:8000 chromadb/chroma这行命令做了什么呢它让Docker从网上拉取ChromaDB的镜像然后在本地的8000端口启动一个容器并给它起名叫chromadb。-d参数是让它在后台安静运行。执行完后你可以用docker ps命令看看它是不是在正常运行。看到chromadb这个容器状态是Up就说明第一步成功了。这个数据库现在就在8000端口待命准备接收我们文档的“向量指纹”了。3.2 部署本地大语言模型这里我们以ChatGLM3-6B为例。部署开源模型有很多方式为了简单起见我们可以使用一个现成的、带API接口的镜像。这样我们的Mirage Flow程序就能像调用在线服务一样和它对话了。在终端运行docker run -d --name chatglm -p 8080:8080 -v /path/to/your/models:/app/models -e MODEL_NAMETHUDM/chatglm3-6b registry.cn-beijing.aliyuncs.com/xxx/chatglm3-6b-api:latest注意你需要把/path/to/your/models替换成你电脑上一个真实的目录路径比如/home/yourname/models。这个目录是用来存放下载的模型文件的。镜像地址registry.cn-beijing.aliyuncs.com/xxx/chatglm3-6b-api:latest是一个示例你可能需要根据实际情况在Hugging Face或国内的ModelScope等平台找到合适的、带HTTP API的镜像。请务必使用来源可靠、符合规定的镜像。这个命令会在8080端口启动一个模型API服务。模型第一次启动时会自动从网上下载可能需要一些时间取决于你的网络。下载完成后你可以打开浏览器访问http://localhost:8080/docs如果能看到类似Swagger的API文档页面就说明模型服务也准备好了。至此我们的大脑LLM和资料库向量数据库都已经就位。4. 第二步构建Mirage Flow核心应用现在我们要用Python写一个程序作为“总指挥”把前两步启动的服务连接起来并实现文档处理和问答逻辑。我建议你创建一个新的项目文件夹比如叫mirage_flow_project。4.1 安装必要的Python库在项目文件夹里创建一个requirements.txt文件里面写上这些依赖库langchain langchain-community chromadb pypdf unstructured sentence-transformers openai streamlit然后在终端进入你的项目目录运行pip install -r requirements.txt这里简单说一下这几个库是干嘛的langchain核心框架用来编排整个流程。chromadb用来连接我们刚启动的向量数据库客户端。pypdf/unstructured用来读取PDF、Word等格式的文档。sentence-transformers一个用来把文本转换成向量的模型库我们用它来生成“指纹”。openai虽然叫openai但我们这里只是用它定义兼容的API接口格式来调用我们自己的本地模型。streamlit一个能快速生成Web界面的神器我们用它来做操作界面。4.2 编写知识库构建与问答脚本接下来我们创建一个主要的Python脚本比如叫mirage_flow.py。代码有点长但我会分段解释你跟着做就行。第一部分导入库和设置基础配置import os from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain_openai import OpenAI from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler import streamlit as st # 设置环境变量指向我们本地启动的模型API os.environ[OPENAI_API_BASE] http://localhost:8080/v1 # 假设你的模型API在8080端口 os.environ[OPENAI_API_KEY] fake-key # 本地部署不需要真key随便填一个 # 初始化文本嵌入模型用于生成向量。我们选用一个轻量且效果不错的中文模型。 embedding_model HuggingFaceEmbeddings(model_nameBAAI/bge-small-zh-v1.5)第二部分文档加载与处理函数def build_knowledge_base(doc_path): 构建知识库加载文档切分文本生成向量并存储到ChromaDB。 st.write( 正在加载文档...) # 加载指定目录下的所有PDF文件 loader DirectoryLoader(doc_path, glob**/*.pdf, loader_clsPyPDFLoader) documents loader.load() if not documents: st.warning(f在路径 {doc_path} 下未找到PDF文档。) return None st.write(f✅ 成功加载 {len(documents)} 个文档。) # 将长文档切分成小块便于检索 st.write( 正在切分文本...) text_splitter RecursiveCharacterTextSplitter(chunk_size500, chunk_overlap50) texts text_splitter.split_documents(documents) st.write(f 文档被切分为 {len(texts)} 个文本块。) # 将文本块转换为向量并持久化存储到ChromaDB st.write( 正在生成向量并存入知识库...) persist_directory ./chroma_db # 向量数据库的本地存储路径 vectordb Chroma.from_documents(documentstexts, embeddingembedding_model, persist_directorypersist_directory) vectordb.persist() st.success( 知识库构建完成) return vectordb第三部分创建问答链函数def create_qa_chain(vectordb): 创建问答链连接向量数据库和本地大模型。 # 初始化本地大模型通过兼容OpenAI API的本地服务 llm OpenAI(model_namechatglm3-6b, temperature0.1, # 温度值低回答更确定、更基于事实 streamingTrue, # 启用流式输出 callbacks[StreamingStdOutCallbackHandler()]) # 定义一个提示词模板告诉模型如何利用检索到的上下文回答问题 prompt_template 请严格根据以下上下文信息来回答问题。如果上下文信息中没有相关答案请直接说“根据提供的资料我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 基于上下文的回答 PROMPT PromptTemplate(templateprompt_template, input_variables[context, question]) # 构建检索式问答链 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrievervectordb.as_retriever(search_kwargs{k: 4}), # 每次检索最相关的4个文本块 chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 返回参考来源便于追溯 ) return qa_chain第四部分用Streamlit创建Web界面def main(): st.set_page_config(page_titleMirage Flow - 本地知识库问答, layoutwide) st.title( Mirage Flow - 你的私有化ChatGPT知识库) # 侧边栏知识库构建区 with st.sidebar: st.header( 构建知识库) doc_path st.text_input(文档目录路径放PDF文件, value./docs) if st.button(构建/更新知识库): with st.spinner(正在构建知识库请稍候...): global vectordb, qa_chain vectordb build_knowledge_base(doc_path) if vectordb: qa_chain create_qa_chain(vectordb) st.session_state[kb_ready] True st.markdown(---) st.markdown(**说明**) st.markdown(1. 将PDF文档放入上方指定的目录。) st.markdown(2. 点击按钮构建向量知识库。) st.markdown(3. 在右侧开始问答。) # 主界面问答区 st.header( 智能问答) if kb_ready not in st.session_state: st.info( 请先在左侧构建知识库。) return question st.text_input(请输入你的问题, placeholder例如我们公司的产品保修期是多久) if question: with st.spinner(正在思考...): result qa_chain({query: question}) answer result[result] source_docs result[source_documents] # 流式输出回答这里简化了实际可更精细控制 st.write(**回答**) st.write(answer) # 显示参考来源 with st.expander(查看回答依据的来源): for i, doc in enumerate(source_docs): st.markdown(f**来源 {i1}** (页码{doc.metadata.get(page, N/A)})) st.caption(doc.page_content[:300] ...) # 只显示前300字符 if __name__ __main__: main()代码保存后在你的项目目录下创建一个docs文件夹把你想让AI学习的PDF文档都放进去。5. 第三步运行与使用所有代码就绪让我们启动这个系统。确保服务在运行在终端里用docker ps命令确认chromadb和chatglm两个容器都在运行。启动Web应用在项目目录下打开终端运行streamlit run mirage_flow.py它会自动打开浏览器显示我们刚刚用Streamlit写的那个界面。构建知识库在页面左侧确认文档路径是你的./docs文件夹然后点击“构建/更新知识库”按钮。你会看到加载、切分、向量化的过程提示。完成后会显示成功。开始问答在右侧的输入框里输入关于你文档内容的问题比如“总结一下第一章的主要内容”或“我们的服务条款里关于隐私的部分是怎么说的”。系统会从你上传的文档中查找信息并生成回答还会在下方展示它参考了哪些原文段落。现在一个完全运行在你本地环境、数据私有的智能问答系统就搭建完成了。你可以随时添加新的文档到docs文件夹然后重新点击构建按钮知识库就会更新。6. 总结走完这一趟你会发现搭建一个本地知识库问答系统并没有想象中那么复杂。Mirage Flow这个方案本质就是巧妙地组合了几个优秀的开源工具LangChain做流程编排ChromaDB存向量Sentence Transformer做编码再加上一个本地部署的开源大模型。它的最大价值就是实现了“数据不出域”。无论是技术方案、财务数据、客户信息还是内部流程你都可以放心地交给它来处理和学习不用担心隐私泄露。而且整个方案可控可调你可以根据需求更换更强的向量模型、更大的语言模型或者优化检索策略。当然这只是一个起点。在实际企业应用中你可能还需要考虑文档格式的更多支持如Word、Excel、知识库的增量更新、回答准确性的评估与优化、以及用户权限管理等。但有了这个基础框架后续的扩展就有了清晰的路径。如果你对效果不满意可以尝试换用更大的文本切分块chunk_size或者调整检索数量search_kwargs{“k”: 4}里的4。多试试找到最适合你文档特点的参数。最重要的是动手做起来在实践中学到的东西远比只看文章要多。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2422956.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…