我的植物

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 42|回复: 0

[工作文档] ollama 相关

[复制链接]

8万

主题

52

回帖

7834

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7834
发表于 2025-12-9 13:40:12 | 显示全部楼层 |阅读模式
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,让模型基于知识库回答。
本站全部资源免费下载。开通权限请联系站长管理员
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|网站地图|我的植物 ( 京ICP备15066774号-2 )|网站地图

GMT+8, 2026-4-6 22:14 , Processed in 0.031399 second(s), 29 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表