AI知识库Knowledge Base, KB简介及搭建一、简介在人工智能AI领域知识库Knowledge Base, KB 可以被理解为“AI 的专属外部大脑”或“结构化记忆库”。简单来说大语言模型LLM虽然博学但它的知识是“冻结”在训练数据里的且容易产生幻觉。知识库的作用就是把最新的、私有的、高度专业的信息存储起来让 AI 在回答问题时能够“查阅”这些资料从而给出准确、有据可依的答案。二、核心作用为什么需要知识库1、解决“幻觉”问题AI 可能会一本正经地胡说八道。有了知识库AI 必须基于库里的内容回答如果库里没有它会承认不知道而不是瞎编。2、注入私有数据通用的 AI 不知道你公司的内部员工手册、具体的产品代码或你个人特殊技能等等。知识库允许你把私有文档“喂”给 AI。3、知识实时更新重新训练一个大模型很贵且很慢。但更新知识库只需要几秒钟AI 就能立刻掌握今天的新闻或最新的政策。4、可追溯性好的知识库系统会告诉你“这个答案来自《2024年Q3财报》第15页”让你能去核实。三、知识库的两种主要形态在 AI 语境下知识库通常分为两类现在更多是结合使用1、结构化知识库 (Symbolic/Structured KB)形式知识图谱Knowledge Graph、关系数据库、本体Ontology。特点数据是高度结构化的。例如[张三] --(职位是)– [CTO][CTO] --(汇报给)– [CEO]。优势逻辑推理能力强适合处理复杂关系、精确查询如“找出所有向张三汇报且入职超过5年的经理”。劣势构建成本高需要人工梳理结构难以处理非结构化文本。2、非结构化/向量知识库 (Vector KB / RAG)形式向量数据库Vector Database。特点将文档、PDF、网页切成小段Chunk转化成数学向量Embedding存储。优势构建极快支持模糊语义搜索如“怎么缓解项目延期焦虑” 能匹配到“项目进度管理指南”。劣势缺乏精确的逻辑推理能力依赖检索的质量。当前主流趋势RAG检索增强生成现在的 AI 知识库大多基于 RAG 架构。用户提问 - AI 去向量库里搜相关片段 - 把片段和问题一起扔给大模型 - 大模型总结回答。四、举例说明代码实现日常工作中一个典型 AI 知识库的工作流财务报销。处理思路如下你在问公司的 AI 助手公司的差旅报销标准是多少AI系统对现有数据进行切分与向量化处理系统将《员工手册.pdf》切成了几百个小段落并转化成了向量存入数据库。语义检索AI 将你的问题也变成向量在数据库里找“最像”的段落比如找到了“第三章财务制度 - 差旅费限额”这一段。上下文组装AI 把这段文字和你的问题拼在一起发给大模型。生成回答大模型基于这段文字用自然的语言告诉你“根据规定国内出差住宿标准如下…”为了让你能够最快速地跑通一个知识库我为你准备了一个基于 DeepSeek 本地向量库 的完整代码示例。这个方案不需要你购买昂贵的 GPU 显卡只需一个 API Key 即可在普通电脑上运行。1、准备工作首先确保你的电脑安装了 Python然后在终端运行以下命令安装必要的依赖库pip install langchain langchain-openai langchain-community chromadb sentence-transformers openai2、环境准备建立一个文件夹名字为KnowledgeBase在文件夹/KnowledgeBase中建立子文件夹/docs在文件夹文件夹/docs中建立文件“test.md”test.md”写入如下内容当然你可以根据时间情况写入更详细的报销标准我这里这是做一个练习。公司差旅报销制度一、报销范围公司员工因公出差产生的交通费、住宿费、餐饮费可以报销。二、报销流程员工填写报销单附上所有发票原件。直属主管审批签字。财务部审核无误后在3个工作日内将款项打入员工工资卡。三、费用标准交通费高铁二等座或飞机经济舱。住宿费一线城市每晚不超过500元其他城市每晚不超过350元。餐饮费每日不超过200元。单笔超过5000元的报销需CTO审批。3、将以下代码复制到一个 Python 文件例如 kb_demo.py中运行。代码中包含了从文档切块、向量化存储到最终问答的完整流程。 kb_demo.py放在文件夹KnowledgeBase中。#!/usr/bin/env python3# -*- coding: utf-8 -*- RAG 智能问答脚本 - 支持命令行自由提问 用法: 1. 交互式: python rag_chat.py # 启动后逐条输入问题 2. 单次提问: python rag_chat.py 你的问题 # 直接输出一次回答 importosimportsys# 设置 HuggingFace 镜像国内加速 os.environ[HF_ENDPOINT]https://hf-mirror.comfromlangchain_openaiimportChatOpenAIfromlangchain_community.document_loadersimportDirectoryLoader,TextLoaderfromlangchain_text_splittersimportRecursiveCharacterTextSplitterfromlangchain_huggingfaceimportHuggingFaceEmbeddingsfromlangchain_community.vectorstoresimportChromafromlangchain_core.promptsimportChatPromptTemplatefromlangchain_core.output_parsersimportStrOutputParser# 1. 配置大模型 os.environ[DEEPSEEK_API_KEY]sk-bf# ⚠️ 替换为您的真实KeyllmChatOpenAI(modeldeepseek-chat,api_keyos.environ[DEEPSEEK_API_KEY],base_urlhttps://api.deepseek.com/v1,temperature0.1,)# 2. 准备本地文档 loaderDirectoryLoader(./docs,glob*.md,loader_clsTextLoader,loader_kwargs{encoding:utf-8})documentsloader.load()# 3. 文本切块 splitterRecursiveCharacterTextSplitter(chunk_size512,chunk_overlap80,separators[\n\n,\n,。,,,,, ,],)chunkssplitter.split_documents(documents)print(f✅ 成功切分出{len(chunks)}个知识块)# 4. 向量化并存入本地数据库 embeddingsHuggingFaceEmbeddings(model_nameshibing624/text2vec-base-chinese)vectorstoreChroma.from_documents(documentschunks,embeddingembeddings,persist_directory./chroma_db,)print(✅ 向量数据库构建完成)# 5. 构建检索问答链 retrievervectorstore.as_retriever(search_kwargs{k:4})prompt_template根据以下上下文回答问题 {context} 问题{question} 请根据上下文内容给出准确、简洁的回答。如果上下文无法回答该问题请如实告知。promptChatPromptTemplate.from_template(prompt_template)# 6. 执行问答 defask_question(query:str):执行一次检索问答返回回答文本和来源contextretriever.invoke(query)result(prompt|llm|StrOutputParser()).invoke({context:context,question:query})returnresult,context# --- 模式 A命令行单次提问 ---iflen(sys.argv)1:# 用户通过命令行参数传入问题query .join(sys.argv[1:])try:answer,sourcesask_question(query)print(f\n AI 回答\n{answer})print(f\n--- 依据的来源共{len(sources)}条---)fori,docinenumerate(sources[:3]):print(f[{i1}]{doc.page_content[:200]}...)exceptExceptionase:print(f❌ 请求出错:{e})sys.exit(1)else:# --- 模式 B交互式循环提问 ---print(\n*50)print( RAG 智能问答系统已启动)print( 输入问题后按回车输入 quit 或 exit 退出)print(*50)whileTrue:try:queryinput(\n 请输入你的问题quit 退出: ).strip()except(EOFError,KeyboardInterrupt):print(\n 再见)breakifquery.lower()in(quit,exit,退出):print( 再见)breakifnotquery:print(⚠️ 问题不能为空请重新输入。)continuetry:answer,sourcesask_question(query)print(f\n AI 回答\n{answer})print(f\n--- 依据的来源共{len(sources)}条---)fori,docinenumerate(sources[:3]):print(f[{i1}]{doc.page_content[:200]}...)exceptExceptionase:print(f❌ 请求出错:{e})4、运行进入文件夹 KnowledgeBase执行命令 python kb_demo.py