Phi-3-Mini-128K搭建个人知识库连接网络与本地文档的智能问答系统你是不是也遇到过这样的烦恼想查一个工作上的专业问题搜索引擎给出的答案要么太泛泛要么需要你从一堆网页里自己拼凑信息。或者公司内部有一大堆产品手册、技术文档、会议纪要每次想找点东西都得翻半天效率特别低。要是能有一个专属的“智能助手”不仅能像聊天一样回答你的问题还能同时从你指定的网页和本地文件里找到最相关的信息那该多方便。今天我们就来动手搭建一个这样的系统。它就像一个为你量身定做的知识库大脑核心是微软开源的轻量级大模型Phi-3-Mini-128K再给它配上“眼睛”文档解析和“记忆”向量数据库让它既能看懂你的本地文件也能安全地浏览网络最终给你一个靠谱的答案。整个过程并不复杂跟着步骤走你也能拥有一个连接网络与本地知识的智能问答伙伴。1. 为什么需要这样的个人知识库在开始动手之前我们先聊聊为什么这个组合很有吸引力。传统的知识管理要么是手动整理文档要么是用一些简单的全文搜索工具。前者费时费力后者不够智能经常搜出一堆不相关的结果。而基于大模型和RAG检索增强生成技术构建的系统正好解决了这些痛点。它把大模型的理解、生成能力和精准的信息检索结合了起来。具体来说对我们普通用户有几个实实在在的好处信息融合能力强你可以问它“根据我们上周的项目会议纪要和官网最新的产品介绍客户A的需求重点是什么”。它能同时理解你的本地会议纪要和网络上的产品页给出综合判断。回答有据可查它生成的每一个答案背后都有来自你文档或指定网页的“证据”支持。你可以要求它告诉你答案是从哪段内容来的这样用起来更放心。高度个性化这个知识库完全基于你喂给它的资料本地文档和你允许它访问的网络信息。它学到的、能回答的都是你最关心的领域知识。成本与效率平衡像Phi-3-Mini这样的模型在保持不错效果的同时对硬件要求友好很适合个人或小团队在普通电脑上部署不用花费高昂的API调用费用。简单说它就是把你散落在各处电脑里、网络上的知识碎片用AI串联起来变成一个随问随答的“活”知识库。2. 搭建前的准备工作工欲善其事必先利其器。我们先来把需要的“工具”准备好。整个系统的架构可以理解为几个核心部分处理文档的、存储知识的、理解问题的、以及获取外部信息的。2.1 核心组件介绍语言模型 (Brain)Phi-3-Mini-128K-Instruct。这是微软推出的一个非常小巧但能力不俗的模型。128K的超长上下文意味着它能处理很长的对话和文档Instruct版本则针对问答和指令跟随做了优化非常适合我们这个场景。关键是它足够轻量在消费级显卡甚至只用CPU上都能跑起来。文档解析器 (Eyes)我们需要工具来“读懂”各种格式的本地文件。比如用PyPDF2或pdfplumber处理PDF用python-docx处理Word用markdown库处理Markdown文件等。它们负责把二进制文件转换成模型能理解的纯文本。向量数据库 (Memory)这是实现精准检索的关键。我们先把文档文本切成小块片段然后用嵌入模型把它们转换成数学向量可以理解为一串数字代表这段文本的意思存到向量数据库里。常见的轻量级选择有ChromaDB或FAISS它们部署简单查询速度快。检索增强生成框架 (Orchestrator)我们需要一个框架来协调整个流程接收用户问题 - 转换成向量 - 去向量数据库搜索相似片段 - 把问题和相关片段一起送给模型生成答案。LangChain或LlamaIndex是这方面的优秀框架能大大简化我们的代码。网络搜索工具 (Web Crawler)为了让系统能获取最新网络信息我们需要一个安全、可控的搜索工具。这里我们可以使用百度搜索的API或其他合规的搜索服务来获取公开的网页信息。请注意必须使用合法、公开的API接口并严格遵守其服务条款和速率限制。2.2 环境搭建与安装假设你已经有Python环境建议3.8以上我们打开终端创建一个新的项目目录然后安装必要的包。# 创建项目目录并进入 mkdir personal_knowledge_base cd personal_knowledge_base # 创建虚拟环境可选但推荐 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate # 安装核心依赖 pip install torch transformers # PyTorch和Transformers库用于运行模型 pip install sentence-transformers # 用于生成文本向量的嵌入模型 pip install chromadb # 轻量级向量数据库 pip install langchain langchain-community # LangChain框架及其社区组件 pip install pypdf2 python-docx markdown # 文档解析器 pip install requests beautifulsoup4 # 用于网络请求和解析网页如果需要 # 注意百度搜索API通常需要安装其官方SDK请根据百度云官方文档安装例如 # pip install baidu-aip如果你的电脑有NVIDIA显卡并且想用GPU加速确保安装了对应版本的torch带CUDA支持。没有GPU也没关系Phi-3-Mini在CPU上运行也能接受。3. 分步构建你的智能知识库现在我们开始一步步把各个组件组装起来。我会尽量用清晰的代码和解释让你能看懂每一部分在做什么。3.1 第一步加载本地文档并切片首先我们得让系统能“吃进”你的本地知识。我们在项目目录下创建一个docs文件夹把你的PDF、Word、TXT等文档放进去。然后写一个脚本来读取和预处理这些文档# file_loader.py import os from langchain_community.document_loaders import PyPDFLoader, TextLoader, Docx2txtLoader from langchain.text_splitter import RecursiveCharacterTextSplitter def load_and_split_documents(docs_path): 加载指定路径下的所有文档并将其切分成小块。 documents [] for filename in os.listdir(docs_path): file_path os.path.join(docs_path, filename) if filename.endswith(.pdf): loader PyPDFLoader(file_path) elif filename.endswith(.docx): loader Docx2txtLoader(file_path) elif filename.endswith(.txt): loader TextLoader(file_path, encodingutf-8) else: print(f暂不支持的文件格式: {filename}) continue loaded_docs loader.load() documents.extend(loaded_docs) print(f已加载: {filename}) # 将长文档切分成重叠的小块便于后续检索 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个文本块大约500字符 chunk_overlap50, # 块之间重叠50字符避免上下文断裂 separators[\n\n, \n, 。, , , , , , ] ) split_docs text_splitter.split_documents(documents) print(f文档加载并切分完成共得到 {len(split_docs)} 个文本块。) return split_docs if __name__ __main__: # 假设你的文档放在 ./docs 目录下 all_splits load_and_split_documents(./docs)这段代码会遍历docs文件夹根据后缀名用不同的加载器读取内容然后统一用RecursiveCharacterTextSplitter切成一段段的小文本。重叠切割是为了防止一个完整的句子或概念被生生切断。3.2 第二步构建向量数据库知识记忆库文本切好了接下来要把它们转换成向量存起来。我们选用ChromaDB作为向量数据库并用一个开源的嵌入模型来生成向量。# vector_store.py from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma import os def create_vector_store(text_splits, persist_directory./chroma_db): 创建并持久化向量数据库。 # 使用一个轻量级的开源嵌入模型例如 all-MiniLM-L6-v2 embeddings_model HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2, model_kwargs{device: cpu}, # 如果没有GPU就用cpu encode_kwargs{normalize_embeddings: True} ) # 创建向量存储并将文本块及其向量持久化到本地磁盘 vectorstore Chroma.from_documents( documentstext_splits, embeddingembeddings_model, persist_directorypersist_directory ) # 确保数据保存到磁盘 vectorstore.persist() print(f向量数据库已创建并保存至 {persist_directory}) return vectorstore def load_vector_store(persist_directory./chroma_db): 加载已存在的向量数据库。 embeddings_model HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2 ) vectorstore Chroma( persist_directorypersist_directory, embedding_functionembeddings_model ) print(向量数据库加载成功。) return vectorstore if __name__ __main__: # 首次运行创建向量库 # from file_loader import load_and_split_documents # splits load_and_split_documents(./docs) # vs create_vector_store(splits) # 之后运行直接加载 vs load_vector_store()运行一次后你的文档知识就以向量的形式保存在chroma_db文件夹里了。下次启动程序直接加载即可无需重复处理文档。3.3 第三步集成Phi-3-Mini模型与RAG链核心的大脑和协调器要上场了。我们用LangChain来组装一个RAG流水线。# rag_chain.py from langchain.chains import RetrievalQA from langchain_community.llms import HuggingFacePipeline from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch def create_phi3_llm(model_namemicrosoft/Phi-3-mini-128k-instruct): 加载Phi-3-Mini模型并将其包装成LangChain可用的LLM。 print(f正在加载模型: {model_name}...) tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 根据硬件情况选择加载方式 if torch.cuda.is_available(): model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度减少显存占用 device_mapauto, trust_remote_codeTrue ) else: # CPU运行 model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float32, device_mapcpu, trust_remote_codeTrue ) # 创建文本生成管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, # 生成答案的最大长度 temperature0.1, # 较低的温度使输出更确定、更聚焦 do_sampleTrue, ) llm HuggingFacePipeline(pipelinepipe) print(模型加载完成。) return llm def create_rag_qa_chain(llm, vectorstore): 创建检索增强生成RAG问答链。 # 创建一个检索器从向量库中获取最相关的k个文档片段 retriever vectorstore.as_retriever(search_kwargs{k: 4}) # 返回最相关的4个片段 # 创建QA链使用“stuff”方式将检索到的所有上下文和问题一起送入模型 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue, # 返回源文档方便追溯 verboseFalse # 设为True可以看到链的详细执行过程 ) return qa_chain if __name__ __main__: # 测试用 from vector_store import load_vector_store vs load_vector_store() llm create_phi3_llm() qa_chain create_rag_qa_chain(llm, vs) query 什么是LangChain result qa_chain({query: query}) print(问题, query) print(答案, result[result]) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[片段{i1}]: {doc.page_content[:200]}...) # 打印前200字符现在一个基于本地文档的智能问答系统就初具雏形了你可以问它任何你文档里涉及的内容。3.4 第四步接入网络搜索以百度搜索API为例为了让知识库不局限于本地文件我们给它加上“上网”的能力。这里以百度搜索API为例请确保你已注册百度云并创建了相关应用获取了合法的API Key和Secret Key。重要提示使用任何网络API都必须遵守其服务条款仅用于获取公开、合法的信息并注意请求频率限制。# web_searcher.py # 示例使用百度搜索API需提前安装baidu-aip并配置AK/SK from aip import AipNlp # 注意百度搜索通常使用其他服务如WebSearch这里以NLP服务为例说明配置。 # 实际搜索可能需要使用 requests 库调用百度搜索的网页端或定制API。 # 以下是一个概念性示例实际实现需参考百度云官方最新文档。 import requests import re class SimpleWebSearcher: 一个简化的网络搜索器示例。 实际生产中应使用官方、合规的API并做好错误处理和频率限制。 def __init__(self, api_keyNone, secret_keyNone): # 此处仅为示例结构实际参数和调用方式需根据百度云具体搜索API调整 self.api_key api_key self.secret_key secret_key # 初始化客户端等操作... # self.client AipNlp(api_key, secret_key) # 示例 def search(self, query, num_results3): 执行网络搜索返回搜索结果的摘要列表。 这是一个模拟示例真实调用需要替换为实际的API请求。 print(f[网络搜索] 正在查询: {query}) # 此处应替换为真实的、合规的API调用代码 # 例如使用 requests 向百度搜索的合法接口发送请求并解析返回的JSON。 # 以下为模拟返回数据仅供演示流程。 mock_results [ f关于{query}的公开信息摘要A。根据网络资料显示..., f关于{query}的公开信息摘要B。有文章指出..., f关于{query}的公开信息摘要C。最新讨论中提到... ] return mock_results[:num_results] def augment_query_with_web(qa_chain, web_searcher, user_query): 结合本地知识库和网络搜索的增强问答流程。 print(*50) print(f用户问题: {user_query}) print(-*50) # 1. 首先尝试从本地知识库获取答案 print([步骤1] 正在从本地知识库检索...) local_result qa_chain({query: user_query}) local_answer local_result[result] local_sources local_result.get(source_documents, []) # 2. 同时进行网络搜索针对需要最新或外部信息的问题 # 这里可以加一个判断例如如果问题包含“最新”、“最近”、“新闻”等词或者本地答案置信度低则触发搜索 print([步骤2] 正在从网络获取补充信息...) web_snippets web_searcher.search(user_query, num_results2) # 3. 融合信息生成最终答案这里采用简单拼接更复杂的可以设计提示词让模型整合 print([步骤3] 生成综合答案...) final_context f 基于以下信息回答问题 【本地文档信息】 {chr(10).join([f- {doc.page_content[:300]}... for doc in local_sources]) if local_sources else 本地知识库未找到直接相关文档。} 【网络补充信息】 {chr(10).join([f- {snippet} for snippet in web_snippets])} 问题{user_query} 请综合以上所有信息给出一个准确、全面的回答。如果信息有冲突请以本地文档信息为准。 # 将融合后的上下文和问题再次提交给模型 final_result qa_chain.llm_chain.run(final_context) print(-*50) print(【最终答案】) print(final_result) print(\n【答案依据】) if local_sources: print( 主要参考了以下本地文档片段) for i, doc in enumerate(local_sources[:2]): # 展示前两个来源 print(f 片段{i1}: {doc.page_content[:150]}...) if web_snippets: print( 并参考了网络信息。) print(*50) return final_result if __name__ __main__: # 示例用法 # 1. 初始化本地QA链 (需要先运行前面的代码准备好vectorstore和llm) # from rag_chain import create_phi3_llm, create_rag_qa_chain # from vector_store import load_vector_store # vs load_vector_store() # llm create_phi3_llm() # qa_chain create_rag_qa_chain(llm, vs) # 2. 初始化网络搜索器需填入真实API信息 # searcher SimpleWebSearcher(api_keyYOUR_API_KEY, secret_keyYOUR_SECRET_KEY) searcher SimpleWebSearcher() # 使用模拟搜索器 # 3. 进行增强问答 # augment_query_with_web(qa_chain, searcher, 什么是LangChain它最近有什么更新吗)这个流程展示了如何将本地检索和网络搜索的结果结合起来构造一个更丰富的上下文再让模型生成答案。在实际应用中你需要根据百度搜索API的具体接口文档来实现SimpleWebSearcher类中的search方法。4. 实际应用与效果体验把上面的模块组合起来我们就得到了一个完整的系统。你可以创建一个简单的命令行交互界面来使用它# main.py from vector_store import load_vector_store from rag_chain import create_phi3_llm, create_rag_qa_chain from web_searcher import SimpleWebSearcher, augment_query_with_web import sys def main(): print(正在初始化个人知识库系统...) # 1. 加载已有向量库 try: vectorstore load_vector_store() except: print(未找到已存在的向量数据库请先运行 vector_store.py 创建。) sys.exit(1) # 2. 加载模型第一次运行可能需要一些时间下载模型 llm create_phi3_llm() # 3. 创建本地RAG链 qa_chain create_rag_qa_chain(llm, vectorstore) # 4. 初始化网络搜索器请使用真实的API信息 # web_searcher SimpleWebSearcher(api_keyyour_key, secret_keyyour_secret) web_searcher SimpleWebSearcher() # 演示用模拟器 print(\n *60) print(系统启动成功) print(你可以开始提问了。输入 quit 或 exit 退出。) print(*60) while True: try: user_input input(\n你的问题: ).strip() if user_input.lower() in [quit, exit, 退出]: print(再见) break if not user_input: continue # 这里可以根据问题类型选择是否启用网络搜索 # 例如简单事实性问题只用本地需要最新信息的问题启用网络 use_web any(keyword in user_input for keyword in [最新, 最近, 新闻, 当前, 现在, 怎么样]) if use_web: augment_query_with_web(qa_chain, web_searcher, user_input) else: result qa_chain({query: user_input}) print(\n【答案】) print(result[result]) if result[source_documents]: print(\n 参考自本地文档。) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n出错了: {e}) if __name__ __main__: main()运行python main.py你就可以和你的知识库对话了。试着问一些你文档里明确有的问题比如某个产品的特性再问一些可能需要结合网络信息的问题比如“这个技术最近有什么新动态”。你会发现对于前者它能精准地从你的文档中找到依据对于后者它在本地检索的基础上还能尝试融入网络搜索到的信息在真实API配置后。5. 总结与后续优化建议跟着走完这一趟你应该已经成功搭建起了一个能同时处理本地文档和网络信息的个人智能知识库。用Phi-3-Mini作为核心好处是它对硬件要求比较亲民响应速度也快适合个人日常使用。整个流程从文档处理、向量化存储到检索生成算是把RAG的基本框架跑通了。实际用起来你可能会发现一些可以打磨的地方。比如文档切分的块大小和重叠度可以根据你文档的特点调整太碎了上下文不完整太大了检索可能不精准。网络搜索的部分目前只是简单拼接更聪明的做法是设计更好的提示词让模型自己判断哪些网络信息是相关的、可信的再整合进答案。如果想再进一步可以考虑给这个系统加个简单的Web界面用Gradio或Streamlit很快就能搭一个出来这样用起来更直观。还可以定期更新你的向量数据库把新的文档加进去。对于网络搜索一定要做好结果的清洗和过滤只保留高质量、可信的来源。这个项目就像一个乐高底座核心的RAG流程已经搭好了。你可以根据自己的需求更换更强大的模型当然对硬件要求也更高尝试不同的向量数据库或者集成更多的数据源比如Notion、Confluence。动手试试把它变成真正帮你提效的得力助手吧。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。
Phi-3-Mini-128K搭建个人知识库:连接网络与本地文档的智能问答系统
Phi-3-Mini-128K搭建个人知识库连接网络与本地文档的智能问答系统你是不是也遇到过这样的烦恼想查一个工作上的专业问题搜索引擎给出的答案要么太泛泛要么需要你从一堆网页里自己拼凑信息。或者公司内部有一大堆产品手册、技术文档、会议纪要每次想找点东西都得翻半天效率特别低。要是能有一个专属的“智能助手”不仅能像聊天一样回答你的问题还能同时从你指定的网页和本地文件里找到最相关的信息那该多方便。今天我们就来动手搭建一个这样的系统。它就像一个为你量身定做的知识库大脑核心是微软开源的轻量级大模型Phi-3-Mini-128K再给它配上“眼睛”文档解析和“记忆”向量数据库让它既能看懂你的本地文件也能安全地浏览网络最终给你一个靠谱的答案。整个过程并不复杂跟着步骤走你也能拥有一个连接网络与本地知识的智能问答伙伴。1. 为什么需要这样的个人知识库在开始动手之前我们先聊聊为什么这个组合很有吸引力。传统的知识管理要么是手动整理文档要么是用一些简单的全文搜索工具。前者费时费力后者不够智能经常搜出一堆不相关的结果。而基于大模型和RAG检索增强生成技术构建的系统正好解决了这些痛点。它把大模型的理解、生成能力和精准的信息检索结合了起来。具体来说对我们普通用户有几个实实在在的好处信息融合能力强你可以问它“根据我们上周的项目会议纪要和官网最新的产品介绍客户A的需求重点是什么”。它能同时理解你的本地会议纪要和网络上的产品页给出综合判断。回答有据可查它生成的每一个答案背后都有来自你文档或指定网页的“证据”支持。你可以要求它告诉你答案是从哪段内容来的这样用起来更放心。高度个性化这个知识库完全基于你喂给它的资料本地文档和你允许它访问的网络信息。它学到的、能回答的都是你最关心的领域知识。成本与效率平衡像Phi-3-Mini这样的模型在保持不错效果的同时对硬件要求友好很适合个人或小团队在普通电脑上部署不用花费高昂的API调用费用。简单说它就是把你散落在各处电脑里、网络上的知识碎片用AI串联起来变成一个随问随答的“活”知识库。2. 搭建前的准备工作工欲善其事必先利其器。我们先来把需要的“工具”准备好。整个系统的架构可以理解为几个核心部分处理文档的、存储知识的、理解问题的、以及获取外部信息的。2.1 核心组件介绍语言模型 (Brain)Phi-3-Mini-128K-Instruct。这是微软推出的一个非常小巧但能力不俗的模型。128K的超长上下文意味着它能处理很长的对话和文档Instruct版本则针对问答和指令跟随做了优化非常适合我们这个场景。关键是它足够轻量在消费级显卡甚至只用CPU上都能跑起来。文档解析器 (Eyes)我们需要工具来“读懂”各种格式的本地文件。比如用PyPDF2或pdfplumber处理PDF用python-docx处理Word用markdown库处理Markdown文件等。它们负责把二进制文件转换成模型能理解的纯文本。向量数据库 (Memory)这是实现精准检索的关键。我们先把文档文本切成小块片段然后用嵌入模型把它们转换成数学向量可以理解为一串数字代表这段文本的意思存到向量数据库里。常见的轻量级选择有ChromaDB或FAISS它们部署简单查询速度快。检索增强生成框架 (Orchestrator)我们需要一个框架来协调整个流程接收用户问题 - 转换成向量 - 去向量数据库搜索相似片段 - 把问题和相关片段一起送给模型生成答案。LangChain或LlamaIndex是这方面的优秀框架能大大简化我们的代码。网络搜索工具 (Web Crawler)为了让系统能获取最新网络信息我们需要一个安全、可控的搜索工具。这里我们可以使用百度搜索的API或其他合规的搜索服务来获取公开的网页信息。请注意必须使用合法、公开的API接口并严格遵守其服务条款和速率限制。2.2 环境搭建与安装假设你已经有Python环境建议3.8以上我们打开终端创建一个新的项目目录然后安装必要的包。# 创建项目目录并进入 mkdir personal_knowledge_base cd personal_knowledge_base # 创建虚拟环境可选但推荐 python -m venv venv # 激活虚拟环境 # Windows: venv\Scripts\activate # Mac/Linux: source venv/bin/activate # 安装核心依赖 pip install torch transformers # PyTorch和Transformers库用于运行模型 pip install sentence-transformers # 用于生成文本向量的嵌入模型 pip install chromadb # 轻量级向量数据库 pip install langchain langchain-community # LangChain框架及其社区组件 pip install pypdf2 python-docx markdown # 文档解析器 pip install requests beautifulsoup4 # 用于网络请求和解析网页如果需要 # 注意百度搜索API通常需要安装其官方SDK请根据百度云官方文档安装例如 # pip install baidu-aip如果你的电脑有NVIDIA显卡并且想用GPU加速确保安装了对应版本的torch带CUDA支持。没有GPU也没关系Phi-3-Mini在CPU上运行也能接受。3. 分步构建你的智能知识库现在我们开始一步步把各个组件组装起来。我会尽量用清晰的代码和解释让你能看懂每一部分在做什么。3.1 第一步加载本地文档并切片首先我们得让系统能“吃进”你的本地知识。我们在项目目录下创建一个docs文件夹把你的PDF、Word、TXT等文档放进去。然后写一个脚本来读取和预处理这些文档# file_loader.py import os from langchain_community.document_loaders import PyPDFLoader, TextLoader, Docx2txtLoader from langchain.text_splitter import RecursiveCharacterTextSplitter def load_and_split_documents(docs_path): 加载指定路径下的所有文档并将其切分成小块。 documents [] for filename in os.listdir(docs_path): file_path os.path.join(docs_path, filename) if filename.endswith(.pdf): loader PyPDFLoader(file_path) elif filename.endswith(.docx): loader Docx2txtLoader(file_path) elif filename.endswith(.txt): loader TextLoader(file_path, encodingutf-8) else: print(f暂不支持的文件格式: {filename}) continue loaded_docs loader.load() documents.extend(loaded_docs) print(f已加载: {filename}) # 将长文档切分成重叠的小块便于后续检索 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每个文本块大约500字符 chunk_overlap50, # 块之间重叠50字符避免上下文断裂 separators[\n\n, \n, 。, , , , , , ] ) split_docs text_splitter.split_documents(documents) print(f文档加载并切分完成共得到 {len(split_docs)} 个文本块。) return split_docs if __name__ __main__: # 假设你的文档放在 ./docs 目录下 all_splits load_and_split_documents(./docs)这段代码会遍历docs文件夹根据后缀名用不同的加载器读取内容然后统一用RecursiveCharacterTextSplitter切成一段段的小文本。重叠切割是为了防止一个完整的句子或概念被生生切断。3.2 第二步构建向量数据库知识记忆库文本切好了接下来要把它们转换成向量存起来。我们选用ChromaDB作为向量数据库并用一个开源的嵌入模型来生成向量。# vector_store.py from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma import os def create_vector_store(text_splits, persist_directory./chroma_db): 创建并持久化向量数据库。 # 使用一个轻量级的开源嵌入模型例如 all-MiniLM-L6-v2 embeddings_model HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2, model_kwargs{device: cpu}, # 如果没有GPU就用cpu encode_kwargs{normalize_embeddings: True} ) # 创建向量存储并将文本块及其向量持久化到本地磁盘 vectorstore Chroma.from_documents( documentstext_splits, embeddingembeddings_model, persist_directorypersist_directory ) # 确保数据保存到磁盘 vectorstore.persist() print(f向量数据库已创建并保存至 {persist_directory}) return vectorstore def load_vector_store(persist_directory./chroma_db): 加载已存在的向量数据库。 embeddings_model HuggingFaceEmbeddings( model_namesentence-transformers/all-MiniLM-L6-v2 ) vectorstore Chroma( persist_directorypersist_directory, embedding_functionembeddings_model ) print(向量数据库加载成功。) return vectorstore if __name__ __main__: # 首次运行创建向量库 # from file_loader import load_and_split_documents # splits load_and_split_documents(./docs) # vs create_vector_store(splits) # 之后运行直接加载 vs load_vector_store()运行一次后你的文档知识就以向量的形式保存在chroma_db文件夹里了。下次启动程序直接加载即可无需重复处理文档。3.3 第三步集成Phi-3-Mini模型与RAG链核心的大脑和协调器要上场了。我们用LangChain来组装一个RAG流水线。# rag_chain.py from langchain.chains import RetrievalQA from langchain_community.llms import HuggingFacePipeline from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch def create_phi3_llm(model_namemicrosoft/Phi-3-mini-128k-instruct): 加载Phi-3-Mini模型并将其包装成LangChain可用的LLM。 print(f正在加载模型: {model_name}...) tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) # 根据硬件情况选择加载方式 if torch.cuda.is_available(): model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度减少显存占用 device_mapauto, trust_remote_codeTrue ) else: # CPU运行 model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float32, device_mapcpu, trust_remote_codeTrue ) # 创建文本生成管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens512, # 生成答案的最大长度 temperature0.1, # 较低的温度使输出更确定、更聚焦 do_sampleTrue, ) llm HuggingFacePipeline(pipelinepipe) print(模型加载完成。) return llm def create_rag_qa_chain(llm, vectorstore): 创建检索增强生成RAG问答链。 # 创建一个检索器从向量库中获取最相关的k个文档片段 retriever vectorstore.as_retriever(search_kwargs{k: 4}) # 返回最相关的4个片段 # 创建QA链使用“stuff”方式将检索到的所有上下文和问题一起送入模型 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, retrieverretriever, return_source_documentsTrue, # 返回源文档方便追溯 verboseFalse # 设为True可以看到链的详细执行过程 ) return qa_chain if __name__ __main__: # 测试用 from vector_store import load_vector_store vs load_vector_store() llm create_phi3_llm() qa_chain create_rag_qa_chain(llm, vs) query 什么是LangChain result qa_chain({query: query}) print(问题, query) print(答案, result[result]) print(\n--- 参考来源 ---) for i, doc in enumerate(result[source_documents]): print(f[片段{i1}]: {doc.page_content[:200]}...) # 打印前200字符现在一个基于本地文档的智能问答系统就初具雏形了你可以问它任何你文档里涉及的内容。3.4 第四步接入网络搜索以百度搜索API为例为了让知识库不局限于本地文件我们给它加上“上网”的能力。这里以百度搜索API为例请确保你已注册百度云并创建了相关应用获取了合法的API Key和Secret Key。重要提示使用任何网络API都必须遵守其服务条款仅用于获取公开、合法的信息并注意请求频率限制。# web_searcher.py # 示例使用百度搜索API需提前安装baidu-aip并配置AK/SK from aip import AipNlp # 注意百度搜索通常使用其他服务如WebSearch这里以NLP服务为例说明配置。 # 实际搜索可能需要使用 requests 库调用百度搜索的网页端或定制API。 # 以下是一个概念性示例实际实现需参考百度云官方最新文档。 import requests import re class SimpleWebSearcher: 一个简化的网络搜索器示例。 实际生产中应使用官方、合规的API并做好错误处理和频率限制。 def __init__(self, api_keyNone, secret_keyNone): # 此处仅为示例结构实际参数和调用方式需根据百度云具体搜索API调整 self.api_key api_key self.secret_key secret_key # 初始化客户端等操作... # self.client AipNlp(api_key, secret_key) # 示例 def search(self, query, num_results3): 执行网络搜索返回搜索结果的摘要列表。 这是一个模拟示例真实调用需要替换为实际的API请求。 print(f[网络搜索] 正在查询: {query}) # 此处应替换为真实的、合规的API调用代码 # 例如使用 requests 向百度搜索的合法接口发送请求并解析返回的JSON。 # 以下为模拟返回数据仅供演示流程。 mock_results [ f关于{query}的公开信息摘要A。根据网络资料显示..., f关于{query}的公开信息摘要B。有文章指出..., f关于{query}的公开信息摘要C。最新讨论中提到... ] return mock_results[:num_results] def augment_query_with_web(qa_chain, web_searcher, user_query): 结合本地知识库和网络搜索的增强问答流程。 print(*50) print(f用户问题: {user_query}) print(-*50) # 1. 首先尝试从本地知识库获取答案 print([步骤1] 正在从本地知识库检索...) local_result qa_chain({query: user_query}) local_answer local_result[result] local_sources local_result.get(source_documents, []) # 2. 同时进行网络搜索针对需要最新或外部信息的问题 # 这里可以加一个判断例如如果问题包含“最新”、“最近”、“新闻”等词或者本地答案置信度低则触发搜索 print([步骤2] 正在从网络获取补充信息...) web_snippets web_searcher.search(user_query, num_results2) # 3. 融合信息生成最终答案这里采用简单拼接更复杂的可以设计提示词让模型整合 print([步骤3] 生成综合答案...) final_context f 基于以下信息回答问题 【本地文档信息】 {chr(10).join([f- {doc.page_content[:300]}... for doc in local_sources]) if local_sources else 本地知识库未找到直接相关文档。} 【网络补充信息】 {chr(10).join([f- {snippet} for snippet in web_snippets])} 问题{user_query} 请综合以上所有信息给出一个准确、全面的回答。如果信息有冲突请以本地文档信息为准。 # 将融合后的上下文和问题再次提交给模型 final_result qa_chain.llm_chain.run(final_context) print(-*50) print(【最终答案】) print(final_result) print(\n【答案依据】) if local_sources: print( 主要参考了以下本地文档片段) for i, doc in enumerate(local_sources[:2]): # 展示前两个来源 print(f 片段{i1}: {doc.page_content[:150]}...) if web_snippets: print( 并参考了网络信息。) print(*50) return final_result if __name__ __main__: # 示例用法 # 1. 初始化本地QA链 (需要先运行前面的代码准备好vectorstore和llm) # from rag_chain import create_phi3_llm, create_rag_qa_chain # from vector_store import load_vector_store # vs load_vector_store() # llm create_phi3_llm() # qa_chain create_rag_qa_chain(llm, vs) # 2. 初始化网络搜索器需填入真实API信息 # searcher SimpleWebSearcher(api_keyYOUR_API_KEY, secret_keyYOUR_SECRET_KEY) searcher SimpleWebSearcher() # 使用模拟搜索器 # 3. 进行增强问答 # augment_query_with_web(qa_chain, searcher, 什么是LangChain它最近有什么更新吗)这个流程展示了如何将本地检索和网络搜索的结果结合起来构造一个更丰富的上下文再让模型生成答案。在实际应用中你需要根据百度搜索API的具体接口文档来实现SimpleWebSearcher类中的search方法。4. 实际应用与效果体验把上面的模块组合起来我们就得到了一个完整的系统。你可以创建一个简单的命令行交互界面来使用它# main.py from vector_store import load_vector_store from rag_chain import create_phi3_llm, create_rag_qa_chain from web_searcher import SimpleWebSearcher, augment_query_with_web import sys def main(): print(正在初始化个人知识库系统...) # 1. 加载已有向量库 try: vectorstore load_vector_store() except: print(未找到已存在的向量数据库请先运行 vector_store.py 创建。) sys.exit(1) # 2. 加载模型第一次运行可能需要一些时间下载模型 llm create_phi3_llm() # 3. 创建本地RAG链 qa_chain create_rag_qa_chain(llm, vectorstore) # 4. 初始化网络搜索器请使用真实的API信息 # web_searcher SimpleWebSearcher(api_keyyour_key, secret_keyyour_secret) web_searcher SimpleWebSearcher() # 演示用模拟器 print(\n *60) print(系统启动成功) print(你可以开始提问了。输入 quit 或 exit 退出。) print(*60) while True: try: user_input input(\n你的问题: ).strip() if user_input.lower() in [quit, exit, 退出]: print(再见) break if not user_input: continue # 这里可以根据问题类型选择是否启用网络搜索 # 例如简单事实性问题只用本地需要最新信息的问题启用网络 use_web any(keyword in user_input for keyword in [最新, 最近, 新闻, 当前, 现在, 怎么样]) if use_web: augment_query_with_web(qa_chain, web_searcher, user_input) else: result qa_chain({query: user_input}) print(\n【答案】) print(result[result]) if result[source_documents]: print(\n 参考自本地文档。) except KeyboardInterrupt: print(\n\n程序被中断。) break except Exception as e: print(f\n出错了: {e}) if __name__ __main__: main()运行python main.py你就可以和你的知识库对话了。试着问一些你文档里明确有的问题比如某个产品的特性再问一些可能需要结合网络信息的问题比如“这个技术最近有什么新动态”。你会发现对于前者它能精准地从你的文档中找到依据对于后者它在本地检索的基础上还能尝试融入网络搜索到的信息在真实API配置后。5. 总结与后续优化建议跟着走完这一趟你应该已经成功搭建起了一个能同时处理本地文档和网络信息的个人智能知识库。用Phi-3-Mini作为核心好处是它对硬件要求比较亲民响应速度也快适合个人日常使用。整个流程从文档处理、向量化存储到检索生成算是把RAG的基本框架跑通了。实际用起来你可能会发现一些可以打磨的地方。比如文档切分的块大小和重叠度可以根据你文档的特点调整太碎了上下文不完整太大了检索可能不精准。网络搜索的部分目前只是简单拼接更聪明的做法是设计更好的提示词让模型自己判断哪些网络信息是相关的、可信的再整合进答案。如果想再进一步可以考虑给这个系统加个简单的Web界面用Gradio或Streamlit很快就能搭一个出来这样用起来更直观。还可以定期更新你的向量数据库把新的文档加进去。对于网络搜索一定要做好结果的清洗和过滤只保留高质量、可信的来源。这个项目就像一个乐高底座核心的RAG流程已经搭好了。你可以根据自己的需求更换更强大的模型当然对硬件要求也更高尝试不同的向量数据库或者集成更多的数据源比如Notion、Confluence。动手试试把它变成真正帮你提效的得力助手吧。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。