在这里插入图片描述

  【个人主页:玄同765

大语言模型(LLM)开发工程师中国传媒大学·数字媒体技术(智能交互与游戏设计)

深耕领域:大语言模型开发 / RAG知识库 / AI Agent落地 / 模型微调

技术栈:Python / LangChain/RAG(Dify+Redis+Milvus)| SQL/NumPy | FastAPI+Docker ️

工程能力:专注模型工程化部署、知识库构建与优化,擅长全流程解决方案 

     

「让AI交互更智能,让技术落地更高效」

欢迎技术探讨/项目合作! 关注我,解锁大模型与智能交互的无限可能!

引言

大模型本身具备强大的语言生成能力,但存在 “知识时效性差”“事实性错误” 等固有缺陷。要让大模型真正落地到企业场景,必须结合外部知识体系 —— 而知识库、知识图谱与向量数据库正是构建这一体系的核心工具:

  • 知识库解决 “知识怎么存” 的问题,是企业显性知识的集中存储库;
  • 知识图谱解决 “知识怎么关联” 的问题,通过实体与关系揭示知识背后的逻辑;
  • 向量数据库解决 “知识怎么快速找” 的问题,实现语义层面的精准检索。

三者并非互斥关系,在实际项目中经常组合使用,比如大模型 RAG(检索增强生成)系统中,知识库存储原始文档,向量数据库做语义召回,知识图谱补充关系推理能力。

一、知识库:企业显性知识的集中存储

1. 定义与核心特点

知识库是半结构化 / 非结构化知识的集中存储系统,用于管理企业内部的文档、FAQ、手册、报告等显性知识。核心特点包括:

  • 数据类型多样:支持文本、Markdown、PDF、图片等多种格式;
  • 组织方式灵活:可通过标签、分类、目录等方式进行结构化组织;
  • 核心能力:基于关键词的信息检索、全文搜索。

2. 适用场景

  • 智能客服 FAQ 问答;
  • 企业内部文档查询(如员工手册、技术文档);
  • 产品知识库、帮助中心;
  • 法律法规、政策文件检索。

3. 构建方法

知识库的构建流程可分为 4 个步骤:

  1. 数据收集:整合企业内部文档、公开数据、用户常见问题等;
  2. 数据清洗:去重、格式统一、纠错,将非结构化数据转换为半结构化(如 Markdown);
  3. 结构化存储:选择合适的存储介质,如本地文件系统、Confluence、SharePoint,或数据库(PostgreSQL、MongoDB);
  4. 索引优化:建立全文索引、标签索引,提升检索效率。

4. 使用示例:基于 LangChain 加载知识库

首先创建目录和示例 Markdown 文件:

mkdir enterprise_knowledge

然后创建一个示例文件 enterprise_knowledge/hr_policy.md :

# 企业人力资源政策

## 年假政策

所有正式员工每年享有15天带薪年假。
工作满5年的员工额外增加5天年假。

## 考勤制度

标准工作时间为周一至周五,上午9:00至下午
6:00。

之后创建python文件,执行如下代码:

from langchain_community.document_loaders import DirectoryLoader, TextLoader
from langchain_text_splitters import MarkdownTextSplitter
from langchain_community.vectorstores import FAISS
from langchain_openai import OpenAIEmbeddings
from dotenv import load_dotenv
import os

load_dotenv()

# 1. 加载本地Markdown知识库
if os.path.exists("./enterprise_knowledge"):
    loader = DirectoryLoader(
        path="./enterprise_knowledge",
        glob="*.md",
        loader_cls=TextLoader,
        loader_kwargs={"encoding": "utf-8"}
    )
    documents = loader.load()
else:
    # 使用示例数据
    print("目录不存在,使用示例数据...")
    from langchain_core.documents import Document
    sample_text = """# 企业人力资源政策

## 年假政策

所有正式员工每年享有15天带薪年假。
工作满5年的员工额外增加5天年假。

## 考勤制度

标准工作时间为周一至周五,上午9:00至下午6:00。
"""
    documents = [Document(page_content=sample_text, metadata={"source": "sample"})]

# 2. 分割文档(适配大模型上下文窗口)
# MarkdownTextSplitter 使用默认的 Markdown 分隔符,不需要指定 separators
text_splitter = MarkdownTextSplitter(
    chunk_size=1000,
    chunk_overlap=200
)
split_docs = text_splitter.split_documents(documents)

# 3. 构建向量索引(结合向量数据库提升检索效率)
# 注:FAISS是轻量级向量检索库,适合小规模数据场景;大规模生产环境可替换为Milvus、Pinecone等分布式向量数据库
embeddings = OpenAIEmbeddings()
vector_store = FAISS.from_documents(split_docs, embeddings)

# 4. 知识库检索
query = "企业员工年假政策是什么?"
retrieved_docs = vector_store.similarity_search(query, k=3)
for doc in retrieved_docs:
    print(f"【检索结果】\n{doc.page_content}\n")

二、知识图谱:揭示实体间的关系逻辑

1. 定义与核心特点

知识图谱是结构化的语义网络,以 “实体 - 关系 - 实体” 的三元组形式存储知识,核心是揭示事物之间的关联关系。核心特点包括:

  • 结构化表示:每个节点代表实体(如人、公司、产品),边代表实体间的关系(如 “同事”“属于”“购买”);
  • 关系推理能力:可通过图查询挖掘隐藏的关系(如 “张三的同事的客户是谁”);
  • 可视化能力:直观展示实体间的关联网络。

2. 适用场景

  • 金融风控:识别关联欺诈、洗钱行为;
  • 智能推荐:基于用户 - 商品 - 标签的关系推荐;
  • 知识问答:回答涉及关系的问题(如 “苹果公司的创始人是谁?”);
  • 社交网络分析:挖掘用户间的好友关系、影响力传播。

3. 构建方法

知识图谱的构建是一个复杂的工程流程,核心步骤包括:

  1. 需求分析:确定需要建模的实体类型(如人、公司)和关系类型(如 “创始人”“总部位于”);
  2. 数据获取:从结构化数据(数据库)、半结构化数据(网页)、非结构化数据(文本)中提取知识;
  3. 实体与关系抽取
    • 规则引擎:基于正则表达式抽取结构化信息;
    • 机器学习:使用 OpenIE(开放信息抽取)模型、LLM(如 GPT-4)自动抽取实体与关系;
  4. 图谱存储:选择图数据库(如 Neo4j、JanusGraph、NebulaGraph)存储三元组数据;
  5. 图谱验证与更新:人工校验抽取结果,定期更新实体与关系。

4. 使用示例:基于 Neo4j 构建企业组织图谱

from neo4j import GraphDatabase
import os

# 连接Neo4j数据库(使用默认值或环境变量)
uri = os.getenv("NEO4J_URI", "bolt://localhost:7687")
user = os.getenv("NEO4J_USER", "neo4j")
password = os.getenv("NEO4J_PASSWORD", "password")

# 检查URI格式
if not uri.startswith(("bolt://", "neo4j://")):
    print(f"警告: URI格式不正确 '{uri}',使用默认URI")
    uri = "bolt://localhost:7687"

try:
    driver = GraphDatabase.driver(uri, auth=(user, password))
    # 测试连接
    driver.verify_connectivity()
    print(f"成功连接到Neo4j: {uri}")
except Exception as e:
    print(f"无法连接到Neo4j: {e}")
    print("请确保:")
    print("1. Neo4j数据库已启动")
    print("2. 环境变量 NEO4J_URI, NEO4J_USER, NEO4J_PASSWORD 已正确设置")
    print("3. 或使用默认配置: bolt://localhost:7687 (用户名: neo4j, 密码: password)")
    exit(1)

# 1. 创建实体(员工、部门)
def create_employee(tx, name, position, department):
    tx.run(
        "MERGE (d:Department {name: $department}) "  # 用MERGE替代MATCH,部门不存在则自动创建,提升代码鲁棒性
        "CREATE (e:Employee {name: $name, position: $position}) "
        "CREATE (e)-[:属于]->(d)",
        name=name, position=position, department=department
    )

def create_department(tx, name, location):
    tx.run(
        "CREATE (d:Department {name: $name, location: $location})",
        name=name, location=location
    )

# 2. 插入数据
with driver.session() as session:
    # 创建部门
    session.execute_write(create_department, "技术部", "北京")
    session.execute_write(create_department, "市场部", "上海")
    # 创建员工并关联部门
    session.execute_write(create_employee, "张三", "后端开发工程师", "技术部")
    session.execute_write(create_employee, "李四", "产品经理", "技术部")
    session.execute_write(create_employee, "王五", "市场专员", "市场部")

# 3. 图查询:查找技术部的所有员工
def find_employees_by_department(tx, department_name):
    result = tx.run(
        "MATCH (e:Employee)-[:属于]->(d:Department {name: $name}) "
        "RETURN e.name, e.position",
        name=department_name
    )
    return [{"name": record["e.name"], "position": record["e.position"]} for record in result]

with driver.session() as session:
    employees = session.execute_read(find_employees_by_department, "技术部")
    print("技术部员工列表:")
    for emp in employees:
        print(f"- {emp['name']}:{emp['position']}")

driver.close()

三、向量数据库:语义层面的相似性检索

1. 定义与核心特点

向量数据库是专门用于存储、索引和检索高维向量的数据库,核心是通过嵌入模型(Embedding Model)将文本、图像、音频等非结构化数据转换为高维向量,实现语义层面的相似性匹配。核心特点包括:

  • 高维向量存储:支持存储数万到数十亿条高维向量(通常 128-1536 维);
  • 高效索引:基于 IVF、HNSW 等索引算法实现毫秒级相似性检索;
  • 语义匹配:不依赖关键词,基于内容语义进行检索(如 “猫的图片” 能召回 “老虎的图片”);
  • 混合存储能力:支持向量与结构化元数据(如标题、标签)联合存储,不适合直接存储大量非结构化原始文档(如完整 PDF、音频)。

2. 适用场景

  • 大模型 RAG 系统:召回与用户查询语义相似的文档;
  • 相似内容推荐:如短视频、文章推荐;
  • 多模态检索:图像、音频、视频的语义检索;
  • 代码检索:基于语义查找相似代码片段。

3. 构建方法

向量数据库的构建流程包括:

  1. 数据准备:收集需要检索的非结构化数据(文本、图像等);
  2. 嵌入模型选择:选择合适的嵌入模型将数据转换为向量,如 OpenAI Embeddings、BERT、Sentence-BERT;
  3. 向量存储:将向量插入向量数据库(如 Milvus、Pinecone、FAISS);
  4. 索引建立:根据数据规模和检索延迟要求,选择合适的索引类型(如 HNSW 适合高并发、IVF 适合大规模数据);
  5. 检索优化:调整相似度阈值、批量处理参数,提升检索准确性与效率。

4. 使用示例:基于 Milvus 实现文档语义检索

from pymilvus import connections, Collection, FieldSchema, CollectionSchema, DataType
from langchain_openai import OpenAIEmbeddings
import os
import numpy as np

# 1. 连接Milvus数据库(使用默认值或环境变量)
milvus_host = os.getenv("MILVUS_HOST", "localhost")
milvus_port = os.getenv("MILVUS_PORT", "19530")

try:
    connections.connect(
        alias="default",
        host=milvus_host,
        port=milvus_port
    )
    print(f"成功连接到Milvus: {milvus_host}:{milvus_port}")
except Exception as e:
    print(f"无法连接到Milvus: {e}")
    print("请确保:")
    print("1. Milvus数据库已启动")
    print("2. 环境变量 MILVUS_HOST, MILVUS_PORT 已正确设置")
    print("3. 或使用默认配置: localhost:19530")
    exit(1)

# 2. 定义向量集合结构
# 注:向量维度1536需与OpenAI Embeddings输出维度严格匹配;更换嵌入模型(如Sentence-BERT)需对应调整dim参数
fields = [
    FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=True),
    FieldSchema(name="doc_id", dtype=DataType.INT64),
    FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, dim=1536),
    FieldSchema(name="content", dtype=DataType.VARCHAR, max_length=2000)
]
schema = CollectionSchema(fields, "企业文档向量集合")
collection = Collection("enterprise_docs", schema)

# 3. 插入文档向量
embeddings_model = OpenAIEmbeddings()
documents = [
    "企业员工年假政策:工作满1年可享受5天年假,满3年10天,满10年15天。",
    "技术部出差补贴标准:一线城市每天300元,二线城市200元。",
    "市场部季度考核指标:新客户数量、品牌曝光量、活动转化率。"
]
doc_embeddings = embeddings_model.embed_documents(documents)
# 转换为Milvus支持的格式
insert_data = [
    [i for i in range(len(documents))],  # doc_id
    np.array(doc_embeddings).astype(np.float32),  # embedding
    documents  # content
]
collection.insert(insert_data)
collection.flush()

# 4. 创建索引并加载集合
index_params = {
    "index_type": "HNSW",
    "metric_type": "IP",
    "params": {"M": 16, "efConstruction": 100}
}
collection.create_index("embedding", index_params)
collection.load()

# 5. 语义检索:查询与"员工休假政策"相似的文档
query_text = "员工休假政策是什么?"
query_embedding = embeddings_model.embed_query(query_text)
search_params = {"metric_type": "IP", "params": {"ef": 64}}
results = collection.search(
    data=[np.array(query_embedding).astype(np.float32)],
    anns_field="embedding",
    param=search_params,
    limit=2,
    output_fields=["content"]
)

# 输出检索结果
print("语义检索结果:")
for hit in results[0]:
    print(f"相似度:{hit.score:.2f}\n内容:{hit.entity.get('content')}\n")

collection.release()

四、三者核心差异与选型指南

1. 核心差异对比

维度 知识库 知识图谱 向量数据库
数据结构 半结构化 / 非结构化(文本、文档) 结构化图(实体 - 关系 - 实体) 向量集合(高维浮点数数组)+ 元数据
核心能力 关键词检索、全文搜索 关系推理、图查询 语义匹配、相似性检索
适用场景 FAQ 问答、文档查询 风控、推荐、知识推理 相似文档查找、RAG、多模态检索
技术栈 LangChain、Elasticsearch、Confluence Neo4j、OpenIE、LLM Milvus、Pinecone、FAISS、Weaviate
优势 构建成本低、易于维护 揭示知识间的深层关系 语义理解能力强、检索效率高
劣势 无法处理复杂关系推理 构建成本高、依赖高质量数据 需嵌入模型转换数据、不适合存储大体积原始文档

2. 选型策略

  • 优先选知识库:若业务需求是基于文档的信息检索,如智能客服 FAQ、企业内部文档查询;
  • 优先选知识图谱:若业务需要挖掘实体间的关系,如金融风控、社交网络分析、商品推荐;
  • 优先选向量数据库:若业务需要语义层面的相似性匹配,如相似文档推荐、RAG 增强大模型、图像检索;
  • 组合使用:复杂场景下可结合三者优势,同时需注意数据一致性—— 例如知识库更新文档后,需同步更新向量数据库中的对应向量,以及知识图谱中的关联实体。
    • 大模型 RAG 系统:用知识库存储原始文档,向量数据库做语义检索召回,知识图谱补充实体关系信息;
    • 智能客服:用知识库回答 FAQ,用知识图谱处理涉及用户 - 订单 - 商品的关联问题,用向量数据库处理模糊查询。

五、总结

知识库、知识图谱与向量数据库是 AI 时代构建外部知识体系的三大核心技术,分别从 “存储”“关联”“检索” 三个维度解决大模型的知识局限性问题:

  • 知识库是基础,解决知识的集中存储与管理;
  • 知识图谱是深化,揭示知识间的关系逻辑;
  • 向量数据库是升级,实现语义层面的精准检索。

在实际项目中,开发者应根据业务场景的核心需求选择合适的技术,甚至组合使用三者,构建更强大的 AI 应用。随着大模型技术的发展,三者与大模型的结合将越来越紧密,成为企业 AI 落地的核心基础设施。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐