【背景概述】
“ 企业知识库,建议尽早搭建!不论是否在AI时代,一个企业的核心竞争力就是知识,很多企业没有意识到,散落在各处的产品手册、用户反馈、销售分析报告等等,都是宝贵的知识资产,若把这些整合到企业知识库,是能实实在在提升运营效率,解决知识管理的大难题!”
在学习本地部署大模型(Large Language Model,简称LLM)以及拥有自有模型后,本文将继续从企业AI落地的角度,介绍如何运用RAG技术搭建企业的知识库,通过代码的方式,全流程解析开发过程与原理,其中会涉及使用的技术框架LangChain、Embedding、向量库、调用本地DeepSeek和企业自有模型等,完成知识库的问答。
AI实战系列前两篇:
DeepSeek本地运行全流程解析,企业私有化,数据安全、降本增效双搞定!含ollama命令聊天、chatbox界面聊天效果(AI实战系列,保姆级教程)
教你打造企业自有大模型(基于ollama、deepseek),走出定制化第一步,沉淀AI技术能力,让AI变成生产力!【AI实战系列】
一、概念:企业知识库,RAG、微调与蒸馏,LangChain
在实现企业知识库功能前,先简单介绍下知识库以及相关技术。
1、企业知识库
企业知识库是指企业用于集中存储、管理和共享内部知识与信息的数字化平台,是企业数字化转型的必备工作。其中包含了企业的组织架构、品牌及产品服务、业务操作流程、客户信息等内容,目的在于提升企业知识利用效率和各部门的协作能力。
(1)知识库核心功能。一是知识集中化管理。整合企业各类信息(如业绩报告、专利技术、客户数据等),按主题分类存储,形成可检索的共享资源。二是支撑高效协作。通过数字化平台实现自助查询,减少重复性工作,加速问题的解决。
(2)AI技术赋能,传统的知识库是以结构化的数据为主,比较依赖人工维护,基本上就存在档案室了,没有可用的余地。得益于AI的兴起,新型知识库是结合大模型与检索增强生成(RAG)技术,实现动态知识更新、上下文理解及智能问答,能够显著提升知识的利用率。
其中谈到RAG技术,顺便理解下RAG、微调与蒸馏。
2、RAG、微调与蒸馏
(1)RAG(Retrieval-Augmented Generation,检索增强生成)。结合检索(Retrieval)和生成(Generation)技术,通过实时从外部知识库检索相关信息,辅助生成更准确的回答。其实可以将知识库理解为“信息外挂”,先到知识库中获取到相关信息,大模型通过分析理解后给出答复,此时信息是比较安全的,因为其完全独立在外。
(2)微调(Fine-tuning)。在预训练大模型或者搭建的自有模型的基础上,用特定领域或任务的数据训练,使其适应特定场景的需求。此方式需要进行数据训练,若使用外部大模型时,自然会存在数据安全风险。
(3)蒸馏(Knowledge Distillation,知识蒸馏)。可以理解为与“微调”类似,只不过使用的数据是经过大模型学习后浓缩而成的数据(知识),类比于将课本知识划了重点,浓缩而成的“考试前的秘籍”,牺牲部分精度换取效率。
3、LangChain
LangChain是一个基于语言模型开发应用程序的框架。一是组件化,组件封装,将功能模块化,便于开发者直接使用。二是链,将结构化的组件组合,可以快速完成特定任务,比如QA问答等,此处不做详细介绍,后续对该框架进行详细分析,目前大致了解即可。
二、全流程实现与解析
1、实现目标
本次实现的目标是:用户检索知识库的知识,并且能看到大模型的思考过程。步骤拆解如下:
(1)文本预处理:数据(pdf、word等文档)加载与清洗。
(2)文本向量化:将数据切片,并使用预训练的词嵌入(Embedding)模型将加载的数据转换为向量。
(3)构建索引:将处理好的向量数据存储到向量检索库(如Chroma、FAISS等),同时构建知识库的向量索引。
(4)提示词prompt模板编写:让大模型按照要求进行问答。
(5)检索查询:实现一个检索函数,传递一个query参数,在索引中找到最相似的文本片段,使用LangChain的RetrievalQA完成大模型、知识向量库的链式调用。
(6)验证效果:使用根据知识的内容,进行检索效果的验证。
2、代码实现与解析
有了上述拆解过程,实现起来就方便很多了。
(1)创建Python项目
打开PyCharm,创建llm-rag-demo项目,创建data、docs目录,用于存放向量库文件以及需要加入企业知识库的文件。如下:
创建ai_rag_ollama.py,正式进行开发。
注意:最好设置独立的环境,避免与其他项目环境冲突。
(2)文档加载、数据切片处理、构建向量索引
# 加载文件目录
file_path = './docs/'
# 文件切割
chunk_size = 1024
chunk_overlap = 256
text_split = CharacterTextSplitter(chunk_size=chunk_size, chunk_overlap=chunk_overlap)
# 向量库
persist_directory = './data/vector_store'
# 使用本地模型,可以在各模型社区下载
embedding_model = HuggingFaceEmbeddings(model_name='./text2vec-base-chinese')
vector_db = Chroma(persist_directory=persist_directory, embedding_function=embedding_model)
# 加载文件,并进行数据切片,添加至向量库
def load_file(file_name):
print('加载文件--:', file_name)
if file_name.lower().endswith('.pdf'):
loader = PyPDFLoader(file_path + file_name)
elif file_name.lower().endswith('.csv'):
loader = CSVLoader(file_path + file_name)
elif file_name.lower().endswith('.docx'):
loader = Docx2txtLoader(file_path + file_name)
else:
raise ValueError('文件类型不支持。目前支持格式:pdf、csv、docx。')
documents = loader.load()
docs = text_split.split_documents(documents)
if docs:
vector_db.add_documents(docs)
# 遍历加载docs目录下的文件
def load_file_and_vec():
if os.path.isdir(file_path):
for root, ds, fs in os.walk(file_path):
for f in fs:
load_file(file_name=f)
(3)提示词prompt模板编写
qa_prompt = PromptTemplate.from_template(
"""
根据给出的上下文信息回答问题,如果从上下文信息中找不到答案诚实的说不知道。
上下文信息:{context}
问题:{question}
""")
提示词根据需求进行调整即可,此处用于演示相对简单。其中参数一个是上下文信息,一个是提问的问题。
(4)提示词prompt模板编写
# 检索
def do_search(msg):
llm = Ollama(model='deepseek-r1:7b')
qa = RetrievalQA.from_chain_type(
llm=llm,
retriever=vector_db.as_retriever(),
verbose=False,
chain_type_kwargs={'prompt': qa_prompt}
)
response = qa({'query': msg})
try:
ans = response['result']
except Exception as err:
print('chat err: {}'.format(err))
ans = '模型查询异常!'
return ans
解析:
-
使用了Ollama,调用的是本地模型。这个有不理解的,可以看下上一篇文章。另外后续也会介绍如何对接百度千帆、阿里百炼等平台。
-
使用了RetrievalQA,可以很方便的组合llm、vector_db、提示词,快速实现问答。
(5)main函数
if __name__ == '__main__':
# 到网上找好资料,并放在docs目录下,执行加载
# 首次加载后,后续提问时不需要再执行了
load_file_and_vec()
# 提问
query = '量子计算机的工作原理'
# query = '数电发票是什么?'
ans = do_search(query)
# 输出查询结果
print('大模型理解后回复如下: {}'.format(ans))
(6)附:代码中的相关引用
import os
from langchain.document_loaders.pdf import PyPDFLoader
from langchain.document_loaders.csv_loader import CSVLoader
from langchain.document_loaders import Docx2txtLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.vectorstores.chroma import Chroma
from langchain.embeddings.huggingface import HuggingFaceEmbeddings
from langchain.chains.retrieval_qa.base import RetrievalQA
from langchain.prompts.prompt import PromptTemplate
from langchain_community.llms import Ollama
三、跑一下,看效果
1、首次执行
首次执行后,在“./data/vector_store”下会生产相关文件。
此时可以将以下这行代码注释了。
# load_file_and_vec()
2、使用deepseek-r1:7b模型,提问“量子计算机的工作原理”
回答如下:
其中<think> 标签里面是思考过程。
回复有些意外的,居然是:无法提供具体信息。
3、使用deepseek-r1:14b模型,提问“量子计算机的工作原理”
回答如下:
回复是正常的,可以看出来大模型的能力是能提升知识库的整体能力的。
下面可以自行调整query的值,比如提问“数电发票是什么?”,也可以切换模型做一些对比验证,另外还可以使用上一篇中自定义的模型试试哦。
至此,简易的知识库已经完成!若需要提供给用户使用,实现相应的系统界面即可。将企业文档管理起来,实时进行数据切片、向量转换与存储,根据不同类型的场景,编写不同的prompt,以及选择不同的大模型,可以达到更好的效果。
因为篇幅有限,涉及内容较多,有一些没有说到的地方,若有需要源码的,没有下载到text2vec-base-chinese模型文件的,可以私信,也可以看下图的方式获取。当然,有企业知识库搭建需求,欢迎私信。
感谢点赞、收藏、评论、关注,后续持续分享,如何基于DeepSeek等大模型,实现企业AI集成、企业知识库、电商场景应用、模型微调、智能问答、多模态、RPA等项目实战。致力为中小企业提供实用的企业级AI解决方案!