首页 > 教程攻略 > ai资讯 >3.3  Embedding模型介绍

3.3  Embedding模型介绍

来源:互联网 时间:2026-08-04 14:15:48

基于LangChain-Chatchat实现的本地知识库的问答应用-快速上手(检索增强生成(RAG)大模型)

基于 ChatGLM 等大语言模型与 Langchain 等应用框架实现,开源、可离线部署的检索增强生成(RAG)大模型知识库项目。

3.3  Embedding模型介绍

1. 介绍

这个项目说白了,就是利用 langchain 的思想,搭建一个基于本地知识库的问答应用。目标很明确:在中文场景下,对开源模型友好,能够离线运行,成为一套完整的知识库问答解决方案。

说起来,这个项目的灵感来源于两个开源项目:GanymedeNil 的 document.ai 和 AlexZhangji 创建的 ChatGLM-6B Pull Request。顺着这个思路,开发者们搞出了一个全流程可用开源模型实现的本地知识库问答应用。在最新版本中,通过 FastChat 接入了 Vicuna、Alpaca、LLaMA、Koala、RWKV 等一系列模型,并且依托 langchain 框架,既可以通过 FastAPI 提供 API 服务,也可以用 Streamlit 的 WebUI 进行操作。

要说最大的亮点,那就是完全开源、离线私有部署。依托项目支持的开源 LLM 和 Embedding 模型,可以做到不联网、全本地化运行。当然,如果愿意,它也支持调用 OpenAI 的 GPT API,后续还会不断扩充对各类模型及 API 的接入。

实现原理并不复杂,看图就明白了:加载文件 → 读取文本 → 文本分割 → 文本向量化 → 问句向量化 → 在文本向量中匹配出与问句向量最相似的 top k 个 → 把匹配出的文本作为上下文,和问题一起丢进 prompt → 提交给 LLM 生成回答。

从文档处理角度来说,流程大致如下:

这里需要说明的是,整个项目并没有涉及微调或训练过程,但如果想优化效果,外部微调或训练是可以接入的。

另外,AutoDL 镜像中 0.2.10 版本使用的代码已经更新到本项目 v0.2.10 版本。Docker 镜像也更新到了 0.2.10。这次更新后,同时支持 DockerHub、阿里云、腾讯云三个镜像源:

docker run -d --gpus all -p 80:8501 isafetech/chatchat:0.2.10
docker run -d --gpus all -p 80:8501 uswccr.ccs.tencentyun.com/chatchat/chatchat:0.2.10
docker run -d --gpus all -p 80:8501 registry.cn-beijing.aliyuncs.com/chatchat/chatchat:0.2.10

项目有一个非常完整的 Wiki,README 只是一个简单的介绍,仅仅是入门教程,能保证基础运行。如果想深入了解或贡献代码,建议移步 Wiki 界面。

2. 解决的痛点

这个项目的核心价值,就是实现完全本地化的知识库增强方案,重点解决数据安全保护和私域化部署这两大企业痛点。开源方案采用 Apache License,可以免费商用,无需付费。

市面上主流的本地大语言模型和 Embedding 模型都支持,开源的本地向量数据库也全覆盖。具体的支持列表,可以参考 Wiki 页面。

3. 快速实现案例

3.1 环境配置

首先,确保机器安装了 Python 3.8 到 3.11(强烈推荐 Python 3.11)。

$ python --version
Python 3.11.7

然后创建一个虚拟环境,在里面安装项目依赖:

# 拉取仓库
$ git clone https://github.com/chatchat-space/Langchain-Chatchat.git

# 进入目录
$ cd Langchain-Chatchat

# 安装全部依赖
$ pip install -r requirements.txt 
$ pip install -r requirements_api.txt
$ pip install -r requirements_webui.txt

# 默认依赖包括基本运行环境(FAISS向量库)。如果要使用 milvus/pg_vector 等向量库,请将 requirements.txt 中相应依赖取消注释再安装。

如果在安装 pip install -r requirements.txt 时遇到报错:

  distutils.errors.DistutilsError: Command '['/Users/didiyu/ENTER/envs/chain/bin/python', '-m', 'pip', '--disable-pip-version-check', 'wheel', '--no-deps', '-w', '/var/folders/yd/mp5rd9bx1x3670cth1fp7n180000gn/T/tmpkl7z5ekl', '--quiet', 'setuptools_scm']' returned non-zero exit status 1.
  [end of output]

  note: This error originates from a subprocess, and is likely not a problem with pip.
error: metadata-generation-failed

× Encountered error while generating package metadata.
╰─> See above for output.

note: This is an issue with the package mentioned above, not pip.
hint: See above for details.

解决方案如下:

step1: pip install setuptools_scm
step 2: pip install wa vedrom -i https://pypi.tuna.tsinghua.edu.cn/simple

相关参考:

注意:LangChain-Chatchat 0.2.x 系列是针对 Langchain 0.0.x 系列的。如果使用的是 Langchain 0.1.x,需要降级 Langchain 版本。

3.2 模型下载

要在本地或离线环境运行,需要先把项目所需的模型下载下来。通常开源 LLM 和 Embedding 模型可以从 HuggingFace 下载。

以本项目中默认使用的 LLM 模型 THUDM/ChatGLM3-6B 和 Embedding 模型 BAAI/bge-large-zh 为例:

下载模型前需要安装 Git LFS,然后运行:

$ git lfs install
$ git clone https://huggingface.co/THUDM/chatglm3-6b
$ git clone https://huggingface.co/BAAI/bge-large-zh

如果下载速度慢,可以从魔塔(ModelScope)下载:

git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git
git clone https://www.modelscope.cn/Xorbits/bge-large-zh.git
git clone https://www.modelscope.cn/AI-ModelScope/bge-large-zh-v1.5.git

3.3 Embedding 模型介绍

FlagEmbedding 是一个专注于检索增强 LLM 领域的项目集合,目前包括以下子项目:

  • Long-Context LLM

    : Activation Beacon, LongLLM QLoRA
  • Fine-tuning of LM

    : LM-Cocktail
  • Embedding Model

    : Visualized-BGE, BGE-M3, LLM Embedder, BGE Embedding
  • Reranker Model

    : llm rerankers, BGE Reranker
  • Benchmark

    : C-MTEB

BGE-M3 - 多语言

这个项目发布了 BGE-M3,它是第一个具有多功能、多语言和多粒度特性的文本检索模型。

  • 多功能

    :可以同时执行三种检索功能:单向量检索、多向量检索和稀疏检索。
  • 多语言

    :支持 100 多种工作语言。
  • 多粒度

    :能够处理不同粒度的输入,从短句子到长达 8192 个词汇的长文档。

为了提高单一检索模式的性能,项目中提出了一种新的自知识蒸馏方法。优化了批处理策略,支持大批处理大小,这在长文本或大型语言模型向量微调时很实用。还构建了一个用于文档检索的数据集,并提出了简单策略提升长文本建模能力。

训练代码和微调数据将在不久的将来开源。

Visualized-BGE - 多模态

通过引入 image token embedding,Visualized-BGE 可以用来编码混合图文数据。可以广泛应用于多模态检索任务,包括但不限于多模态知识检索、多模态查询的图像检索等。

LongLLM QLoRA

通过 QLoRA 微调,将 Llama-3-8B-Instruct 的上下文长度从 8K 扩展到 80K。整个训练过程非常高效,在一台 8×A800 (80G) GPU 机器上只需 8 小时。该模型在 NIHS、主题检索和长上下文语言理解等评估任务中表现出卓越性能,同时短上下文中也保留原有能力。如此强大的长文本能力主要归因于 GPT-4 生成的仅 3.5K 合成数据——这表明 LLM 具有扩展其原始上下文的固有(但被低估)潜力。如果计算资源充足,该方法可以将上下文长度扩展得更长。

Activation Beacon

由于有限的上下文窗口长度,有效利用长上下文信息一直是 LLM 的巨大挑战。Activation Beacon 将 LLM 的原始激活压缩为更紧凑的形式,使其在有限的上下文窗口中感知更长的上下文。它是一种有效、高效、兼容、低成本(训练)的延长 LLM 上下文长度的方法。

LM-Cocktail

模型合并被用于提高单模型性能。这种方法对 LLM 和文本向量模型也很有用,设计了“语言模型鸡尾酒”方案,自动计算融合比例来融合基础模型和微调模型。利用 LM-Cocktail 可以缓解灾难性遗忘问题——即在不降低通用性能的情况下提高目标任务性能。通过构造少量数据样例,它还可以为新任务生成模型,无需微调。可同时用于合并生成模型或向量模型。

LLM Embedder

LLM-Embedder 向量模型是根据 LLM 的反馈进行微调的。它支持 LLM 的检索增强需求,包括知识检索、记忆检索、示例检索和工具检索。在 6 个任务上进行了微调:问题回答、对话搜索、长对话、长文本建模、上下文学习和工具学习。

BGE Reranker

交叉编码器会对查询和答案实时计算相关性分数,比向量模型(双编码器)更准确,但更耗时。因此,它常用来对嵌入模型返回的前 k 个文档重新排序。在多语言数据上训练了交叉编码器,数据格式与向量模型相同,可以轻松微调。新版交叉编码器支持更多语言和更长长度,新增了 prompt 用于微调和推理。可以使用特定层或完整层进行推理。

BGE Embedding

BGE Embedding 是一个通用向量模型。使用 retromae 进行预训练,再用对比学习在大规模成对数据上训练。可以在本地数据上微调嵌入模型。预训练的目标是重构文本,预训练后的模型无法直接用于相似度计算,需要微调之后才能用于相似度计算。

注意:BGE 使用 CLS 的表征作为整个句子的表示,如果使用了错误方式(如 mean pooling)会导致效果很差。

C-MTEB

中文向量榜单,已整合入 MTEB 中。

Embedding 模型列表

ModelLanguageDescriptionquery instruction for retrieval
BAAI/bge-m3Multilingual多功能(向量检索,稀疏检索,多表征检索)、多语言、多粒度(最大长度8192)
LM-CocktailEnglish微调的Llama和BGE模型,可复现LM-Cocktail论文结果
BAAI/llm-embedderEnglish专为大语言模型各种检索增强任务设计的向量模型详见 README
BAAI/bge-reranker-largeChinese and English交叉编码器模型,精度比向量模型更高但推理效率较低 [2]
BAAI/bge-reranker-baseChinese and English交叉编码器模型,精度比向量模型更高但推理效率较低 [2]
BAAI/bge-large-en-v1.5English1.5版本,相似度分布更加合理Represent this sentence for searching relevant passages:
BAAI/bge-base-en-v1.5English1.5版本,相似度分布更加合理Represent this sentence for searching relevant passages:
BAAI/bge-small-en-v1.5English1.5版本,相似度分布更加合理Represent this sentence for searching relevant passages:
BAAI/bge-large-zh-v1.5Chinese1.5版本,相似度分布更加合理为这个句子生成表示以用于检索相关文章:
BAAI/bge-base-zh-v1.5Chinese1.5版本,相似度分布更加合理为这个句子生成表示以用于检索相关文章:
BAAI/bge-small-zh-v1.5Chinese1.5版本,相似度分布更加合理为这个句子生成表示以用于检索相关文章:
BAAI/bge-large-enEnglish向量模型,将文本转换为向量Represent this sentence for searching relevant passages:
BAAI/bge-base-enEnglishbase-scale 向量模型Represent this sentence for searching relevant passages:
BAAI/bge-small-enEnglishsmall-scale 向量模型Represent this sentence for searching relevant passages:
BAAI/bge-large-zhChinese向量模型,将文本转换为向量为这个句子生成表示以用于检索相关文章:
BAAI/bge-base-zhChinesebase-scale 向量模型为这个句子生成表示以用于检索相关文章:
BAAI/bge-small-zhChinesesmall-scale 向量模型为这个句子生成表示以用于检索相关文章:

3.4 ChatGLM3-6B

ChatGLM3-6B 是 ChatGLM 系列最新一代的开源模型。在保留了前两代模型对话流畅、部署门槛低等众多优秀特性的基础上,引入了以下特性:

  • 更强大的基础模型

    :基础模型 ChatGLM3-6B-Base 采用更多样的训练数据、更充分的训练步数和更合理的训练策略。在语义、数学、推理、代码、知识等不同角度的数据集评测显示,ChatGLM3-6B-Base 是 10B 以下预训练模型中性能最强的。
  • 更完整的功能支持

    :采用全新设计的 Prompt 格式,除正常多轮对话外,原生支持工具调用(Function Call)、代码执行(Code Interpreter)和 Agent 任务等复杂场景。
  • 更全面的开源序列

    :除了对话模型 ChatGLM3-6B,还开源了基础模型 ChatGLM-6B-Base、长文本对话模型 ChatGLM3-6B-32K。
pip install protobuf 'transformers>=4.30.2' cpm_kernels 'torch>=2.0' gradio mdtex2html sentencepiece accelerate

模型下载(使用 ModelScope):

pip install modelscope
from modelscope import snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")

也支持 git 下载:

git lfs install
git clone https://www.modelscope.cn/ZhipuAI/chatglm3-6b.git

代码调用示例:

from modelscope import AutoTokenizer, AutoModel, snapshot_download
model_dir = snapshot_download("ZhipuAI/chatglm3-6b", revision = "v1.0.0")
tokenizer = AutoTokenizer.from_pretrained(model_dir, trust_remote_code=True)
model = AutoModel.from_pretrained(model_dir, trust_remote_code=True).half().cuda()
model = model.eval()
response, history = model.chat(tokenizer, "你好", history=[])
print(response)
response, history = model.chat(tokenizer, "晚上睡不着应该怎么办", history=history)
print(response)

3.5 初始化知识库和配置文件

按照下面方式初始化知识库并复制配置文件:

$ python copy_config_example.py
$ python init_database.py --recreate-vs

配置文件的详细内容如下:

basic_config.py.example

import logging
import os
import langchain
import tempfile
import shutil

# 是否显示详细日志
log_verbose = False
langchain.verbose = False

# 通常情况下不需要更改以下内容

# 日志格式
LOG_FORMAT = "%(asctime)s - %(filename)s[line:%(lineno)d] - %(levelname)s: %(message)s"
logger = logging.getLogger()
logger.setLevel(logging.INFO)
logging.basicConfig(format=LOG_FORMAT)

# 日志存储路径
LOG_PATH = os.path.join(os.path.dirname(os.path.dirname(__file__)), "logs")
if not os.path.exists(LOG_PATH):
    os.mkdir(LOG_PATH)

# 临时文件目录,主要用于文件对话
BASE_TEMP_DIR = os.path.join(tempfile.gettempdir(), "chatchat")
try:
    shutil.rmtree(BASE_TEMP_DIR)
except Exception:
    pass
os.makedirs(BASE_TEMP_DIR, exist_ok=True)

kb_config.py.example

import os

# 默认使用的知识库
DEFAULT_KNOWLEDGE_BASE = "samples"

# 默认向量库/全文检索引擎类型。可选:faiss, milvus(离线) & zilliz(在线), pgvector, chromadb 全文检索引擎es
DEFAULT_VS_TYPE = "faiss"

# 缓存向量库数量(针对FAISS)
CACHED_VS_NUM = 1

# 缓存临时向量库数量(针对FAISS),用于文件对话
CACHED_MEMO_VS_NUM = 10

# 知识库中单段文本长度(不适用MarkdownHeaderTextSplitter)
CHUNK_SIZE = 250

# 知识库中相邻文本重合长度(不适用MarkdownHeaderTextSplitter)
OVERLAP_SIZE = 50

# 知识库匹配向量数量
VECTOR_SEARCH_TOP_K = 3

# 知识库匹配的距离阈值,一般取值范围在0-1之间,SCORE越小,距离越小从而相关度越高。
# 但有用户报告遇到过匹配分值超过1的情况,为了兼容性默认设为1,在WEBUI中调整范围为0-2
SCORE_THRESHOLD = 1.0

# 默认搜索引擎。可选:bing, duckduckgo, metaphor
DEFAULT_SEARCH_ENGINE = "duckduckgo"

# 搜索引擎匹配结题数量
SEARCH_ENGINE_TOP_K = 3

model_config.py.example

import os

# 可以指定一个绝对路径,统一存放所有的Embedding和LLM模型。
# 每个模型可以是一个单独的目录,也可以是某个目录下的二级子目录。
# 如果模型目录名称和 MODEL_PATH 中的 key 或 value 相同,程序会自动检测加载,无需修改 MODEL_PATH 中的路径。
MODEL_ROOT_PATH = ""

# 选用的 Embedding 名称
EMBEDDING_MODEL = "bge-large-zh-v1.5"

# Embedding 模型运行设备。设为 "auto" 会自动检测(会有警告),也可手动设定为 "cuda","mps","cpu","xpu" 其中之一。
EMBEDDING_DEVICE = "auto"

# 选用的reranker模型
RERANKER_MODEL = "bge-reranker-large"
# 是否启用reranker模型
USE_RERANKER = False
RERANKER_MAX_LENGTH = 1024

# 如果需要在 EMBEDDING_MODEL 中增加自定义的关键字时配置
EMBEDDING_KEYWORD_FILE = "keywords.txt"
EMBEDDING_MODEL_OUTPUT_PATH = "output"

# 要运行的 LLM 名称,可以包括本地模型和在线模型。列表中本地模型将在启动项目时全部加载。
# 列表中第一个模型将作为 API 和 WEBUI 的默认模型。
# 在这里,我们使用目前主流的两个离线模型,其中,chatglm3-6b 为默认加载模型。
# 如果你的显存不足,可使用 Qwen-1_8B-Chat, 该模型 FP16 仅需 3.8G显存。

prompt_config.py.example

# prompt模板使用Jinja2语法,简单点就是用双大括号代替f-string的单大括号
# 本配置文件支持热加载,修改prompt模板后无需重启服务。

# LLM对话支持的变量:
# - input: 用户输入内容

# 知识库和搜索引擎对话支持的变量:
# - context: 从检索结果拼接的知识文本
# - question: 用户提出的问题

# Agent对话支持的变量:
# - tools: 可用的工具列表
# - tool_names: 可用的工具名称列表
# - history: 用户和Agent的对话历史
# - input: 用户输入内容
# - agent_scratchpad: Agent的思维记录

server_config.py.example

import sys
from configs.model_config import LLM_DEVICE

# httpx 请求默认超时时间(秒)。如果加载模型或对话较慢,出现超时错误,可以适当加大该值。
HTTPX_DEFAULT_TIMEOUT = 300.0

# API 是否开启跨域,默认为False,如果需要开启,请设置为True
OPEN_CROSS_DOMAIN = False

# 各服务器默认绑定host。如改为"0.0.0.0"需要修改下方所有XX_SERVER的host
DEFAULT_BIND_HOST = "0.0.0.0" if sys.platform != "win32" else "127.0.0.1"

# webui.py server
WEBUI_SERVER = {
    "host": DEFAULT_BIND_HOST,
    "port": 8501,
}

4. 一键启动

按照以下命令启动项目:

$ python startup.py -a

5. 启动界面示例

如果正常启动,将能看到以下界面。

  1. FastAPI Docs 界面
  • Web UI 启动界面示例:
    • Web UI 对话界面:
    • Agent-Tool效果
    • Web UI 知识库管理页面: