【LLM学习】【Ollama】三、RAG
在大语言模型(LLM)应用中,检索增强生成(RAG)技术因其能让模型结合外部知识回答问题而备受关注。本文将结合一个简洁的开源项目,带你从零理解 RAG 的核心原理与实现方式,即使没有复杂的工程经验也能快速上手。
项目地址:https://github.com/MiaoJieF/LLM_rag
一、什么是 RAG?为什么需要它?
RAG(Retrieval-Augmented Generation,检索增强生成)是一种将 “检索外部知识” 与 “LLM 生成” 结合的技术。它解决了传统 LLM 的两大痛点:
- 知识时效性问题:LLM 训练数据有截止日期,无法回答最新信息
- 知识准确性问题:避免模型 “一本正经地胡说八道”,答案可追溯到来源文档
简单来说,RAG 的工作流程可以概括为四步:
- 分块:将长文档切割成有重叠的小片段(保持语义完整)
- 向量化:用嵌入模型将文本片段转换为向量(数字表示)
- 检索:将用户问题转为向量,与文本向量做相似度匹配,找到最相关的片段
- 生成:将问题和检索到的片段一起传给 LLM,生成基于参考文档的答案
二、一个极简的 RAG 实现:简易版 localGPT
今天要介绍的这个开源项目(项目结构)专为学习 RAG 原理设计,代码简洁易懂,无需复杂依赖即可本地运行。它的核心特点是:
- 纯离线运行:支持本地嵌入模型和本地 LLM(无需联网调用 API)
- 轻量易上手:代码量少,模块划分清晰,适合初学者阅读
- 功能完整:包含文档加载、分块、嵌入、检索、生成全流程
1. 项目核心结构
.
├─ data/ # TXT 文档(示例:sample.txt)
├─ src/
│ ├─ loader.py # 加载 .txt 文件
│ ├─ chunker.py # 文本分块(定长+重叠)
│ ├─ embeddings.py # Sentence-Transformers 嵌入(支持本地目录)
│ ├─ vector_store.py # 内存向量库 + 余弦相似度检索 + 保存/加载
│ ├─ retriever.py # 检索器(整合分块、嵌入、搜索)
│ ├─ llm.py # 本地 LLM(llama.cpp 可选)+ Ollama 客户端(支持流式&中文)
│ └─ cli.py # 命令行入口(index / ask / chat)
├─ tests/ # 基础测试
├─ requirements.txt # 依赖
└─ README.md
每个模块各司其职,通过简单的调用关系构成完整的 RAG 流程,非常适合逐模块学习。
2. 核心功能解析
(1)文本分块:保持语义的关键
长文本直接处理会丢失上下文,项目通过chunker.py实现定长 + 重叠分块:
# 核心分块逻辑(src/chunker.py)
def simple_chunk(text: str, chunk_size: int = 500, chunk_overlap: int = 100) -> List[str