RAG 知识库搭建实战:基于 Word2Vec 与 ChatGLM 的本地部署
基于 RAG 架构的知识库搭建流程。涵盖环境配置、Word2Vec 模型训练、中文文本预处理、向量数据库 Qdrant 部署以及 ChatGLM 大模型集成。通过文档分块、向量化存储与相似度检索,实现大模型上下文增强问答,提供了一套完整的本地化私有知识库解决方案,并对实际生产中的优化策略进行了总结。

基于 RAG 架构的知识库搭建流程。涵盖环境配置、Word2Vec 模型训练、中文文本预处理、向量数据库 Qdrant 部署以及 ChatGLM 大模型集成。通过文档分块、向量化存储与相似度检索,实现大模型上下文增强问答,提供了一套完整的本地化私有知识库解决方案,并对实际生产中的优化策略进行了总结。

目前的方案基本上可以分为:
brew install miniconda
conda create -n rag_env python=3.10
conda activate rag_env
自然语言处理(NLP)是人工智能的一个分支,允许机器理解、处理和操纵人类语言。
conda install pytorch torchvision torchaudio -c pytorch
conda install numpy scipy
⚠️ Gensim 依赖于 scipy 和 numpy,一定要先安装前两者再安装 gensim。Gensim 是一个著名的开源 Python 库,用于从原始的非结构化的文本中,无监督地学习到文本隐层的主题向量表达。支持 TF-IDF、LDA 和 word2vec 等多种主题模型算法。
conda install -c conda-forge gensim
Word2Vec 是一种用于处理自然语言处理的模型,由 Google 研究员 Mikolov 等人于 2013 年提出。它通过训练海量文本数据,将每个单词转换为具有一定维度的向量,代表该单词的语义。
Word2Vec 包括 Skip-Gram 和 CBOW 两种模型:
这两种模型通过学习词汇与其上下文之间的关系获得词的向量表示,向量距离可衡量词语义相似度。
Word2Vec 模型较老,本教程主要用于教学实践。若追求质量效率,可尝试其他词向量模型:
按照具体数据集规范解压提取出数据。
需依次进行四个操作:过滤中文、简化中文、中文分词、除去停用词。
Open Chinese Convert 是开源的中文简繁转换项目。
pip3 install opencc-python-reimplemented
下载 THUCNews.zip 并解压。同样需要进行过滤中文、简化中文、分词及去除停用词处理。
将所有数据集合并为一个文件,作为最终训练模型用的数据集。
数据集不大,在 M2 Pro 性能下可直接本地训练。训练 10 轮大约需要一个半小时。
model = Word2Vec(sentences, vector_size=300, window=5, epochs=10, compute_loss=True)
print(model.vector_size)
print(model.total_train_time)
print(model.wv.most_similar('猫'))
print(model.wv.most_similar('吉林大学'))
Word2Vec 本身只能对词语进行 embedding 操作,对句子进行 embedding 的方法有:
本教程采用最简单的平均值方法。
def encode(self, sentences: List[str], show_progress_bar: bool = False) -> ndarray:
all_embeddings = []
for sentence in tqdm(sentences, desc='Word2Vec Embeddings', disable=not show_progress_bar):
emb = []
count = 0
for word in sentence:
if word in self.stopwords:
continue
if word in self.w2v.key_to_index:
emb.append(self.w2v.get_vector(word, norm=True))
count += 1
else:
if len(word) == 1:
continue
ws = self.jieba.lcut(word, cut_all=True, HMM=True)
for w in ws:
if w in self.w2v.key_to_index:
emb.append(self.w2v.get_vector(w, norm=True))
count += 1
tensor_x = np.array(emb).sum(axis=0)
if count > 0:
avg_tensor_x = np.divide(tensor_x, count)
else:
avg_tensor_x = np.zeros(self.w2v.vector_size, dtype=float)
all_embeddings.append(avg_tensor_x)
return np.array(all_embeddings, dtype=float)
使用简单的分句算法:
def split_sentences(text):
sent_delimiters = ['。', '?', '!', '?', '!', '.']
for delimiter in sent_delimiters:
text = text.replace(delimiter, '\n')
sentences = [sent for sent in text.split('\n') if sent.strip()]
return sentences
此外还可考虑使用 pyltp、pkuseg、spaCy 或 NLTK 等库。
通常基于余弦相似度(Cosine Similarity)。
def cosine_similarity(vec1, vec2):
norm_vec1 = numpy.linalg.norm(vec1)
norm_vec2 = numpy.linalg.norm(vec2)
if norm_vec1 == 0 or norm_vec2 == 0:
return 0
dot_product = numpy.dot(vec1, vec2)
return dot_product / (norm_vec1 * norm_vec2)
常用 Prompt 模板:
使用以下背景段落来回答问题,如果段落内容不相关就返回未查到相关信息:
背景:{{knowledge}}
问题:{{userInput}}
选用 Qdrant 部署向量数据库。
docker pull qdrant/qdrant
docker run -p 6333:6333 -p 6334:6334 \
-v $(pwd)/qdrant_storage:/qdrant/storage:z \
qdrant/qdrant
pip3 install qdrant-client
from qdrant_client import QdrantClient
client = QdrantClient("localhost", port=6333)
conda create -n chatglm python=3.10
conda activate chatglm
cd /tmp
git clone https://github.com/THUDM/ChatGLM2-6B
pip3 install -r requirements.txt
# 安装 pytorch nightly 版本
pip3 install --pre torch torchvision torchaudio --index-url https://download.pytorch.org/whl/nightly/cpu
GIT_LFS_SKIP_SMUDGE=1 git clone https://huggingface.co/THUDM/chatglm2-6b
将模型路径替换为本地路径即可加载。对于 Mac,需使用 MPS 后端。
运行 demo:
python web_demo.py
streamlit run web_demo2.py
完成上述步骤后,即可实现一个基础的 RAG 系统。在实际生产环境中,建议关注以下几点以提升效果:
通过持续迭代数据质量和检索策略,可以显著提升知识库问答的准确性和用户体验。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online