资讯动态

SmolVLA本地知识库构建:从零搭建企业专属AI问答系统

发布时间:2026/8/8 15:59:37 来源:尧图企业网站定制
SmolVLA本地知识库构建从零搭建企业专属AI问答系统你是不是也遇到过这样的问题公司内部有海量的产品手册、技术文档、会议纪要每次想找个具体信息都得在文件夹里翻半天。或者新员工入职面对一堆资料无从下手只能一遍遍去问老同事。更头疼的是有些敏感的业务数据根本不敢放到公网上的AI工具里去查。今天咱们就来彻底解决这个问题。不用写复杂的代码不用租昂贵的服务器就在你自己的电脑上用开源的SmolVLA模型和向量数据库搭建一个完全属于你、完全懂你公司业务的AI问答助手。数据不出本地安全可控回答基于你的文档准确可靠。整个过程就像搭积木我会一步步带你走完。你不需要是AI专家只要会基本的命令行操作跟着做半天时间就能看到一个能回答你业务问题的“智能同事”跑起来。1. 动手之前先搞清楚我们要搭个什么东西在开始敲命令之前咱们花两分钟把整个系统的“骨架”摸清楚。这样后面每一步操作你都知道是在干什么为什么要这么干。想象一下你要教一个非常聪明但对你公司一无所知的新人就是SmolVLA模型。你不能指望它天生就懂你们公司的产品代号“Project Alpha”指的是哪个项目或者“Q3复盘会”上具体讨论了什么。所以我们的工作分三步走第一步把资料喂给它。我们把所有的PDF、Word、TXT文档拆解成一段段有意义的文字比如一个自然段或者几行相关的描述。这个过程叫“文档解析与分块”。第二步帮它建立“记忆索引”。光把文字喂进去不行得让它能快速找到相关内容。我们把这些文字段落转换成一种叫“向量”的数学形式可以理解成一段文字的数字指纹然后存进一个专门的高效数据库向量数据库。当用户提问时问题也会被转换成向量数据库能瞬间找出和这个问题“指纹”最相似的几段文字。第三步让它学会“参考作答”。当用户提问“Project Alpha的进度如何”系统不是让模型凭空编造而是先从“记忆索引”向量数据库里找出所有提到“Project Alpha”和“进度”的文档片段。然后我们把这些片段和用户的问题一起交给SmolVLA模型并告诉它“请根据下面这些资料回答用户的问题。”这样模型生成的答案就有了可靠的依据。整个流程你的原始文档、转换后的向量、以及最终的问答交互全部发生在你的本地电脑或内网服务器上。这就是“本地部署”的核心价值数据私有安全无忧。2. 环境准备给你的电脑装上必要的“工具箱”工欲善其事必先利其器。我们需要安装几个核心的Python库。别担心都是一条命令的事。我建议你创建一个独立的Python虚拟环境这样不会搞乱你电脑上其他的项目。打开你的终端Windows用CMD或PowerShellMac/Linux用Terminal跟着我一步步来。# 1. 创建一个新的目录来存放我们的项目 mkdir my_company_kb cd my_company_kb # 2. 创建并激活一个Python虚拟环境可选但强烈推荐 # 如果你使用conda: conda create -n company_kb python3.10 conda activate company_kb # 如果你使用venv: python -m venv venv # Windows激活: venv\Scripts\activate # Mac/Linux激活: source venv/bin/activate # 3. 安装最核心的库LangChain和向量数据库客户端 # LangChain是组装整个流程的“框架”Chroma是我们选用的轻量级向量数据库 pip install langchain langchain-community chromadb # 4. 安装文档加载和文本分割工具 # 用来读取PDF、Word等文件并把长文本切成小块 pip install pypdf python-docx tiktoken # 5. 安装嵌入模型和SmolVLA的运行依赖 # sentence-transformers用来生成文本向量transformers用来运行SmolVLA pip install sentence-transformers transformers torch安装过程可能会花几分钟取决于你的网速。如果遇到某个包安装慢可以尝试使用国内的镜像源比如在命令后面加上-i https://pypi.tuna.tsinghua.edu.cn/simple。安装完成后你可以用pip list看看是不是都有了。接下来我们准备一下测试用的文档。在你的项目文件夹里my_company_kb新建一个叫docs的文件夹然后往里放几个你们公司的文档。没有现成的没关系我帮你准备两个简单的示例文本文件你直接复制内容创建就行。在docs文件夹里创建product_intro.txt产品名称智能办公助手SmartOffice Assistant 核心功能1. 自动会议纪要生成与摘要。2. 跨平台日程智能同步。3. 内部知识库即时问答。 目标客户中小型企业、创业团队。 当前版本v2.1 下一阶段开发重点集成邮件客户端实现邮件内容智能分析与建议。再创建一个policy.txt2024年公司年度旅游政策调整通知。 一、旅游基金每人年度预算提升至3000元。 二、旅游时间建议安排在Q3或Q4需提前两周提交部门审批。 三、报销流程通过内部OA系统“福利申请”模块提交附件需包含机票、酒店发票。 生效日期2024年6月1日。 发布部门人力资源与行政部。好了我们的“工具箱”和“原材料”都齐了可以开始搭建了。3. 核心搭建四步构建知识库问答系统现在进入最核心的部分。我们会编写一个Python脚本把前面说的三步流程串起来。我会把完整的代码分块解释你完全可以复制粘贴然后根据自己的需要修改。在你的项目根目录my_company_kb下创建一个名为build_kb.py的文件。3.1 第一步加载并切割你的文档首先我们要把docs文件夹里的各种格式的文档读进来并把它们切成适合处理的小块。切得太碎会失去上下文切得太大又会影响检索精度。通常一个块在200-500字左右比较合适。# build_kb.py from langchain_community.document_loaders import DirectoryLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter # 1. 加载docs目录下的所有文本文件 # 如果你有PDF或Word可以换成 PyPDFLoader 或 Docx2txtLoader loader DirectoryLoader(./docs, glob**/*.txt, loader_clsTextLoader) documents loader.load() print(f成功加载了 {len(documents)} 个文档。) # 2. 将长文档分割成更小的块 text_splitter RecursiveCharacterTextSplitter( chunk_size300, # 每个块大约300个字符 chunk_overlap50, # 块与块之间重叠50字符避免把完整句子切碎 separators[\n\n, \n, 。, , , , , ] # 按这些符号优先切割 ) chunks text_splitter.split_documents(documents) print(f文档被分割成 {len(chunks)} 个文本块。) # 让我们看看第一个块是什么内容 print(\n--- 第一个文本块样例 ---) print(chunks[0].page_content[:200]) # 打印前200个字符运行一下看看效果在终端里执行python build_kb.py。你应该能看到加载的文档数和分割后的块数以及一个文本块的内容预览。这说明我们的文档读取和分割功能正常了。3.2 第二步将文本块转换为向量并存入数据库接下来我们要把这些文本块变成“向量”然后存进Chroma数据库。这里需要一个“嵌入模型”来执行转换。我们选用all-MiniLM-L6-v2这是一个在速度和效果上平衡得很好的开源模型它会自动下载。# build_kb.py (接上一部分代码) from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # 3. 初始化嵌入模型用于生成文本向量 # 第一次运行会下载模型文件大约80MB embedding_model HuggingFaceEmbeddings( model_nameall-MiniLM-L6-v2, # 轻量且效果不错的开源模型 model_kwargs{device: cpu}, # 使用CPU如果显卡好可改为 cuda encode_kwargs{normalize_embeddings: True} # 标准化向量有利于相似度计算 ) print(嵌入模型加载完毕。) # 4. 将文本块向量化并持久化存储到本地数据库 # persist_directory 指定数据库存储的文件夹 vector_db Chroma.from_documents( documentschunks, embeddingembedding_model, persist_directory./chroma_db # 向量数据库会保存在这个目录 ) vector_db.persist() # 确保数据写入磁盘 print(向量数据库已构建并保存至 ./chroma_db 目录。)再次运行脚本。这一步可能会慢一点因为要下载嵌入模型。完成后你会发现项目里多了一个chroma_db文件夹里面就是存储好的向量数据。以后我们重启程序直接加载这个文件夹就行不用每次都重新处理文档。3.3 第三步接入SmolVLA让它学会参考文档作答知识库建好了现在需要请出“大脑”——SmolVLA模型。我们将使用LangChain的链Chain来组装检索和生成两个步骤。这里的关键是创建一个“提示词模板”用来指导模型如何利用检索到的文档来回答问题。# build_kb.py (接上一部分代码) from langchain.chains import RetrievalQA from langchain.prompts import PromptTemplate from langchain_community.llms import HuggingFacePipeline from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch # 5. 加载SmolVLA模型这里以一个小型开源模型为例例如Qwen2.5-0.5B # 你可以替换成任何你喜欢的Hugging Face模型 model_name Qwen/Qwen2.5-0.5B-Instruct # 一个非常小的指令微调模型适合演示 print(f正在加载语言模型: {model_name}首次下载需要较长时间...) tokenizer AutoTokenizer.from_pretrained(model_name, trust_remote_codeTrue) model AutoModelForCausalLM.from_pretrained( model_name, torch_dtypetorch.float16, # 使用半精度减少内存占用 device_mapauto, # 自动分配至GPU或CPU trust_remote_codeTrue ) # 创建文本生成管道 pipe pipeline( text-generation, modelmodel, tokenizertokenizer, max_new_tokens256, # 生成答案的最大长度 temperature0.1, # 较低的温度使输出更确定、更基于事实 do_sampleTrue, ) # 将管道包装成LangChain的LLM对象 llm HuggingFacePipeline(pipelinepipe) print(语言模型加载完毕。) # 6. 创建自定义提示词模板告诉模型如何利用上下文 # 这是提升答案准确性的关键 prompt_template 请严格根据以下提供的上下文信息来回答问题。如果上下文中有明确答案请直接基于上下文回答。如果上下文中没有相关信息请直接说“根据现有资料我无法回答这个问题”不要编造信息。 上下文 {context} 问题{question} 请给出有帮助的答案 PROMPT PromptTemplate( templateprompt_template, input_variables[context, question] ) # 7. 创建检索问答链 # 这个链会自动完成检索相关文档 - 组合进提示词 - 发送给模型 - 返回答案 qa_chain RetrievalQA.from_chain_type( llmllm, chain_typestuff, # 简单地将所有检索到的文档内容“塞”进提示词 retrievervector_db.as_retriever(search_kwargs{k: 3}), # 检索最相关的3个文本块 chain_type_kwargs{prompt: PROMPT}, return_source_documentsTrue # 让我们可以看到它参考了哪些文档 ) print(问答系统构建完成)注意这里我用了Qwen2.5-0.5B-Instruct这个非常小的模型来演示确保大家都能跑起来。如果你的机器性能好尤其是GPU内存大完全可以换成更大的模型比如Qwen2.5-7B-Instruct或Llama-3-8B效果会好很多。第一次运行需要下载模型权重请耐心等待。3.4 第四步让我们来问第一个问题系统搭建完毕是时候验收成果了。我们写一个简单的问答循环或者直接测试几个问题。# build_kb.py (接上一部分代码) # 8. 进行问答测试 print(\n *50) print(知识库问答系统已就绪开始测试吧) print(输入 quit 或 退出 来结束程序。) print(*50) while True: query input(\n请输入你的问题) if query.lower() in [quit, 退出, exit]: print(再见) break # 获取答案和参考来源 result qa_chain.invoke({query: query}) answer result[result] source_docs result[source_documents] print(f\n【AI回答】\n{answer}) print(f\n【参考来源】) for i, doc in enumerate(source_docs): print(f 片段{i1}: {doc.page_content[:150]}...) # 打印每个参考片段的前150字符现在运行完整的脚本python build_kb.py。等待模型加载完成后你就可以提问了。试试用我们之前文档里的内容提问“我们公司的智能办公助手有哪些功能”“年度旅游的预算有多少怎么报销”“Project Alpha是什么”看看它如何应对知识库中没有的信息你应该能看到对于前两个问题它能从我们提供的文档片段中找出答案并组织成句。对于第三个问题它应该会老实地说无法回答。这就是我们想要的效果——知道就是知道不知道绝不胡说。4. 让系统变得更实用优化与进阶技巧基础系统跑通了但你可能觉得还有点“糙”。别急下面几个小技巧能让它变得更强大、更好用。4.1 优化检索效果找到更相关的资料有时候系统找出来的文档片段可能不是最贴切的。我们可以调整检索器Retriever的参数。# 在创建qa_chain时调整retriever参数 retriever vector_db.as_retriever( search_typemmr, # 使用“最大边际相关性”算法兼顾相关性和多样性 search_kwargs{k: 5, fetch_k: 20, lambda_mult: 0.7} # 返回5个结果从20个候选里选多样性系数0.7 ) # 然后用这个retriever替换之前的4.2 处理更多格式的文档我们之前只用了TXT文件。现实中还有PDF、PPT、Word、网页。LangChain提供了丰富的加载器。# 安装更多依赖 # pip install pypdf python-pptx beautifulsoup4 html2text from langchain_community.document_loaders import PyPDFLoader, UnstructuredWordDocumentLoader, UnstructuredPowerPointLoader, WebBaseLoader # 可以混合使用多种加载器或者继续使用DirectoryLoader并配置多个glob模式 pdf_loader PyPDFLoader(./docs/公司年报.pdf) word_loader UnstructuredWordDocumentLoader(./docs/产品需求文档.docx) # ... 加载后合并到 documents 列表里一起处理4.3 设计更聪明的提示词提示词是引导模型正确回答的“指挥棒”。一个好的提示词能极大提升答案质量。你可以根据业务场景定制。# 一个为技术客服场景优化的提示词模板 tech_support_template 你是一个专业的{company_name}技术客服助手。请根据提供的产品技术文档片段来解答用户问题。 回答要求 1. 准确答案必须严格基于上下文不添加任何外部知识。 2. 清晰分点说明对专业术语做简单解释。 3. 安全如果涉及故障处理必须优先提示“如涉及关键业务建议在测试环境先行验证”。 4. 存疑如果上下文信息不足以完全确定答案请指出不确定性。 相关技术资料 {context} 用户问题{question} 专业的技术支持回答 # 使用时可以将公司名称作为变量传入4.4 搭建一个简单的Web界面可选用命令行问答毕竟不方便。我们可以用Gradio快速搭一个网页界面分享给同事用。# 新建一个文件 app.py import gradio as gr from build_kb import qa_chain # 假设之前的代码封装成了函数或类 def answer_question(question, history): Gradio聊天函数 result qa_chain.invoke({query: question}) answer result[result] # 将对话历史格式化为Gradio需要的格式 history history or [] history.append((question, answer)) return history, history # 创建界面 with gr.Blocks(title公司知识库AI助手) as demo: gr.Markdown(## 公司专属知识库问答系统) chatbot gr.Chatbot(label对话历史) msg gr.Textbox(label请输入您的问题) clear gr.Button(清空对话) msg.submit(answer_question, [msg, chatbot], [chatbot, msg]) clear.click(lambda: None, None, chatbot, queueFalse) if __name__ __main__: demo.launch(server_name0.0.0.0, server_port7860) # 在浏览器打开 http://localhost:7860运行python app.py一个简单的聊天界面就出来了更直观易用。5. 回顾与展望你的专属AI助手已就位走完这一趟你会发现搭建一个本地化的企业知识库问答系统并没有想象中那么遥不可及。核心就是那三步处理文档、建立索引、关联问答。我们用的工具都是当前开源社区里成熟、热门的选项组合起来却能达到非常实用的效果。这套方案最大的优势就是掌控感。数据从始至终都在你手里不用担心泄露。你可以随时更新知识库把新的制度、新的产品手册丢进docs文件夹重新运行一下脚本你的AI助手就同步学到了最新知识。回答的风格、措辞也可以通过修改提示词来调整让它更符合你们公司的文化。当然今天搭建的是一个“标准版”。你可以根据需求给它升级“插件”。比如接入公司的OA系统让它能读取实时数据或者给它加上语音输入输出的能力做成一个智能语音助手再或者把多个部门的资料建成不同的知识库让它可以切换“专业领域”。最让我觉得有意思的是当你看到它第一次准确回答出某个非常具体的、只有你们公司员工才懂的问题时那种感觉就像教会了一个新同事。它可能一开始还有点笨拙但随着你不断优化文档、调整提示它会变得越来越“懂行”。技术本身不是目的解决实际问题才是。希望这个从零开始的指南能帮你打开一扇门用AI工具真正为你的团队提效。接下来就试着用你们真实的公司资料去喂养它吧看看它能成长为什么样的得力助手。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价