Happy-LLM项目中的RAG技术详解:从原理到实现
2025-06-03 01:18:13作者:裘旻烁
引言:为什么需要RAG技术
在当今大语言模型(LLM)快速发展的时代,虽然模型展现出了惊人的语言理解和生成能力,但依然面临着三个核心挑战:
- 幻觉问题:模型有时会生成看似合理但实际错误的内容
- 知识时效性:模型训练数据固定,无法获取最新信息
- 领域专业性:对特定领域知识的理解深度不足
Happy-LLM项目中的RAG(检索增强生成)技术正是为解决这些问题而生。本文将深入解析RAG的核心原理,并手把手教你实现一个简化版的Tiny-RAG系统。
RAG技术原理剖析
核心思想
RAG(Retrieval-Augmented Generation)将传统的信息检索技术与现代大语言模型相结合,其工作流程可概括为:
- 检索阶段:从外部知识库中查找与问题相关的文档片段
- 生成阶段:将检索结果作为上下文输入给LLM生成最终回答
这种"检索+生成"的双阶段架构,既保留了LLM强大的语言能力,又通过引入外部知识提升了回答的准确性和时效性。
技术优势
与传统LLM相比,RAG具有以下显著优势:
- 准确性提升:基于真实文档生成,减少幻觉现象
- 知识可追溯:回答来源可查证,增强可信度
- 实时更新:只需更新知识库,无需重新训练模型
- 领域适应:针对不同领域构建专属知识库
Tiny-RAG实现详解
下面我们将分步骤实现Happy-LLM项目中的Tiny-RAG系统,该系统包含五大核心模块:
1. 向量化模块
向量化是将文本转换为数值向量的过程,是RAG的基础。Happy-LLM采用模块化设计,便于扩展不同嵌入模型:
class BaseEmbeddings:
"""嵌入模型基类"""
def get_embedding(self, text: str) -> List[float]:
"""获取文本向量表示"""
raise NotImplementedError
@staticmethod
def cosine_similarity(v1: List[float], v2: List[float]) -> float:
"""计算余弦相似度"""
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
实际项目中可继承此基类实现不同嵌入模型,如OpenAI、Zhipu等。
2. 文档处理模块
文档处理包括加载和切分两个步骤:
def read_file(file_path: str) -> str:
"""支持PDF/MD/TXT等多种格式"""
if file_path.endswith('.pdf'):
return read_pdf(file_path)
# 其他格式处理...
def chunk_text(text: str, max_len: int = 600, overlap: int = 150) -> List[str]:
"""按最大长度切分文本,保留重叠部分"""
chunks = []
current = ""
for line in text.split('\n'):
if len(current) + len(line) > max_len:
chunks.append(current)
current = current[-overlap:] + line # 保留重叠
else:
current += line
return chunks
3. 向量数据库
向量数据库负责存储和检索文档片段:
class VectorStore:
def __init__(self):
self.vectors = [] # 存储向量
self.documents = [] # 存储原文
def add_document(self, text: str, embedder: BaseEmbeddings):
"""添加文档并向量化"""
self.documents.append(text)
self.vectors.append(embedder.get_embedding(text))
def query(self, query: str, embedder: BaseEmbeddings, top_k: int = 3) -> List[str]:
"""检索最相关的k个文档"""
query_vec = embedder.get_embedding(query)
scores = [embedder.cosine_similarity(query_vec, vec) for vec in self.vectors]
return [self.documents[i] for i in np.argsort(scores)[-top_k:]]
4. 大模型接口
统一的大模型接口设计:
class BaseLLM:
def generate(self, prompt: str, context: str) -> str:
"""基于上下文生成回答"""
raise NotImplementedError
class InternLM2(BaseLLM):
def __init__(self, model_path: str):
self.load_model(model_path)
def generate(self, prompt: str, context: str) -> str:
full_prompt = f"基于以下上下文回答:\n{context}\n问题:{prompt}\n回答:"
return self.model.generate(full_prompt)
5. 完整流程整合
将各模块组合成完整RAG系统:
class TinyRAG:
def __init__(self, embedder: BaseEmbeddings, llm: BaseLLM):
self.embedder = embedder
self.llm = llm
self.vector_db = VectorStore()
def index(self, documents: List[str]):
"""建立索引"""
for doc in documents:
self.vector_db.add_document(doc, self.embedder)
def query(self, question: str) -> str:
"""查询流程"""
contexts = self.vector_db.query(question, self.embedder)
return self.llm.generate(question, "\n".join(contexts))
实际应用示例
使用Happy-LLM中的Tiny-RAG处理技术文档问答:
# 初始化组件
embedder = ZhipuEmbedding()
llm = InternLM2("model/internlm2-7b")
rag = TinyRAG(embedder, llm)
# 构建知识库
docs = read_files("data/tech_docs/")
rag.index(docs)
# 执行查询
question = "解释Git的工作原理"
answer = rag.query(question)
print(answer)
优化方向
基础版Tiny-RAG还可进一步优化:
- 检索优化:引入重排序(Rerank)提升结果相关性
- 分块策略:尝试不同分块大小和重叠比例
- 混合检索:结合关键词检索和向量检索
- 缓存机制:缓存常见查询结果提升响应速度
结语
通过Happy-LLM项目的Tiny-RAG实现,我们展示了如何将检索技术与大语言模型相结合,有效提升模型回答的准确性和可靠性。这种架构不仅适用于通用场景,也可方便地适配各种专业领域,是构建知识密集型应用的理想选择。
RAG技术仍在快速发展,未来与微调、提示工程等技术的结合将带来更多可能性。希望本文能为你的LLM应用开发提供有价值的参考。
登录后查看全文
热门项目推荐
- DDeepSeek-V3.1-BaseDeepSeek-V3.1 是一款支持思考模式与非思考模式的混合模型Python00
- QQwen-Image-Edit基于200亿参数Qwen-Image构建,Qwen-Image-Edit实现精准文本渲染与图像编辑,融合语义与外观控制能力Jinja00
GitCode-文心大模型-智源研究院AI应用开发大赛
GitCode&文心大模型&智源研究院强强联合,发起的AI应用开发大赛;总奖池8W,单人最高可得价值3W奖励。快来参加吧~052CommonUtilLibrary
快速开发工具类收集,史上最全的开发工具类,欢迎Follow、Fork、StarJava04GitCode百大开源项目
GitCode百大计划旨在表彰GitCode平台上积极推动项目社区化,拥有广泛影响力的G-Star项目,入选项目不仅代表了GitCode开源生态的蓬勃发展,也反映了当下开源行业的发展趋势。06GOT-OCR-2.0-hf
阶跃星辰StepFun推出的GOT-OCR-2.0-hf是一款强大的多语言OCR开源模型,支持从普通文档到复杂场景的文字识别。它能精准处理表格、图表、数学公式、几何图形甚至乐谱等特殊内容,输出结果可通过第三方工具渲染成多种格式。模型支持1024×1024高分辨率输入,具备多页批量处理、动态分块识别和交互式区域选择等创新功能,用户可通过坐标或颜色指定识别区域。基于Apache 2.0协议开源,提供Hugging Face演示和完整代码,适用于学术研究到工业应用的广泛场景,为OCR领域带来突破性解决方案。00openHiTLS
旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!C0345- WWan2.2-S2V-14B【Wan2.2 全新发布|更强画质,更快生成】新一代视频生成模型 Wan2.2,创新采用MoE架构,实现电影级美学与复杂运动控制,支持720P高清文本/图像生成视频,消费级显卡即可流畅运行,性能达业界领先水平Python00
- GGLM-4.5-AirGLM-4.5 系列模型是专为智能体设计的基础模型。GLM-4.5拥有 3550 亿总参数量,其中 320 亿活跃参数;GLM-4.5-Air采用更紧凑的设计,拥有 1060 亿总参数量,其中 120 亿活跃参数。GLM-4.5模型统一了推理、编码和智能体能力,以满足智能体应用的复杂需求Jinja00
Yi-Coder
Yi Coder 编程模型,小而强大的编程助手HTML013
热门内容推荐
最新内容推荐
项目优选
收起

React Native鸿蒙化仓库
C++
179
263

🎉 (RuoYi)官方仓库 基于SpringBoot,Spring Security,JWT,Vue3 & Vite、Element Plus 的前后端分离权限管理系统
Vue
869
514

openGauss kernel ~ openGauss is an open source relational database management system
C++
130
183

旨在打造算法先进、性能卓越、高效敏捷、安全可靠的密码套件,通过轻量级、可剪裁的软件技术架构满足各行业不同场景的多样化要求,让密码技术应用更简单,同时探索后量子等先进算法创新实践,构建密码前沿技术底座!
C
307
337

本仓将收集和展示高质量的仓颉示例代码,欢迎大家投稿,让全世界看到您的妙趣设计,也让更多人通过您的编码理解和喜爱仓颉语言。
Cangjie
333
1.09 K

harmony-utils 一款功能丰富且极易上手的HarmonyOS工具库,借助众多实用工具类,致力于助力开发者迅速构建鸿蒙应用。其封装的工具涵盖了APP、设备、屏幕、授权、通知、线程间通信、弹框、吐司、生物认证、用户首选项、拍照、相册、扫码、文件、日志,异常捕获、字符、字符串、数字、集合、日期、随机、base64、加密、解密、JSON等一系列的功能和操作,能够满足各种不同的开发需求。
ArkTS
18
0

为仓颉编程语言开发者打造活跃、开放、高质量的社区环境
Markdown
1.08 K
0

deepin linux kernel
C
22
5

微信开发 Java SDK,支持微信支付、开放平台、公众号、视频号、企业微信、小程序等的后端开发,记得关注公众号及时接受版本更新信息,以及加入微信群进行深入讨论
Java
829
22

🍒 Cherry Studio 是一款支持多个 LLM 提供商的桌面客户端
TypeScript
601
58