1、Embeddings模型
HuggingFace 上的 BGE 模型是最好的开源嵌入模型之一。 BGE 模型由北京人工智能研究院 (BAAI) 创建。 是一家从事 AI 研发的私营非营利组织。
**BGE-Large**(智源研究院)和**GTE-Large**(阿里巴巴)是当前中文RAG领域主流的开源Embedding模型,两者的核心区别与优势如下:



python
pip install --upgrade --quiet sentence_transformers
```
```
from langchain.embeddings import HuggingFaceBgeEmbeddings
model_name = "BAAI/bge-large-zh-v1.5"
model_kwargs = {'device': 'cuda'}
encode_kwargs = {'normalize_embeddings': True} # set True to compute cosine similarity
model = HuggingFaceBgeEmbeddings(
model_name=model_name,
model_kwargs=model_kwargs,
encode_kwargs=encode_kwargs,
query_instruction="为这个句子生成表示以用于检索相关文章:"
)
model.query_instruction = "为这个句子生成表示以用于检索相关文章:"
```
在 `HuggingFaceBgeEmbeddings` 中,`normalize_embeddings` 参数通常只接受布尔值(`True` 或 `False`),用于决定是否对生成的嵌入向量进行归一化处理。具体来说:
* **`True`**:生成的嵌入向量会被归一化为单位向量。这意味着每个嵌入向量的 L2 范数(欧几里得长度)将被缩放到 1。
* **`False`**:生成的嵌入向量将保持原始的数值,不进行归一化处理。
* **优点** :
* **提高相似度计算的稳定性** :在许多应用场景中,如余弦相似度计算,归一化后的向量可以避免因向量长度不同而导致的相似度偏差,使相似度计算更加专注于向量的方向而非长度。
* **一致性** :在某些情况下,归一化可以确保不同批次或不同模型生成的嵌入向量在同一尺度上,便于比较和整合。
2、BM25 详解
BM25(Best Matching 25)是一种 **基于统计的稀疏检索算法** ,是信息检索(Information Retrieval, IR)领域最经典的排序函数之一。它是对传统**TF-IDF(词频-逆文档频率)**的改进,能够更合理地衡量文档与查询的相关性,广泛应用于搜索引擎(如Elasticsearch、Lucene)和问答系统。
**1. BM25 的核心思想**
BM25 的核心是计算**查询(Query)**和**文档(Document)**之间的相关性得分,主要考虑以下因素:
-
**词频(Term Frequency, TF)** :查询词在文档中出现的频率(越高越相关)。
-
**逆文档频率(Inverse Document Frequency, IDF)** :查询词在整个语料库中的稀有程度(越稀有越重要)。
-
**文档长度归一化(Document Length Normalization)** :避免长文档因词频高而占据优势。
BM25 的公式比 TF-IDF 更精细,引入了可调参数(`k₁` 和 `b`),使其对不同数据集更鲁棒。


3、构建向量知识库
需要安装:
python
pip install langchain-milvus
```python
from langchain_milvus import Milvus, BM25BuiltInFunction
from langchain_openai import OpenAIEmbeddings
vectorstore = Milvus.from_documents(
documents=docs,
embedding=OpenAIEmbeddings(),
builtin_function=BM25BuiltInFunction(), # output_field_names="sparse"),
vector_field=["dense", "sparse"],
connection_args={
"uri": URI,
},
consistency_level="Strong",
drop_old=True,
)
```
当您使用 `BM25BuiltInFunction` 时,请注意全文检索在 Milvus Standalone 和 Milvus Distributed 中可用,但在 Milvus Lite 中不可用。
在上面的代码中,我们定义了 `BM25BuiltInFunction` 的一个实例,并将其传递给 `Milvus` 对象。`BM25BuiltInFunction` 是一个轻量级封装类。 [`Function`](https://milvus.io/docs/manage-collections.md#Function)的轻量级封装类。我们可以将它与 `OpenAIEmbeddings` 一起使用,初始化密集+稀疏混合搜索 Milvus 向量存储实例。
`BM25BuiltInFunction` Milvus "不要求客户端传递语料或训练,所有这些都在 Milvus 服务器端自动处理,因此用户无需关心任何词汇和语料。
**Milvus 支持的四种一致性级别**


