Mirage Flow 本地知识库构建:基于开源模型的私有化ChatGPT方案
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
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!