|
|
Ollama 本身没有直接 “导入知识库” 到模型内部的功能(模型参数无法直接修改),但可以通过「RAG(检索增强生成)」方案实现:把知识库转换成向量存储到本地向量库,用户提问时先检索知识库的相关内容,再将「检索结果 + 提问」一起发给 qwen3-vl:4B 生成回答(全程本地化)。
以下是新手友好的实操步骤,基于 Python + 轻量向量库 Chroma 实现:
一、核心前提(已完成可跳过)- Ollama 已安装且运行正常(ollama serve 后台运行);
- qwen3-vl:4B 已下载(ollama list 能看到该模型);
- 安装 Python(3.8+),建议用虚拟环境。
二、步骤 1:安装必备依赖打开终端 / 命令行,执行以下指令安装依赖(涵盖文档解析、向量库、Ollama 调用):
[color=rgba(255, 255, 255, 0.55)]bash
[color=rgba(255, 255, 255, 0.55)]运行
[color=rgba(255, 255, 255, 0.5)]# 核心依赖:Chroma(轻量本地向量库)、LangChain(RAG框架)、文档解析库pip install chromadb langchain langchain-community python-docx pypdf ollama
三、步骤 2:预处理知识库文档1. 准备知识库文件把你的知识库文件(支持 PDF/Word/TXT/Markdown 等)放到一个文件夹里,比如 ./knowledge_base/。
2. 编写代码解析 + 分割文档创建 load_kb.py 文件,功能是:解析文档 → 分割成小片段(适配模型上下文长度)→ 导入向量库。
[color=rgba(255, 255, 255, 0.55)]python
[color=rgba(255, 255, 255, 0.55)]运行
from langchain_community.document_loaders import DirectoryLoader, PyPDFLoader, Docx2txtLoader, TextLoaderfrom langchain_text_splitters import RecursiveCharacterTextSplitterfrom langchain_community.embeddings import OllamaEmbeddingsfrom langchain_community.vectorstores import Chroma[color=rgba(255, 255, 255, 0.5)]# ---------------------- 1. 配置路径和模型 ----------------------[color=rgba(255, 255, 255, 0.5)]# 知识库文件夹路径KB_DIR = "./knowledge_base/"[color=rgba(255, 255, 255, 0.5)]# 向量库存储路径(本地文件夹,自动创建)CHROMA_DB_DIR = "./chroma_db/"[color=rgba(255, 255, 255, 0.5)]# 嵌入模型(Ollama 本地运行,选轻量的nomic-embed-text)EMBED_MODEL = "nomic-embed-text"[color=rgba(255, 255, 255, 0.5)]# Ollama 服务地址(默认本地11434)OLLAMA_BASE_URL = "http://localhost:11434"[color=rgba(255, 255, 255, 0.5)]# ---------------------- 2. 加载并解析文档 ----------------------[color=rgba(255, 255, 255, 0.5)]# 定义不同文档类型的加载器def load_documents(): [color=rgba(255, 255, 255, 0.5)]# 支持PDF/Word/TXT,可扩展其他格式 loaders = [ DirectoryLoader(KB_DIR, glob="*.pdf", loader_cls=PyPDFLoader), DirectoryLoader(KB_DIR, glob="*.docx", loader_cls=Docx2txtLoader), DirectoryLoader(KB_DIR, glob="*.txt", loader_cls=TextLoader), ] docs = [] for loader in loaders: docs.extend(loader.load()) return docs[color=rgba(255, 255, 255, 0.5)]# ---------------------- 3. 分割文档(关键:避免上下文过长) ----------------------def split_documents(docs): text_splitter = RecursiveCharacterTextSplitter( chunk_size=500, [color=rgba(255, 255, 255, 0.5)]# 每个片段500字符(可根据模型调整) chunk_overlap=50, [color=rgba(255, 255, 255, 0.5)]# 片段重叠50字符,保证上下文连贯 separators=["\n\n", "\n", "。", "!", "?", ",", "、", " ", ""], ) splits = text_splitter.split_documents(docs) print(f"文档分割完成,共生成 {len(splits)} 个片段") return splits[color=rgba(255, 255, 255, 0.5)]# ---------------------- 4. 导入向量库 ----------------------def init_chroma_db(splits): [color=rgba(255, 255, 255, 0.5)]# 初始化Ollama嵌入模型(本地运行) embeddings = OllamaEmbeddings( model=EMBED_MODEL, base_url=OLLAMA_BASE_URL ) [color=rgba(255, 255, 255, 0.5)]# 把文档片段转换成向量,存入Chroma本地库 db = Chroma.from_documents( documents=splits, embedding=embeddings, persist_directory=CHROMA_DB_DIR ) db.persist() [color=rgba(255, 255, 255, 0.5)]# 持久化到本地 print("知识库已成功导入向量库!") return db[color=rgba(255, 255, 255, 0.5)]# 主流程if __name__ == "__main__": [color=rgba(255, 255, 255, 0.5)]# 拉取嵌入模型(首次运行自动下载,约几百MB) import os os.system(f"ollama pull {EMBED_MODEL}") [color=rgba(255, 255, 255, 0.5)]# 加载→分割→导入 docs = load_documents() splits = split_documents(docs) init_chroma_db(splits)
四、步骤 3:运行代码导入知识库- 把知识库文件放到 ./knowledge_base/ 文件夹;
- 终端执行:python load_kb.py;
- 首次运行会自动下载 nomic-embed-text 嵌入模型(轻量,约 400MB);
- 等待文档解析、向量生成,完成后会生成 ./chroma_db/ 文件夹(即本地知识库向量库)。
五、步骤 4:调用 qwen3-vl:4B 结合知识库回答问题创建 chat_with_kb.py 文件,实现「提问→检索知识库→调用模型生成回答」的完整流程:
[color=rgba(255, 255, 255, 0.55)]python
[color=rgba(255, 255, 255, 0.55)]运行
from langchain_community.vectorstores import Chromafrom langchain_community.embeddings import OllamaEmbeddingsfrom langchain_community.llms import Ollamafrom langchain.chains import RetrievalQA[color=rgba(255, 255, 255, 0.5)]# ---------------------- 配置项 ----------------------CHROMA_DB_DIR = "./chroma_db/" [color=rgba(255, 255, 255, 0.5)]# 向量库路径EMBED_MODEL = "nomic-embed-text" [color=rgba(255, 255, 255, 0.5)]# 嵌入模型LLM_MODEL = "qwen3-vl:4B" [color=rgba(255, 255, 255, 0.5)]# 你的qwen3-vl模型OLLAMA_BASE_URL = "http://localhost:11434"[color=rgba(255, 255, 255, 0.5)]# ---------------------- 初始化组件 ----------------------[color=rgba(255, 255, 255, 0.5)]# 1. 初始化嵌入模型embeddings = OllamaEmbeddings( model=EMBED_MODEL, base_url=OLLAMA_BASE_URL)[color=rgba(255, 255, 255, 0.5)]# 2. 加载本地向量库db = Chroma( persist_directory=CHROMA_DB_DIR, embedding_function=embeddings)[color=rgba(255, 255, 255, 0.5)]# 3. 初始化Ollama的qwen3-vl模型llm = Ollama( model=LLM_MODEL, base_url=OLLAMA_BASE_URL, temperature=0.1 [color=rgba(255, 255, 255, 0.5)]# 温度越低,回答越精准(适合知识库问答))[color=rgba(255, 255, 255, 0.5)]# 4. 构建RAG链(检索+生成)qa_chain = RetrievalQA.from_chain_type( llm=llm, chain_type="stuff", [color=rgba(255, 255, 255, 0.5)]# 简单模式:把检索结果直接拼到prompt里 retriever=db.as_retriever(search_kwargs={"k": 3}), [color=rgba(255, 255, 255, 0.5)]# 检索Top3相关片段 return_source_documents=True [color=rgba(255, 255, 255, 0.5)]# 返回引用的知识库片段(可选))[color=rgba(255, 255, 255, 0.5)]# ---------------------- 对话交互 ----------------------def chat(): print("===== 基于知识库的qwen3-vl:4B对话(输入exit退出)=====") while True: query = input("\n你:") if query.lower() == "exit": break [color=rgba(255, 255, 255, 0.5)]# 调用RAG链 result = qa_chain.invoke({"query": query}) [color=rgba(255, 255, 255, 0.5)]# 输出回答 print(f"\nAI:{result['result']}") [color=rgba(255, 255, 255, 0.5)]# 可选:输出引用的知识库来源 print("\n引用的知识库片段:") for i, doc in enumerate(result["source_documents"]): print(f"[{i+1}] {doc.page_content[:200]}...(来源:{doc.metadata.get('source', '未知')})")if __name__ == "__main__": chat()
六、步骤 5:启动问答终端执行:python chat_with_kb.py,输入问题即可得到结合知识库的回答,例如:
[color=rgba(255, 255, 255, 0.55)]plaintext
[color=rgba(255, 255, 255, 0.55)]
===== 基于知识库的qwen3-vl:4B对话(输入exit退出)=====你:知识库中关于Ollama部署的注意事项有哪些?AI:Ollama部署时需注意以下几点:1. 硬件适配...(内容来自你的知识库)引用的知识库片段:[1] Ollama部署注意事项:1. 硬件不足时优先选7B及以下模型...(来源:./knowledge_base/ollama部署指南.pdf)
关键注意事项- qwen3-vl:4B 是多模态模型:如果你的知识库包含图片,需额外处理(用 qwen3-vl 的视觉能力解析图片内容,可参考 LangChain 的多模态文档加载器);
- 上下文长度限制:4B 模型的上下文窗口较小,文档分割时 chunk_size 建议设为 300-500,避免拼接后超出模型上限;
- 本地化验证:断网后运行 chat_with_kb.py,仍能正常回答,说明全程本地运行;
- 优化检索效果:
- 调整 search_kwargs={"k": 3} 中的 k 值(如 k=2),减少无关片段;
- 若回答未用到知识库,检查文档分割是否合理,或换用 chain_type="refine" 模式。
补充:如果想可视化 / 简化操作- 用 LangChain Chat 或 ChatUI 等前端工具,对接本地 Ollama 和 Chroma 向量库;
- 若不想写代码,可尝试开源工具如 LlamaIndex Chat、LocalAI,内置 RAG 功能,只需配置 Ollama 地址和知识库路径。
核心逻辑总结:知识库不导入 Ollama 模型,而是存入向量库,提问时先检索向量库,再把检索结果作为上下文传给 qwen3-vl:4B,让模型基于知识库回答。
|
|