借助 Ollama 和 Embeddings 构建智能知识图谱问答系统
引言
在信息爆炸的时代,如何高效地检索和利用非结构化数据成为了一个核心挑战。传统的关键词搜索往往难以理解语义,导致结果不够精准。知识图谱(Knowledge Graph)通过将实体和关系结构化,能够更直观地展示信息间的关联。然而,构建和维护知识图谱通常需要复杂的工程能力。
本文将介绍如何利用 Ollama 本地大模型能力和 Embeddings 向量技术,快速搭建一个轻量级的智能知识图谱问答系统。这套方案不仅适合个人开发者构建知识库,也适用于企业搭建内部知识检索系统。
一、核心概念解析
1. 什么是知识图谱?
知识图谱本质上是一种语义网络,由节点(实体)和边(关系)组成。例如,"乔布斯"是节点,"苹果公司"是节点,两者之间通过"创始人"这一关系连接。通过图结构,我们可以存储复杂的多跳关系,而不仅仅是扁平的文档。
2. 为什么需要 Embeddings?
自然语言查询(如"苹果公司的创始人是谁")与数据库中的结构化文本并不直接匹配。Embeddings(嵌入)技术将文本转换为高维向量空间中的点。语义相似的文本在向量空间中距离更近。通过计算查询向量与知识库向量的相似度,可以实现语义搜索,而非简单的字符串匹配。
3. Ollama 的角色
Ollama 是一个开源的大模型运行工具,支持本地部署多种模型(如 Llama3)。它提供了便捷的 API 接口,可以生成高质量的文本嵌入(Embeddings),无需依赖昂贵的云端服务,保证了数据隐私和低延迟。
二、环境准备
在开始之前,请确保您的开发环境满足以下要求:
- 操作系统:Linux, macOS 或 Windows (WSL)。
- Python 版本:建议 Python 3.8 及以上。
- 依赖库安装:
pip install numpy requests sqlite3 annoy - Ollama 服务:
- 访问 ollama.com 下载并安装 Ollama。
- 启动服务后,拉取支持 Embedding 的模型(如
nomic-embed-text或llama3.1:8b配合特定配置)。 - 验证服务:
curl http://localhost:11434/api/embed
三、系统实现步骤
1. 数据准备与数据库设计
首先,我们需要定义数据存储结构。为了演示方便,我们使用 SQLite 存储原始文本和对应的向量数据。虽然生产环境建议使用专门的向量数据库(如 Milvus, Pinecone),但 SQLite 足以支撑原型开发。
import sqlite3
import numpy as np
def create_database(db_path='knowledge_graph.db'):
"""
创建 SQLite 数据库表,用于存储文本及其 Embedding 向量。
"""
conn = sqlite3.connect(db_path)
c = conn.cursor()
# 创建表结构:id, text, embedding (BLOB), is_question (标记是否为问题)
c.execute()
conn.commit()
conn


