ollama部署本地大模型|embeddinggemma-300m企业知识图谱构建方案

想不想让公司内部堆积如山的文档、报告、产品手册“活”起来?让员工能像用搜索引擎一样,快速、准确地找到任何业务知识?今天,我们就来聊聊如何用一个小巧但强大的工具——embeddinggemma-300m,结合 ollama 的便捷部署,为你的企业搭建一个专属的、可本地运行的智能知识图谱检索系统。

传统的关键词搜索,经常因为表述不同而找不到文档。比如,你搜“员工报销流程”,可能就找不到标题为“费用申请与核销指南”的文件。而基于向量嵌入(Embedding)的技术,能理解语义,即使字面不匹配,也能找到相关内容。embeddinggemma-300m 就是谷歌专为此类任务设计的轻量级模型,只有3亿参数,能在普通电脑上流畅运行,完美解决了企业数据隐私和部署成本高的痛点。

接下来,我将手把手带你完成从模型部署到构建一个简易知识图谱检索服务的全过程。你会发现,给企业装上“智慧大脑”,并没有想象中那么复杂。

1. 环境准备与ollama部署

在开始构建知识图谱之前,我们首先需要一个稳定的模型服务环境。Ollama 是一个极其友好的工具,它能让我们像安装软件一样,一键获取并运行各种大语言模型和嵌入模型。

1.1 安装Ollama

Ollama支持多个操作系统,安装过程非常简单。

  • 对于 macOS 和 Linux 用户,打开终端,直接运行以下命令:

    curl -fsSL https://ollama.com/install.sh | sh
    

    安装完成后,Ollama服务会自动启动。

  • 对于 Windows 用户,可以直接从 Ollama官网 下载安装程序,像安装普通软件一样完成安装。

安装完成后,你可以在终端或命令提示符里输入 ollama --version 来验证是否安装成功。

1.2 拉取并运行embeddinggemma-300m模型

有了Ollama,获取模型变得异常简单。embeddinggemma-300m模型已经内置在Ollama的模型库中。

在终端中执行以下命令,Ollama会自动下载并启动这个模型:

ollama run embeddinggemma:300m

第一次运行时会下载模型文件,可能需要几分钟,取决于你的网络速度。下载完成后,你会进入一个交互式界面,这证明模型已经成功加载并运行在后台了。

这里有个小技巧:如果你想在后台长期运行这个模型服务,以供其他程序调用,可以使用 serve 模式:

ollama serve

然后,在另一个终端窗口,用 run 命令启动模型。这样,模型服务就会一直运行,直到你手动停止它。

2. 理解Embedding与知识图谱的核心概念

在动手写代码前,我们花几分钟把核心思路理清楚。这样后面的每一步你都知道为什么要这么做。

2.1 什么是文本嵌入(Embedding)?

你可以把“嵌入”理解成一种“翻译”。它把一段文字(比如一个句子、一个段落)翻译成计算机更能理解的格式——一组数字(向量)

  • 关键点:这个“翻译”过程很智能。语义相近的文本,翻译成的数字组合(向量)在数学空间里的“距离”也会很近。
  • 举个例子:“我喜欢吃苹果”和“苹果是一种美味的水果”,这两句话的字面重合度不高,但经过embedding模型处理后的两个向量,它们的相似度会很高。而“我喜欢吃苹果”和“今天的天气真好”这两个向量,相似度就会很低。

embeddinggemma-300m 就是一个非常擅长做这种“翻译”的专家。

2.2 知识图谱检索是如何工作的?

我们的目标是构建一个检索系统,其核心流程可以概括为以下四步:

  1. 知识入库:把企业所有的文档(如PDF、Word、TXT)拆分成一段段文字(例如每段200字)。然后用embedding模型把每一段文字都“翻译”成一个向量,并和原文一起存到数据库里。这个过程就像给图书馆的每本书都做了一个独特的“语义指纹”。
  2. 问题转化:当用户提出一个问题,比如“公司年假制度是怎样的?”,我们用同样的embedding模型把这个问题也“翻译”成一个向量。
  3. 向量“寻亲”:在数据库里,快速寻找和“问题向量”最相似的那些“文档向量”。技术上,这叫做“向量相似度搜索”。
  4. 返回答案:把找到的最相关的几段原文,返回给用户。用户看到的就是最贴近他问题的公司制度条款。

整个过程,我们没有生成任何新内容,只是帮用户从已有的知识库中精准地找到了最相关的内容,这保证了信息的准确性和可控性。

3. 分步构建企业知识图谱检索系统

理论清楚了,我们开始动手搭建。我们将使用Python,因为它有丰富的AI生态库。主要会用到 chromadb 这个轻量级向量数据库,它非常适合我们这种本地化场景。

3.1 搭建项目环境

首先,创建一个新的项目文件夹,并安装必要的Python库。

# 创建项目文件夹并进入
mkdir enterprise-knowledge-base && cd enterprise-knowledge-base

# 创建虚拟环境(推荐)
python -m venv venv
# 激活虚拟环境
# Windows: venv\Scripts\activate
# Mac/Linux: source venv/bin/activate

# 安装核心库
pip install ollama chromadb pypdf2 python-docx sentence-transformers
  • ollama: 用于调用我们本地运行的embeddinggemma模型。
  • chromadb: 用于存储和检索向量。
  • pypdf2 / python-docx: 用于解析PDF和Word文档。
  • sentence-transformers: 这里我们其实用不上它的模型,但它的工具函数很好用。我们主要用 ollama 来生成向量。

3.2 第一步:创建知识库入库脚本

我们创建一个名为 ingest_docs.py 的脚本,它的任务是把文档“喂”给系统。

import os
import glob
from PyPDF2 import PdfReader
from docx import Document
import chromadb
from chromadb.config import Settings
import ollama

# 初始化 ChromaDB 客户端,数据持久化到本地目录
chroma_client = chromadb.PersistentClient(path="./knowledge_db")

# 获取或创建一个名为“enterprise_knowledge”的集合(类似数据库的表)
collection = chroma_client.get_or_create_collection(name="enterprise_knowledge")

def extract_text_from_file(file_path):
    """从不同格式的文件中提取文本"""
    text = ""
    if file_path.endswith('.pdf'):
        reader = PdfReader(file_path)
        for page in reader.pages:
            text += page.extract_text() + "\n"
    elif file_path.endswith('.docx'):
        doc = Document(file_path)
        for para in doc.paragraphs:
            if para.text.strip():
                text += para.text + "\n"
    elif file_path.endswith('.txt'):
        with open(file_path, 'r', encoding='utf-8') as f:
            text = f.read()
    else:
        print(f"暂不支持的文件格式: {file_path}")
    return text.strip()

def split_text_into_chunks(text, chunk_size=500, overlap=50):
    """将长文本分割成有重叠的小块,避免语义断裂"""
    words = text.split()
    chunks = []
    for i in range(0, len(words), chunk_size - overlap):
        chunk = ' '.join(words[i:i + chunk_size])
        chunks.append(chunk)
        if i + chunk_size >= len(words):
            break
    return chunks

def get_embedding(text):
    """调用本地ollama服务的embeddinggemma模型生成向量"""
    response = ollama.embeddings(model='embeddinggemma:300m', prompt=text)
    # 返回的向量是一个浮点数列表
    return response['embedding']

def ingest_documents(docs_folder="./docs"):
    """主函数:遍历文档文件夹,处理并存入向量数据库"""
    supported_extensions = ['*.pdf', '*.docx', '*.txt']
    all_files = []
    for ext in supported_extensions:
        all_files.extend(glob.glob(os.path.join(docs_folder, ext)))

    if not all_files:
        print(f"在目录 {docs_folder} 中未找到支持的文档。")
        return

    print(f"找到 {len(all_files)} 个文档,开始处理...")

    for file_path in all_files:
        print(f"正在处理: {os.path.basename(file_path)}")
        raw_text = extract_text_from_file(file_path)
        if not raw_text:
            print(f"  -> 未能提取文本,跳过。")
            continue

        chunks = split_text_into_chunks(raw_text)
        print(f"  -> 分割为 {len(chunks)} 个文本块。")

        for i, chunk in enumerate(chunks):
            # 为每个文本块生成唯一ID
            chunk_id = f"{os.path.basename(file_path)}_chunk_{i}"
            # 生成向量
            embedding = get_embedding(chunk)
            # 将元数据(原文、来源)和向量一起存入集合
            collection.add(
                embeddings=[embedding],
                documents=[chunk], # 存储原文,用于最终返回
                metadatas=[{"source": file_path}],
                ids=[chunk_id]
            )
        print(f"  -> 完成入库。")

    print("所有文档处理完成!知识库已就绪。")

if __name__ == "__main__":
    # 假设你的文档都放在项目根目录下的 `docs` 文件夹里
    ingest_documents(docs_folder="./docs")

如何使用这个脚本

  1. 在你的项目根目录下,创建一个名为 docs 的文件夹。
  2. 把公司的PDF、Word或TXT文档(比如员工手册、产品白皮书、项目报告)放进去。
  3. 确保你的ollama服务正在运行(ollama run embeddinggemma:300m 在另一个终端运行着)。
  4. 在终端运行 python ingest_docs.py

脚本会自动读取、分割文档,调用本地的embeddinggemma模型为每一段文本生成向量,并存储到本地的 knowledge_db 目录中。这个过程可能会花费一些时间,取决于文档的数量和大小。

3.3 第二步:创建智能检索脚本

知识库建好了,现在我们来打造一个“问答接口”。创建 query_knowledge.py 脚本。

import chromadb
from chromadb.config import Settings
import ollama

# 连接到已有的知识库
chroma_client = chromadb.PersistentClient(path="./knowledge_db")
collection = chroma_client.get_collection(name="enterprise_knowledge")

def get_embedding(text):
    """与入库时使用相同的函数生成向量"""
    response = ollama.embeddings(model='embeddinggemma:300m', prompt=text)
    return response['embedding']

def query_knowledge(question, top_k=3):
    """核心检索函数"""
    # 1. 将用户问题转化为向量
    question_embedding = get_embedding(question)

    # 2. 在向量数据库中搜索最相似的top_k个文本块
    results = collection.query(
        query_embeddings=[question_embedding],
        n_results=top_k
    )

    # 3. 整理并返回结果
    if results['documents']:
        print(f"\n对于你的问题:'{question}'")
        print(f"以下是知识库中最相关的 {top_k} 条信息:\n")
        for i, (doc, meta) in enumerate(zip(results['documents'][0], results['metadatas'][0])):
            print(f"【结果 {i+1}】")
            print(f"内容:{doc[:300]}...")  # 只打印前300字符预览
            print(f"来源:{meta['source']}")
            print("-" * 50)
        return results['documents'][0] # 返回完整的文档列表
    else:
        print("未在知识库中找到相关信息。")
        return []

if __name__ == "__main__":
    # 示例:进行一个查询
    user_question = input("请输入你想查询的问题:")
    query_knowledge(user_question)

这个脚本就是整个系统的“大脑”。当你运行它并输入一个问题时,它会瞬间完成“问题向量化 -> 向量检索 -> 返回原文”的流程。

3.4 第三步:运行与测试

让我们把整个流程串起来,看看效果。

  1. 准备文档:在 ./docs 文件夹里放一份简化的《员工手册.txt》,内容包含“年假”、“报销”、“考勤”等章节。
  2. 构建知识库:运行 python ingest_docs.py。看到处理完成的提示。
  3. 启动问答:运行 python query_knowledge.py
    • 试试问:“请问公司的年假有多少天?”
    • 再试试问:“员工生病请假需要什么流程?”

你会发现,即使你的问题措辞和手册原文不完全一样,系统也能准确地定位到相关段落。这就是语义搜索的魅力。

4. 进阶优化与应用扩展

基础系统跑通了,我们可以让它变得更强大、更好用。

4.1 系统优化建议

  • 提升检索精度:调整 ingest_docs.py 中的 chunk_size(文本块大小)和 overlap(重叠长度)。对于法律条文或技术文档,较小的块(如300字)和一定的重叠(如50字)能保证检索结果更精准。
  • 添加元数据过滤:在存入数据时,可以添加更多元数据,如 {"source": "handbook.pdf", "department": "HR", "year": "2023"}。这样在查询时,可以要求只搜索“财务部2024年的文档”,让结果更精准。
  • 实现简单对话记忆:在 query_knowledge.py 中,可以记录之前的问答历史,并将其作为上下文与当前问题拼接后再进行向量化,让系统能处理“上面说的那个政策,具体怎么申请?”这类指代性问题。

4.2 扩展为实际应用场景

这个核心检索能力可以轻松集成到各种企业应用中:

  • 智能客服机器人:将产品FAQ、售后政策文档入库。当用户咨询时,机器人后台调用这个检索系统获取最准确的答案,再让一个大语言模型(如同样用Ollama部署的Llama 3)润色成自然对话回复给用户。
  • 研发知识中枢:将所有的技术文档、API手册、项目复盘报告、代码库的README入库。新员工或遇到技术难题的工程师,可以快速找到相关解决方案和历史经验。
  • 合同与法务审查助手:将历史合同模板、法律法规、风险案例入库。法务人员在起草或审查合同时,可以快速检索到类似条款的表述和潜在风险点。

5. 总结

通过本文的实践,我们完成了一件很有价值的事:利用 ollamaembeddinggemma-300m,以极低的成本和门槛,在本地构建了一个属于企业自己的智能知识图谱检索系统。

回顾一下关键收获

  1. 部署极简:Ollama让大模型部署变得像安装软件一样简单,embeddinggemma-300m的小体量让它在普通服务器甚至高性能PC上都能轻松运行。
  2. 数据安全:所有数据(文档、向量)都在本地处理和存储,彻底避免了敏感企业数据上传云端的安全风险。
  3. 效果显著:基于语义的向量检索,从根本上提升了知识查找的准确率和用户体验,告别了“关键词匹配”的笨拙时代。
  4. 扩展性强:我们搭建的是一个核心“引擎”。这个引擎可以很方便地嵌入到企业微信、OA系统、内部网站等任何需要知识查询的地方。

技术的价值在于落地。与其观望,不如现在就动手,挑选一个最痛的部门知识管理场景,用这个方案做一次小范围试点。你会发现,赋能企业智慧化,或许就从这几百行代码开始。


获取更多AI镜像

想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐