大模型技术栈核心组件全解析:以 Langchain-Chatchat 的 RAG 与 Agent 实现为例
本文以 Langchain-Chatchat 样例知识库中的文档 大模型技术栈-实战与应用 为主线,系统梳理大模型技术栈从训练、推理、压缩到 Embedding、向量数据库、应用编排、前端与 API 服务的八大组件层。读完本文,你将理解每一层框架的定位与选型差异,并能结合 Langchain-Chatchat 仓库中的真实配置与源码,把技术栈落地为一个可运行的 RAG 知识库问答系统。
一、技术栈全景:八个组件层如何分工
样例文档将大模型技术栈划分为八个层次,每层都有代表性开源项目。这个分类本身就是工程实践中搭建大模型应用的"地图":
| 层次 | 文档列出的代表项目 | 核心职责 |
|---|---|---|
| 训练框架 | deepspeed、megatron-lm、colossal-ai、trlx | 分布式训练与训练流程编排 |
| 推理框架 | triton、vllm、text-generation-inference、lit-llama、lightllm、TensorRT-LLM(原 FasterTransformer)、fastllm、inferllm、llama-cpp、openPPL-LLM | 高吞吐、低延迟地部署模型推理服务 |
| 压缩框架 | bitsandbytes、auto-gptq、deepspeed | 量化与显存压缩,降低部署成本 |
| Embedding 框架 | sentence-transformer、FlagEmbedding | 文本向量化,是 RAG 检索的地基 |
| 向量数据库 | faiss、pgvector、milvus、pinecone、weaviate、LanceDB、Chroma | 向量索引与相似度检索 |
| 应用框架 | Auto-GPT、langchain、llama-index、quivr | Prompt 编排、RAG/Agent 工作流 |
| Python 前端 | streamlit、gradio | 快速搭建对话与知识库管理界面 |
| Python API 工具 | FastAPI+uvicorn、flask、Django | 将对话与检索能力封装为 API 服务 |
值得说明的是,这篇文档本身并不只是"文档"——它存放在 chatchat/data/knowledge_base/samples/content/ 目录下,是 Langchain-Chatchat 内置样例知识库 samples 的语料之一,与 分布式训练技术原理.md、大模型推理优化策略.md 等文档共同构成演示 RAG 能力的示例数据。也就是说,本文所梳理的技术栈,在仓库内部就有完整的"落地样板"可供验证。
二、训练框架层:deepspeed、megatron-lm、colossal-ai、trlx
训练框架解决的是"如何把大模型训出来"的问题,文档列出的四个项目各有侧重:
- deepspeed:微软开源的深度学习优化库,核心是 ZeRO 系列显存优化策略,可将优化器状态、梯度、参数分片到多卡,使单卡装不下的模型也能训练;同时它也是常见的推理侧显存压缩方案来源(见后文压缩框架)。
- megatron-lm:NVIDIA 出品,以张量并行(Tensor Parallelism)为核心,是 GPT 类大模型预训练的参考实现之一,擅长超大模型的并行策略设计。
- colossal-ai:面向大模型训练的开源框架,提供自动混合精度、显存优化与并行策略的统一接口,降低分布式训练的接入门槛。
- trlx:面向强化学习与指令微调的训练框架,常与 SFT、PPO 等对齐训练阶段结合使用。
从工程视角看,训练框架属于"模型供给侧",绝大多数 RAG 应用开发者并不需要自己训练模型,但理解这一层有助于判断开源权重、量化版本与训练方案的关系。
三、推理框架层:成本与延迟的主战场
推理框架是技术栈中与生产成本关系最直接的一层。文档列出的项目可以按"部署形态"粗分为三类:
- 引擎/服务一体化:vllm(PagedAttention、连续批处理,高并发吞吐)、triton(NVIDIA 的通用推理服务框架)、text-generation-inference(HuggingFace 官方推理服务,基于 Triton 扩展)、TensorRT-LLM(原 FasterTransformer,面向 NVIDIA GPU 的极致优化引擎)。
- 轻量/端侧:lit-llama(支持多种量化格式与硬件后端)、llama-cpp(C/C++ 实现的 CPU 与边缘设备推理)、lightllm、fastllm、inferllm、openPPL-LLM(面向国产 PPU 芯片的 LLM 框架)。
Langchain-Chatchat 在这一层的位置是"应用侧"而非"引擎侧":它不内置本地 GPU 推理,而是通过 OpenAI 兼容 API 对接模型服务平台。这一点在 settings.py 的 MODEL_PLATFORMS 配置中体现得很清楚——默认配置了 xinference(http://127.0.0.1:9997/v1)、ollama(http://127.0.0.1:11434/v1)、oneapi、openai 四类平台,每类平台声明可用的 llm_models、embed_models、rerank_models 等模型列表,并支持 auto_detect_model 自动发现。换言之,你用什么推理框架(vLLM、Xinference、Ollama、llama.cpp 等)承载模型,对 Chatchat 而言都是"可插拔的模型源",只需在配置中登记即可。
四、压缩框架层:bitsandbytes、auto-gptq、deepspeed
压缩/量化框架的目标是让大模型在更少的显存里跑起来:
- bitsandbytes:提供 8bit 优化器与 4bit/8bit 权重量化(LLM.int8()、NF4 等),是消费级显卡微调与推理的常用工具;
- auto-gptq:面向 LLaMA 系列模型的 4bit GPTQ 量化方案,推理加速显著;
- deepspeed:除训练外,其 ZeRO-Infinity 等能力也被用于大模型的量化与低显存推理加载。
在 Langchain-Chatchat 的场景中,压缩发生在模型服务侧:例如通过 Ollama 拉取量化后的 qwen:7b,或在 Xinference 中部署 4bit/8bit 量化模型,然后在 settings.py 的 MODEL_PLATFORMS 中登记模型名即可,应用侧无需感知量化细节。
五、Embedding 框架层:sentence-transformer 与 FlagEmbedding
Embedding 框架决定"文本如何变成向量",是 RAG 检索质量的第一道关口。文档列出的两个代表:
- sentence-transformer:Hugging Face 社区的句子向量库,提供了 Bi-Encoder 结构的标准实现与大量预训练模型;
- FlagEmbedding:BAAI 出品的检索增强方向 Embedding 模型库,BGE 系列模型(bge-base、bge-large、bge-m3 等)即出自该体系。
仓库中的默认配置印证了这一层的选择:settings.py 中 DEFAULT_EMBEDDING_MODEL: str = "bge-m3",即以 BGE 系列的 bge-m3 作为默认 Embedding 模型;同文件中的 EMBEDDING_KEYWORD_FILE: str = "embedding_keywords.txt" 还预留了"Embedding 定制词表"入口,用于处理行业术语的向量化。此外,仓库在 localai_embeddings.py 与 zhipuai.py 中分别提供了本地 Embedding 与远端 API Embedding 的适配实现,说明这一层同样遵循"可插拔"设计。
六、向量数据库选型:技术栈中最实操的一层
文档列出了七个向量数据库选项:faiss、pgvector、milvus、pinecone、weaviate、LanceDB、Chroma。它们的差异主要体现在部署方式(本地库/自托管/云原生)、客户端生态与索引能力上。Langchain-Chatchat 在这一层做了相当完整的实现,是全文档中最值得细读的部分。
6.1 可选项与实际实现
settings.py 中的 DEFAULT_VS_TYPE 声明了应用支持的向量库类型:
DEFAULT_VS_TYPE: t.Literal["faiss", "milvus", "zilliz", "pg", "es", "relyt", "chromadb"] = "faiss"
对应地,kb_service/ 目录下为每种类型提供了独立的服务实现,接口统一(由 base.py 中的 KBService 抽象):
- faiss_kb_service.py:本地 FAISS 文件方案,默认选项,零外部依赖;
- milvus_kb_service.py 与 zilliz_kb_service.py:分布式向量数据库(Zilliz 为 Milvus 的云服务形态);
- pg_kb_service.py:PostgreSQL(pgvector 路线);
- es_kb_service.py:Elasticsearch 全文检索路线;
- chromadb_kb_service.py:轻量嵌入式向量库;
- relyt_kb_service.py:基于 PostgreSQL 的 RelYT 向量检索。
每种方案都有对应测试用例可验证行为,见 test_faiss_kb.py、test_milvus_db.py、test_pg_db.py、test_relyt_db.py。
6.2 各向量库的连接配置
KBSettings.kbs_config 给出了每种向量库的完整连接参数模板(节选自 settings.py 的默认值):
kbs_config: t.Dict[str, t.Dict] = {
"faiss": {},
"milvus": {
"host": "127.0.0.1", "port": "19530",
"user": "", "password": "", "secure": False
},
"zilliz": {
"host": "in01-...zilliz.com.cn", "port": "19530",
"user": "", "password": "", "secure": True
},
"pg": {
"connection_uri": "postgresql://postgres:postgres@127.0.0.1:5432/langchain_chatchat"
},
"es": {
"scheme": "http", "host": "127.0.0.1", "port": "9200",
"index_name": "test_index", "user": "", "password": "",
"verify_certs": True, ...
},
"milvus_kwargs": {
"search_params": {"metric_type": "L2"},
"index_params": {"metric_type": "L2", "index_type": "HNSW"}
},
"chromadb": {}
}
可以看到几个工程细节:Milvus 侧默认采用 HNSW 索引 + L2 度量(milvus_kwargs),这与文档中向量数据库"索引方法"的选型维度相呼应;Zilliz 配置默认 secure: True,即走 TLS 连接云服务。切换向量库时,通常只需修改 DEFAULT_VS_TYPE 与对应的 kbs_config 段,然后重建知识库向量索引。
七、应用框架层:langchain 在 Chatchat 中的位置
文档将 Auto-GPT、langchain、llama-index、quivr 列为应用框架代表。其中 langchain 是 Langchain-Chatchat 的底座:从仓库源码看,RAG 检索链、Agent 工具调用、Prompt 模板均构建在其组件体系之上。一个直观的例子是混合检索器 ensemble.py:
from langchain.retrievers import EnsembleRetriever
from langchain_community.retrievers import BM25Retriever
class EnsembleRetrieverService(BaseRetrieverService):
@staticmethod
def from_vectorstore(vectorstore, top_k, score_threshold):
faiss_retriever = vectorstore.as_retriever(
search_type="similarity_score_threshold",
search_kwargs={"score_threshold": score_threshold, "k": top_k},
)
import jieba
docs = list(vectorstore.docstore._dict.values())
bm25_retriever = BM25Retriever.from_documents(
docs, preprocess_func=jieba.lcut_for_search)
bm25_retriever.k = top_k
ensemble_retriever = EnsembleRetriever(
retrievers=[bm25_retriever, faiss_retriever], weights=[0.5, 0.5])
...
这里用 langchain 的 EnsembleRetriever 将向量检索(相似度阈值过滤)与 BM25 关键字检索(jieba 分词预处理)按 0.5/0.5 权重融合。这一实现正是文档中"检索:向量检索 + 关键字检索(BM25)"技术路线的代码化表达。而 Agent 侧的工具与平台工具则集中在 langchain_chatchat/agent_toolkits/ 与 agent/ 目录下,对应文档"应用框架"层中编排工具与模型的部分。
八、前端与 API 服务层:streamlit/gradio 与 FastAPI+uvicorn
文档把界面与服务分为两层:Python 前端(streamlit、gradio)与 Python API 工具(FastAPI+uvicorn、flask、Django)。Langchain-Chatchat 恰好两者都覆盖,且架构分离清晰:
- WebUI(Streamlit):入口在 webui.py,页面组织在 webui_pages/ 下,包含
dialogue(对话)、knowledge_base(知识库管理)、model_config(模型配置)等模块;settings.py 中WEBUI_SERVER: dict = {"host": ..., "port": 8501}即 Streamlit 的默认端口。 - API 服务(FastAPI):入口在 server_app.py,路由按职责拆分为 chat_routes.py(对话/知识库问答/文件对话)、kb_routes.py(知识库管理)、openai_routes.py(OpenAI 兼容接口)、mcp_routes.py(MCP 连接管理)等;
static/目录下的 Swagger UI 资源表明其自带交互式 API 文档。API_SERVER默认监听 7861 端口。 - 外部 SDK:libs/python-sdk/open_chatcaht/ 提供了面向该 API 服务的 Python 客户端(
chat、knowledge_base、tools、server等 Client),方便在自有系统中直接调用 Chatchat 服务,这正是"应用框架之上再接业务"的典型形态。
九、串起来:样例知识库的入库与检索全流程
以本文的源文档 大模型技术栈-实战与应用.md 为例,它在 Langchain-Chatchat 中的完整 RAG 生命周期可以概括为四步,每步都能在源码中找到对应实现:
1. 加载(Loader)。文件放在知识库根目录下(KB_ROOT_PATH 默认指向 data/knowledge_base,见 settings.py),具体加载器按文件类型选择,实现在 document_loaders/(PDF、DOCX、PPT、CSV、图片等均有定制 loader)。
2. 切分(TextSplitter)。默认切分器由 TEXT_SPLITTER_NAME: str = "ChineseRecursiveTextSplitter" 指定,其实现见 chinese_recursive_text_splitter.py——相比通用切分器,它针对中文补充了 。|!|?、;|;\s、,|,\s 等句读分隔符。CHUNK_SIZE: int = 750、OVERLAP_SIZE: int = 150 控制块长与重叠。从源码结构看(utils.py 的 make_text_splitter),Markdown 文件会走 MarkdownHeaderTextSplitter 按标题层级切分,切分器配置在 text_splitter_dict 中统一定义。
3. 向量化入库(Embedding + VectorStore)。由 DEFAULT_EMBEDDING_MODEL 指定的 bge-m3 生成向量,写入 DEFAULT_VS_TYPE 对应的向量库;FAISS 方案下由 faiss_kb_service.py 负责建库与落盘,并配有 faiss_cache.py 线程安全的向量库缓存池(CACHED_VS_NUM 控制缓存数量)。
4. 混合检索(EnsembleRetriever)。检索时按上文第六、七节所述,走"向量 + BM25"融合,受 VECTOR_SEARCH_TOP_K: int = 3 与 SCORE_THRESHOLD: float = 2.0(配置注释建议设置在 0.5 左右,0-2 之间越小越严格)控制。样例知识库在配置中的注册也很直观:
DEFAULT_KNOWLEDGE_BASE: str = "samples"
KB_INFO: t.Dict[str, str] = {"samples": "关于本项目issue的解答"}
即启动后默认加载 samples 知识库,其介绍语会展示在界面上并供 Agent 调用时参考。
十、选型速查与适用边界
结合样例文档的分类与仓库实现,可得到一份简明的"场景 → 组件"对照:
| 场景 | 文档列出的候选 | 当前仓库中的落地 |
|---|---|---|
| 单机快速验证 RAG | faiss、Chroma | DEFAULT_VS_TYPE: faiss,默认零依赖方案 |
| 已有 PostgreSQL 生态 | pgvector | pg 类型 + connection_uri 配置 |
| 大规模向量检索 | milvus、weaviate、pinecone、LanceDB | milvus/zilliz 类型,HNSW + L2 索引 |
| 中文文本语义检索 | FlagEmbedding、sentence-transformer | 默认 bge-m3(BGE 体系) |
| 对话界面原型 | streamlit、gradio | Streamlit WebUI(8501 端口) |
| 对外提供对话 API | FastAPI+uvicorn、flask、Django | FastAPI API 服务(7861 端口)+ Python SDK |
| 模型推理服务 | vllm、triton、llama-cpp 等 | 不内置,经 OpenAI 兼容 API 对接 xinference/ollama/oneapi/openai 平台 |
最后需要说明适用边界:本文引用的配置默认值、端口与组件清单均以当前仓库 settings.py 及对应服务实现为准;样例文档列出的部分框架(如 Auto-GPT、quivr、LanceDB、pinecone)属于行业生态的选型参照,并未在 Langchain-Chatchat 中实现对应集成,实际接入前请以仓库代码与官方文档为准。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00