一、知识库构建工具库
1、FlagEmbedding
-
FlagEmbedding 是由 FlagOpen(智源研究院开源的系列大模型技术与系统)项目推出的一个专注于文本向量化(Embedding) 的工具库。它将自然语言文本转换为高维空间中的向量(embeddings),从而让计算机能够理解和计算文本之间的语义相似度
-
核心特点:
- 开源与高性能:提供了多个高质量的开源嵌入模型(如
BGE系列),这些模型在多项权威评测(如 MTEB)中达到了世界领先水平,甚至媲美 OpenAI 的付费接口 - 功能全面:不仅支持最基础的文本向量化,还支持以下高级功能:
- 检索:为知识库文档生成向量,并通过语义搜索快速找到与问题最相关的文档片段。
- 语义相似度计算:比较两段文本的语义相关性
- 文本重排序(Reranker):对检索到的多个结果进行精细化的相关性排序,显著提升 RAG 系统的准确性
- 易于使用:提供了简洁明了的 API,只需几行代码即可完成复杂的嵌入任务,并提供了本地部署方案,保障数据隐私和安全
- 开源与高性能:提供了多个高质量的开源嵌入模型(如
-
核心模型:BGE (BAAI General Embedding)
- FlagEmbedding 的代表模型是
BGE系列,例如:- BGE-large-zh:专为中文优化的大型模型
- BGE-large-en:为英语优化的模型
- BGE-reranker-large:用于对检索结果进行重排序的交叉编码器模型
- FlagEmbedding 的代表模型是
-
文档:【 https://github.com/FlagOpen/FlagEmbedding/blob/master/README_zh.md 】
1.1 安装
- 如果你不想微调模型,你可以直接安装包,不用 finetune 依赖:
pip install -U FlagEmbedding -i https://repo.huaweicloud.com/repository/pypi/simple/
- 如果你想微调模型,你可以用 finetune 依赖安装:
pip install -U FlagEmbedding[finetune]
1.2 基本使用
-
参数
query_instruction_for_retrieval的值参考:【 https://github.com/FlagOpen/FlagEmbedding/tree/master#model-list 】 -
生成文档向量并构建索引
import numpy as np
from FlagEmbedding import FlagAutoModel
# 生成文档向量并构建索引
def document_embedding(documents):
model = FlagAutoModel.from_finetuned(
model_name_or_path='BAAI/bge-base-zh-v1.5',
query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",
cache_dir='./bge-base-zh-v1.5',
use_fp16=True
)
doc_embeddings = model.encode(documents)
print(f"向量化完成!生成了 {len(doc_embeddings)} 个文档的向量,每个向量维度为 {doc_embeddings.shape[1]}")
# 我们将向量和原始文本对应起来保存为 npz 文件
np.savez('knowledge_base.npz', documents=documents, embeddings=doc_embeddings)
print("文档和向量已保存到 'knowledge_base.npz'。")
if __name__ == '__main__':
documents = [
"FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。",
"它可以将文本转换为高维向量,用于计算语义相似度。",
"BGE 模型在 Massive Text Embedding Benchmark (MTEB) 排行榜上取得了优异的成绩。",
"RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。",
"苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。",
"苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。",
"熊猫是中国的国宝,主要栖息地是四川、陕西和甘肃的山区。",
"深度学习是机器学习的一个分支,它基于深层神经网络。"
]
document_embedding(documents)
- 进行语义搜索查询
import numpy as np
from FlagEmbedding import FlagAutoModel
# 计算两个向量的余弦相似度
def cos_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 进行语义搜索查询
def query_embedding():
# 加载之前保存的索引
data = np.load('knowledge_base.npz', allow_pickle=True)
loaded_documents = data['documents']
loaded_embeddings = data['embeddings']
model = FlagAutoModel.from_finetuned(
model_name_or_path='BAAI/bge-base-zh-v1.5',
query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",
cache_dir=r'F:\workspace\AI\stu_nlp\rag\相似度计算\bge-base-zh-v1.5',
use_fp16=True
)
# query = input("请输入您的问题:\n")
query = "苹果公司的创始人是谁"
# 将查询语句向量化
query_embedding = model.encode(query)
# 计算查询向量与所有文档向量的相似度
similarities = [cos_sim(query_embedding, doc_embed) for doc_embed in loaded_embeddings]
# 按相似度从高到低排序,并获取排名前K的结果
top_k = 3
print(similarities)
indices = np.argsort(similarities)[::-1][:top_k]
print(indices)
# 展示结果
print(f"\n对于问题: 「{query}」")
print("检索到的最相关文档:\n")
for index, rank in enumerate(indices):
print(f"Top-{index + 1} (相似度: {similarities[rank]:.4f}): {loaded_documents[rank]}")
if __name__ == '__main__':
query_embedding()
- 运行结果:
[np.float16(0.2844), np.float16(0.1236), np.float16(0.1858), np.float16(0.2006), np.float16(0.757), np.float16(0.507), np.float16(0.1919), np.float16(0.2223)]
[4 5 0]
对于问题: 「苹果公司的创始人是谁」
检索到的最相关文档:
Top-1 (相似度: 0.7568): 苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。
Top-2 (相似度: 0.5068): 苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。
Top-3 (相似度: 0.2844): FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
1.3 重排序 - Reranker
- 在上面的结果中,第 3 个结果与问题相关性不大。我们可以使用 FlagEmbedding 中的 Reranker 模型对 Top-K 初步结果进行精排序
- Reranker 是一个精细化的相关性裁判。它的任务不是从海量文档中快速筛选,而是对检索器返回的 Top-K 个候选结果进行精细化排序,将最相关的结果推到最前面
- 工作流程:
- 输入:第一阶段的 Top-N 候选文档 + 原始Query
- 过程:
- Reranker(通常是交叉编码器)接收的不是单个文本,而是一个(Query, Document) 对
- 模型将这个文本对一起输入到 Transformer 网络中。Query 和 Document 之间可以进行充分的注意力机制计算,模型能捕捉到两者之间细微的语义关联、词汇匹配和逻辑关系
- 模型输出一个精确的相关性分数(通常是一个标量),这个分数比单纯的向量余弦相似度能更准确地判断文档是否回答了问题
- 目标:高精确率(Precision)。不关心速度,只关心判断是否精准。确保最终返回的前3个或前5个结果是质量最高、最相关的
- 案例代码:
import numpy as np
from FlagEmbedding import FlagAutoModel, FlagReranker
# 计算两个向量的余弦相似度
def cos_sim(a, b):
return np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b))
# 使用 Reranker 提升精度
def query_embedding_reranker():
# 加载之前保存的索引
data = np.load('knowledge_base.npz', allow_pickle=True)
loaded_documents = data['documents']
loaded_embeddings = data['embeddings']
# 初始化嵌入模型
model = FlagAutoModel.from_finetuned(
model_name_or_path='BAAI/bge-base-zh-v1.5',
query_instruction_for_retrieval="为这个句子生成表示以用于检索相关文章:",
cache_dir='./bge-base-zh-v1.5',
use_fp16=True
)
query = "什么是rag?"
# 将查询语句向量化
query_embedding = model.encode(query)
# 计算查询向量与所有文档向量的相似度(初步检索)
similarities = [cos_sim(query_embedding, doc_embed) for doc_embed in loaded_embeddings]
# 按相似度从高到低排序,并获取排名前K的结果
top_k = 3 # 第一步可以多检索一些,比如3个,让Reranker有更多选择
initial_indices = np.argsort(similarities)[::-1][:top_k]
print("=== 初步检索结果(基于向量相似度)===")
for index, rank in enumerate(initial_indices):
print(f"Top-{index + 1} (相似度: {similarities[rank]:.4f}): {loaded_documents[rank]}")
# 加载重排序模型
reranker = FlagReranker(
model_name_or_path='BAAI/bge-reranker-large',
cache_dir=r"F:\workspace\AI\LangChain-1.0\models",
use_fp16=True,
)
# 准备需要重排的 (query, document) 对
pairs = [(query, loaded_documents[idx]) for idx in initial_indices]
# 进行重排序,得到分数
rerank_scores = reranker.compute_score(pairs)
# compute_score 返回的是list of scores
# 将初步结果索引与Reranker分数配对,并按Reranker分数重新排序
results_with_scores = list(zip(initial_indices, rerank_scores))
reranked_results = sorted(results_with_scores, key=lambda x: x[1], reverse=True)[:3] # 取最终Top-3
# 展示最终结果(使用Reranker的排序和分数)
print(f"\n=== 对于问题: 「{query}」的最终重排序结果 ===")
for rank, (idx, rerank_score) in enumerate(reranked_results, 1):
print(f"Top-{rank} (Reranker分数: {rerank_score:.4f}): {loaded_documents[idx]}\n")
if __name__ == '__main__':
query_embedding_reranker()
- 运行结果:
=== 初步检索结果(基于向量相似度)===
Top-1 (相似度: 0.6016): RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
Top-2 (相似度: 0.4097): FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
Top-3 (相似度: 0.3191): 深度学习是机器学习的一个分支,它基于深层神经网络。
=== 对于问题: 「什么是rag?」的最终重排序结果 ===
Top-1 (Reranker分数: 6.8047): RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
Top-2 (Reranker分数: -4.3203): 深度学习是机器学习的一个分支,它基于深层神经网络。
Top-3 (Reranker分数: -6.3203): FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
2、Sentence-Transformers
-
Sentence-Transformers 是一个基于 PyTorch 的 Python 库,专门用于生成句子、段落和图像的密集向量表示(Embeddings)。它的核心目标是让获取高质量的词句向量变得非常简单高效
-
核心特点:
-
专为句子嵌入优化:与早期主要生成单词向量的模型(如 Word2Vec)不同,SentenceTransformers 的模型专门设计用于捕捉整个句子或段落的语义
-
基于 Transformer 架构:它封装并微调了强大的预训练模型(如 BERT、RoBERTa),克服了原始模型直接生成句子向量效果不佳的问题(通过池化策略等)
-
易于使用:只需几行代码,就可以将文本转换为高性能的向量,无需深厚的机器学习背景
-
丰富的模型库:提供了大量预训练模型,适用于各种任务(语义相似度、语义搜索、聚类等)和语言(英语、中文、多语言等)
-
功能全面:支持:
-
句子嵌入:核心功能,将文本转换为向量
-
语义相似度计算:比较两段文本的相似性
-
语义搜索:在知识库中查找最相关的段落
-
聚类:将相似文本分组
-
文本重排序:对搜索结果进行精细化排序
-
-
2.1 安装
pip install sentence-transformers==5.5.1
2.2 基本使用
-
SentenceTransformers 提供了大量模型,关键是如何选择:
-
- 通用语义相似度:
all-MiniLM-L6-v2:英语,速度快,体积小,效果好paraphrase-multilingual-MiniLM-L12-v2:多语言(支持中文),平衡速度和性能
- 语义搜索/检索(RAG):
msmarco-distilbert-base-v4:英语,专为检索微调BAAI/bge-large-zh-v1.5:中文首选,专为中文检索优化,性能极佳BAAI/bge-base-en-v1.5:英语检索
- 通用语义相似度:
-
案例代码:
from sentence_transformers import SentenceTransformer, util
# 1. 加载模型(这里用英文小模型,你也可以换成中文模型,比如 )
model = SentenceTransformer(
model_name_or_path="BAAI/bge-base-zh-v1.5",
cache_folder="./bge-base-zh-v1.5"
)
# 2. 输入句子
documents = [
"FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。",
"它可以将文本转换为高维向量,用于计算语义相似度。",
"BGE 模型在 Massive Text Embedding Benchmark (MTEB) 排行榜上取得了优异的成绩。",
"RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。",
"苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。",
"苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。",
"熊猫是中国的国宝,主要栖息地是四川、陕西和甘肃的山区。",
"深度学习是机器学习的一个分支,它基于深层神经网络。"
]
# 3. 生成向量
embeddings = model.encode(documents, normalize_embeddings=True)
print("向量维度:", embeddings.shape) # (4, 384)
# 4. 语义检索(找到与 query 最相关的句子)
query = "什么是rag?"
query_embedding = model.encode(query, normalize_embeddings=True)
hits = util.semantic_search(query_embedding, embeddings, top_k=2)
print("\n检索结果:")
for hit in hits[0]:
print(f"score: {hit['score']:.4f} - {documents[hit['corpus_id']]}")
- 运行结果:
向量维度: (8, 768)
检索结果:
score: 0.6072 - RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
score: 0.4210 - FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
3、Transformers
-
Transformers 库 是 Hugging Face 提供的开源工具包,广泛用于 NLP / CV / 多模态任务
-
它提供了统一的 API 来 加载预训练模型(如 BERT, GPT, RoBERTa, BGE 等)和 对应的 tokenizer
-
典型用法:
AutoTokenizer:文本转 tokenAutoModel:构建模型AutoModelForSeq2SeqLM / AutoModelForCausalLM:生成任务AutoModelForSequenceClassification:分类任务
3.1 安装
pip install transformers
3.2 基本使用
- 案例代码:
import torch
from transformers import AutoTokenizer, AutoModel
# 1. 加载模型和 tokenizer
tokenizer = AutoTokenizer.from_pretrained(
"BAAI/bge-base-zh-v1.5",
cache_dir="./bge-base-zh-v1.5",
)
model = AutoModel.from_pretrained(
"BAAI/bge-base-zh-v1.5",
cache_dir="./bge-base-zh-v1.5",
)
model.eval() # 切到评估模式
# 2. 定义文本和查询词
documents = [
"FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。",
"它可以将文本转换为高维向量,用于计算语义相似度。",
"BGE 模型在 Massive Text Embedding Benchmark (MTEB) 排行榜上取得了优异的成绩。",
"RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。",
"苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。",
"苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。",
"熊猫是中国的国宝,主要栖息地是四川、陕西和甘肃的山区。",
"深度学习是机器学习的一个分支,它基于深层神经网络。"
]
query_word = "什么是rag?"
top_k = 3
# 3. 编码文本 -> 向量
def get_embeddings(texts):
inputs = tokenizer(texts, padding=True, truncation=True, return_tensors="pt")
with torch.no_grad():
outputs = model(**inputs)
embeddings = outputs.last_hidden_state[:, 0] # [CLS]向量
embeddings = torch.nn.functional.normalize(embeddings, p=2, dim=1)
return embeddings
sentence_embeddings = get_embeddings(documents)
query_embedding = get_embeddings([query_word]) # 词向量
# 4. 计算查询词与每个句子的余弦相似度
cos_sim = torch.matmul(query_embedding, sentence_embeddings.T) # 1 x N
print(cos_sim)
print(cos_sim.shape)
# 5. 返回前 k 个句子
topk_values, topk_indices = torch.topk(cos_sim, k=top_k, dim=1)
topk_indices = topk_indices[0] # 转成一维索引
print(f"查询词 '{query_word}' 与前 {top_k} 个最相似的句子:\n")
for rank, idx in enumerate(topk_indices, 1):
print(f"{rank}. 相似度 {cos_sim[0, idx].item():.4f} : {documents[idx]}")
- 运行结果:
tensor([[0.4210, 0.2503, 0.2362, 0.6072, 0.1731, 0.1959, 0.2941, 0.3016]])
torch.Size([1, 8])
查询词 '什么是rag?' 与前 3 个最相似的句子:
1. 相似度 0.6072 : RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
2. 相似度 0.4210 : FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
3. 相似度 0.3016 : 深度学习是机器学习的一个分支,它基于深层神经网络。
4、LangChain
-
LangChain 是一个专门为 构建基于 LLM(大型语言模型)的应用程序 设计的 开发框架
-
它的核心目标是 将 LLM 与外部世界连接起来,从而让语言模型不仅能“生成文本”,还能“理解环境、调用工具、获取信息”
-
通过 LangChain,可以轻松搭建以下类型的应用:
- 智能问答系统(QA):结合文档、知识库或数据库,实现基于内容的精准回答
- 检索增强生成(RAG, Retrieval-Augmented Generation):先检索相关信息,再结合 LLM 生成答案,提高准确性和可靠性。
- 智能代理(Agents):让 LLM 通过执行任务、调用 API、操作工具等方式完成复杂工作流
- 多轮对话系统(Chatbots):支持上下文追踪、状态管理,实现自然的多轮交流
- 工具增强的 LLM(Tool-augmented LLM):模型可直接调用外部工具,如计算器、翻译服务、搜索引擎、数据库查询等,从而扩展能力
-
核心模块和概念:
- LLM Wrapper:对语言模型进行统一封装,方便调用和管理
- PromptTemplate:管理和模板化提示词(Prompt),提高生成效果可控性
- Chains(链):将多个步骤组合起来,形成复杂工作流,如“检索 → 生成 → 调用工具”
- Agents(智能代理):动态决策,选择调用不同工具或链完成任务
- Memory(记忆):存储对话历史或状态信息,实现上下文感知
- Document Loaders & Vector Stores:加载文档、构建向量索引,用于语义检索
-
文档:【 https://docs.langchain.com/oss/python/langchain/overview 】
4.1 安装
pip install -U langchain-huggingface
pip install langchain
4.2 基本实现
- 案例代码:
from langchain_community.llms import HuggingFacePipeline
from langchain_community.vectorstores import FAISS
from langchain_community.embeddings import HuggingFaceEmbeddings
from langchain.chains import RetrievalQA
from langchain.schema import Document
from transformers import AutoTokenizer, AutoModelForCausalLM
from transformers import pipeline
model_name = "deepseek-ai/DeepSeek-R1-Distill-Qwen-1.5B"
model_path = r"E:\workspace\AI\models\deepseek"
# 1. 文档准备
documents = [
"FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。",
"它可以将文本转换为高维向量,用于计算语义相似度。",
"BGE 模型在 Massive Text Embedding Benchmark (MTEB) 排行榜上取得了优异的成绩。",
"RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。",
"苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。",
"苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。",
"熊猫是中国的国宝,主要栖息地是四川、陕西和甘肃的山区。",
"深度学习是机器学习的一个分支,它基于深层神经网络。"
]
docs = [Document(page_content=doc) for doc in documents]
# 2. 配置生成模型(LLM)
tokenizer = AutoTokenizer.from_pretrained(model_name)
model = AutoModelForCausalLM.from_pretrained(
pretrained_model_name_or_path=model_name,
cache_dir=model_path,
device_map="auto"
)
pipe = pipeline(
task="text-generation",
model=model,
tokenizer=tokenizer,
max_length=1024,
temperature=0.7,
top_p=0.95,
repetition_penalty=1.15
)
# 必须包装成 LangChain LLM
llm = HuggingFacePipeline(pipeline=pipe)
# 3. 向量化
embeddings_model = HuggingFaceEmbeddings(
model_name="BAAI/bge-base-zh-v1.5",
model_kwargs={"device": "cuda"},
encode_kwargs={"normalize_embeddings": True},
cache_folder="./bge-base-zh-v1.5",
)
vectorstore = FAISS.from_documents(docs, embeddings_model)
# 4. 配置检索器
retriever = vectorstore.as_retriever(search_kwargs={"k": 3}) # top-3 相似文档
# 5. 构建 RAG 链
qa_chain = RetrievalQA.from_chain_type(
llm=llm,
retriever=retriever,
chain_type="stuff" # "stuff" / "map_reduce" / "refine"
)
# 6. 输入查询
query = "什么是 RAG?"
answer = qa_chain.invoke(query)
print(f"问题:{query}\n")
print(f"回答:{answer}")
- 运行结果:
问题:什么是 RAG?
回答:Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
深度学习是机器学习的一个分支,它基于深层神经网络。
Question: 什么是 RAG?
Helpful Answer: RAG,或者检索增强生成技术,是指通过使用外部的知识库来增强大型语言模型(如GPT-3等)的回答能力。这种技术结合了检索算法和深度学习,使得模型在回答问题时能够快速查找相关的信息,并应用到具体的语义理解上。
</think>
根据提供的信息,RAG(检索增强生成)是一种利用外部知识库来提升大模型回答能力的技术。具体来说,它结合了检索算法和深度学习,使模型能够在回答问题时迅速查找并整合相关的内容,以提高其理解和表达能力。
4.3 输出过程描述
4.3.1 检索(Retriever)
- 当你输入问题:
什么是 RAG?
- LangChain 会先通过你配置的
retriever(FAISS + Embeddings)去检索与问题最相关的文档,例如你存入的文档:
RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
深度学习是机器学习的一个分支,它基于深层神经网络。
- LangChain 会把 Top-K 文档(你配置的
k=3)拿出来作为上下文
4.3.3.2 构建 Prompt
- LangChain 会把问题和检索到的文档拼接成一个 完整 Prompt,类似:
Use the following pieces of context to answer the question at the end. If you don't know the answer, just say that you don't know, don't try to make up an answer.
RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。
FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。
深度学习是机器学习的一个分支,它基于深层神经网络。
Question: 什么是 RAG?
Helpful Answer:
- 这里
Helpful Answer:是 LangChain 默认在stuff模式下拼接文档生成的 提示模板(prompt template) stuff模式就是把检索到的文档全部“塞进” prompt
4.3.3.3 模型生成(LLM)
- 然后 LangChain 会把拼好的 prompt 传给 LLM(你的 DeepSeek 1.5B):
llm(prompt)
-
LLM 会基于上下文生成答案。
-
因为 prompt 里包含了:
- 上下文文档
- 问题
- 提示词
Helpful Answer
-
所以生成结果就会先 复述上下文信息,然后给出整合后的回答
4.3.3.4 输出内容组成
-
所以你看到的结果大致包含三部分:
- 原始上下文/引用(Retriever 返回的文档)
RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。 FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。 深度学习是机器学习的一个分支,它基于深层神经网络。- 问题重述 / Prompt 中的 question
Question: 什么是 RAG? Helpful Answer:- 模型生成的自然语言回答
RAG,或者检索增强生成技术,是指通过使用外部的知识库来增强大型语言模型(如GPT-3等)的回答能力。这种技术结合了检索算法和深度学习... -
所以你看到的“长回答”其实是 检索到的文档 + LLM 基于文档生成的综合答案
4.3.4 chain_type
"stuff"→ 把所有检索到的文档直接拼在 prompt → 输出更长,包含上下文和生成内容map_reduce→ 先生成每条文档的回答,再合并 → 输出更精炼refine→ 逐步改进回答 → 输出可能更有逻辑和总结性
5、BCEmbedding
注意:新建一个虚拟环境进行练习
-
BCEmbedding 是由网易有道开发的中英双语和跨语种语义表征算法模型库,其中包含 EmbeddingModel 和 RerankerModel 两类基础模型
-
EmbeddingModel 专门用于生成语义向量,在语义搜索和问答中起着关键作用
- 嵌入模型
- 功能: 生成语义向量
- 应用场景: 语义搜索、问答系统
-
RerankerModel 擅长优化语义搜索结果和语义相关顺序精排
- 重排模型
- 功能: 优化搜索结果的排序和排名
-
特点:专注于汉语和跨语言能力,尤其擅长中英文之间的语义桥接
-
文档:【 https://github.com/netease-youdao/BCEmbedding/blob/master/README_zh.md 】
5.1 安装
- 克隆一个环境,有 pytorch 的
git clone https://github.com/netease-youdao/BCEmbedding.git
cd BCEmbedding
pip install BCEmbedding==0.1.5
5.2 生成语义向量
- 案例代码:
from BCEmbedding import RerankerModel
# your query and corresponding passages
query = '什么是rag?'
passages = [
"FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。",
"它可以将文本转换为高维向量,用于计算语义相似度。",
"BGE 模型在 Massive Text Embedding Benchmark (MTEB) 排行榜上取得了优异的成绩。",
"RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。",
"苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。",
"苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。",
"熊猫是中国的国宝,主要栖息地是四川、陕西和甘肃的山区。",
"深度学习是机器学习的一个分支,它基于深层神经网络。"
]
# construct sentence pairs
sentence_pairs = [[query, passage] for passage in passages]
# init reranker model
model = RerankerModel(
model_name_or_path="maidalun1020/bce-reranker-base_v1",
use_fp16=True,
device="cuda:0",
cache_dir="./bce-reranker-base_v1"
)
# method 0: calculate scores of sentence pairs
scores = model.compute_score(sentence_pairs)
print("相似度:", scores)
# method 1: rerank passages
rerank_results = model.rerank(query, passages)
print("排序结果:", rerank_results)
- 运行结果:
相似度: [0.42071861028671265, 0.3809316158294678, 0.3454363942146301, 0.6256668567657471, 0.3146820068359375, 0.3268083333969116, 0.40233340859413147, 0.36296918988227844]
排序结果: {'rerank_passages': ['RAG(检索增强生成)是一种利用外部知识库来增强大模型回答能力的技术。', 'FlagEmbedding 是一个由北京智源人工智能研究院开发的文本嵌入模型。', '熊猫是中国的国宝,主要栖息地是四川、陕西和甘肃的山区。', '它可以将文本转换为高维向量,用于计算语义相似度。', '深度学习是机器学习的一个分支,它基于深层神经网络。', 'BGE 模型在 Massive Text Embedding Benchmark (MTEB) 排行榜上取得了优异的成绩。', '苹果最新款的智能手机是 iPhone 15系列,搭载了A17 Pro芯片。', '苹果公司由史蒂夫·乔布斯、史蒂夫·沃兹尼亚克和罗恩·韦恩于 1976 年创立。'], 'rerank_scores': [0.6256668567657471, 0.42071861028671265, 0.40233340859413147, 0.3809316158294678, 0.36296918988227844, 0.3454363942146301, 0.3268083333969116, 0.3146820068359375], 'rerank_ids': [3, 0, 6, 1, 7, 2, 5, 4]}
6、对比
- FlagEmbedding、Sentence-Transformers、BCEmbedding 是专门的向量化工具
- Transformers 是通用推理库,可间接用于向量化
- LangChain 是 RAG 应用框架,与向量化本身无关,它只是调用向量化工具的"调度者"
| 技术/库 | 是否专门做相似度 | 精度 | 中文适配 | 用户流行度 | 总结 |
|---|---|---|---|---|---|
| Transformers | 否 | 中等 | 需中文模型 | 高 | 需手动池化,灵活但麻烦 |
| Sentence-Transformers | ✅ | 高 | 一般,部分多语言 | 很高 | 学术/工业首选 |
| FlagEmbedding / BGE | ✅ | 高(中文) | 中文优化 | 中等(中文社区) | 中文问答和 RAG 最佳 |
| BCEmbedding | ✅ | 高(中文) | 中文优化 | 中等 | 类似 BGE,主要中文企业/科研 |
| LangChain | 否 | — | — | 高(RAG 应用) | 是框架,不是嵌入模型 |
浙公网安备 33010602011771号