当前位置: 首页 > article >正文

如何用Python和HuggingFace搭建RAG系统?从文本预处理到答案生成的完整流程

如何用Python和HuggingFace搭建RAG系统从文本预处理到答案生成的完整流程在信息爆炸的时代如何让大型语言模型LLM既保持强大的生成能力又能准确回答特定领域的问题检索增强生成RAG系统给出了完美答案。本文将手把手教你用Python和HuggingFace生态系统构建完整的RAG流水线从原始文本处理到智能问答生成每个环节都配有可落地的代码示例。1. 环境准备与工具选型工欲善其事必先利其器。搭建RAG系统前需要配置合适的开发环境和工具链。以下是经过实战验证的推荐组合# 基础环境配置 python -m pip install torch transformers sentence-transformers faiss-cpu datasets核心组件对比表模块推荐方案替代方案适用场景文本嵌入sentence-transformersOpenAI Embeddings需要本地化部署的场景向量数据库FAISSChroma千万级以下向量检索语言模型HuggingFace Hub模型GPT-4 API需要控制成本的本地化部署提示初次接触RAG的开发者可先使用CPU版本FAISS待流程跑通后再考虑GPU加速方案。实际项目中我常遇到环境冲突问题特别是CUDA版本与PyTorch的兼容性。这里分享一个快速检查环境是否就绪的方法python -c import torch; print(torch.cuda.is_available())2. 知识库构建实战知识库质量直接决定RAG系统的上限。不同于简单的文本切割专业级知识库构建需要兼顾语义完整性和检索效率。2.1 智能文本分块策略传统固定大小的分块方式常会切断语义关联。我们采用动态分块算法from langchain.text_splitter import RecursiveCharacterTextSplitter def semantic_chunking(text, min_size200, max_size500): splitter RecursiveCharacterTextSplitter( chunk_sizemax_size, chunk_overlapmin_size//4, length_functionlen ) return splitter.split_text(text)分块效果对比固定分块可能在中途切断完整语义单元动态分块自动识别段落边界保持话题连贯性2.2 元数据增强技巧为每个文本块添加丰富的上下文信息可以显著提升后续检索准确率chunk_metadata { source: 2023年度医疗白皮书.pdf, page_range: 45-47, section: 疫苗分类, timestamp: 2023-11-15 }3. 向量化工程优化文本向量化是RAG系统的核心技术枢纽好的嵌入模型能让语义搜索事半功倍。3.1 嵌入模型选型建议基于HuggingFace的开源方案from sentence_transformers import SentenceTransformer # 中文推荐模型 zh_model SentenceTransformer(paraphrase-multilingual-MiniLM-L12-v2) # 英文优选方案 en_model SentenceTransformer(all-MiniLM-L6-v2)性能对比数据模型名称向量维度速度(句/秒)语义相似度得分paraphrase-multilingual-MiniLM384580082.1%bge-small-en-v1.5384620085.3%all-mpnet-base-v2768210086.9%3.2 批量处理加速技巧处理大规模文档时需要优化向量化流程from concurrent.futures import ThreadPoolExecutor def batch_embed(texts, model, batch_size32): with ThreadPoolExecutor() as executor: batches [texts[i:ibatch_size] for i in range(0, len(texts), batch_size)] results list(executor.map(model.encode, batches)) return [vec for batch in results for vec in batch]4. 混合检索系统实现单一向量检索在实际场景中常会遇到术语不匹配问题我们实现混合检索方案提升召回率。4.1 双引擎检索架构from rank_bm25 import BM25Okapi import faiss class HybridRetriever: def __init__(self, texts, embeddings): # 初始化向量检索 self.index faiss.IndexFlatIP(embeddings.shape[1]) self.index.add(embeddings) # 初始化关键词检索 tokenized_texts [doc.split() for doc in texts] self.bm25 BM25Okapi(tokenized_texts) def search(self, query, top_k5, alpha0.7): # 向量检索分支 query_embedding model.encode([query])[0] D, I self.index.search(query_embedding.reshape(1,-1), top_k) # 关键词检索分支 tokenized_query query.split() bm25_scores self.bm25.get_scores(tokenized_query) bm25_topk bm25_scores.argsort()[-top_k:][::-1] # 混合结果 combined [] for i, idx in enumerate(I[0]): combined.append((idx, alpha*D[0][i] (1-alpha)*bm25_scores[idx])) return sorted(combined, keylambda x: -x[1])[:top_k]4.2 重排序优化初步检索结果经过交叉编码器重排序后准确率可提升30%以上from transformers import AutoModelForSequenceClassification, AutoTokenizer reranker AutoModelForSequenceClassification.from_pretrained(cross-encoder/ms-marco-MiniLM-L-6-v2) tokenizer AutoTokenizer.from_pretrained(cross-encoder/ms-marco-MiniLM-L-6-v2) def rerank(query, passages): features tokenizer( [query]*len(passages), passages, paddingTrue, truncationTrue, return_tensorspt ) scores reranker(**features).logits return scores.argsort(descendingTrue)5. 生成模块的工程实践检索到相关文档后如何让LLM生成精准答案是关键一步。这里分享几个实用技巧。5.1 提示词工程模板PROMPT_TEMPLATE 基于以下上下文请用中文专业、准确地回答问题。如果无法确定答案请说明根据现有信息无法确定。 上下文 {context} 问题{question} 答案5.2 生成参数调优不同场景需要调整生成参数generation_config { temperature: 0.3, # 降低随机性 top_p: 0.9, # 核采样阈值 max_new_tokens: 300, # 答案长度限制 repetition_penalty: 1.2 # 避免重复 }参数影响实测数据温度值答案准确性多样性适用场景0.192%低事实性问答0.585%中创意生成1.072%高头脑风暴6. 系统集成与性能优化将各模块串联成完整流水线后还需要考虑工程化部署问题。6.1 异步处理架构对于高并发场景建议采用生产者-消费者模式import asyncio from queue import Queue task_queue Queue(maxsize100) async def process_question(question): # 检索阶段 results retriever.search(question) # 生成阶段 context \n.join([docs[i] for i, _ in results]) prompt PROMPT_TEMPLATE.format(contextcontext, questionquestion) answer generator.generate(prompt) return answer6.2 缓存机制实现对高频问题实现结果缓存from functools import lru_cache lru_cache(maxsize1000) def cached_search(question): return process_question(question)在医疗问答系统实测中引入缓存后平均响应时间从1.2秒降至0.3秒。

相关文章:

如何用Python和HuggingFace搭建RAG系统?从文本预处理到答案生成的完整流程

如何用Python和HuggingFace搭建RAG系统?从文本预处理到答案生成的完整流程 在信息爆炸的时代,如何让大型语言模型(LLM)既保持强大的生成能力,又能准确回答特定领域的问题?检索增强生成(RAG&…...

我筛了 GitHub 上 10 个值得长期留着的 AI 工具,不是越多越好

这两年大家聊 AI,容易把注意力都放在模型名字上:谁家参数更大,谁家榜单更高,谁家价格更低。 但真到落地阶段,效率差距往往不是模型先拉开的,而是工具先拉开的。 同样是一个模型,有人拿来聊两句…...

别再手动解析AT指令了!手把手教你用C语言构建一个可扩展的AT协议解析框架

构建高扩展性AT指令解析框架:从零设计到工业级实现 在嵌入式开发领域,AT指令作为模块间通信的通用语言,几乎出现在所有无线通信模组的交互中。但面对不同厂商五花八门的指令格式,开发者往往陷入重复造轮子的困境——每次对接新模组…...

AI代码优化神器coze-loop体验:粘贴代码选目标,秒出优化方案

AI代码优化神器coze-loop体验:粘贴代码选目标,秒出优化方案 1. 为什么需要AI代码优化工具 在日常开发中,我们经常面临这样的困境:一段能运行的代码,可能隐藏着性能瓶颈、可读性差或潜在bug。传统优化方式依赖个人经验…...

如何用ncmdump一键解密网易云音乐NCM文件?3步实现音乐自由

如何用ncmdump一键解密网易云音乐NCM文件?3步实现音乐自由 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 您是否遇到过这样的困扰:在网易云音乐下载的歌曲只能在特定客户端播放,想在手机、车载音…...

如何用Bliss Shader为你的Minecraft世界注入灵魂光影

如何用Bliss Shader为你的Minecraft世界注入灵魂光影 【免费下载链接】Bliss-Shader A minecraft shader which is an edit of chocapic v9 项目地址: https://gitcode.com/gh_mirrors/bl/Bliss-Shader 你是否曾经站在Minecraft的山顶,看着夕阳缓缓沉入地平线…...

AI编程实战:从零到一搭建全栈项目朴

1. 核心概念 在 Antigravity 中,技能系统分为两层: Skills (全局库):实际的代码、脚本和指南,存储在系统级目录(如 ~/.gemini/antigravity/skills)。它们是“能力”的本体。 Workflows (项目级)&#xff1a…...

LobeChat作品集:基于开源框架搭建的智能对话应用案例展示

LobeChat作品集:基于开源框架搭建的智能对话应用案例展示 1. 开篇:认识LobeChat的魅力 LobeChat作为一款开源的高性能聊天机器人框架,正在改变人们与AI对话的方式。它不仅仅是一个简单的聊天界面,而是一个功能丰富的智能对话平台…...

chandra GPU利用率提升:多卡并行部署避坑指南

chandra GPU利用率提升:多卡并行部署避坑指南 重要提示:本文基于 chandra OCR 模型的多卡部署实践,重点解决实际部署中的 GPU 利用率问题,提供可落地的解决方案。 1. 引言:为什么需要多卡部署? 如果你尝试…...

猫抓浏览器插件:网页资源嗅探与下载的完整指南

猫抓浏览器插件:网页资源嗅探与下载的完整指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否经常遇到这样的情况:看…...

从零到一:用evo工具深度解析ORB-SLAM3轨迹评估全流程(含避坑指南)

1. 环境准备与evo工具安装 第一次接触evo工具时,我像大多数SLAM开发者一样,以为装个Python包就能直接使用。结果在实际操作中遇到了各种依赖问题,比如matplotlib版本冲突、tkinter缺失等。这里分享一个经过验证的安装方案,帮你避开…...

Windows服务器渗透日记:我是如何用MS17-010漏洞连穿三层内网的

Windows服务器渗透实战:从外网突破到内网横向移动的技术解析 那天下午,阳光透过百叶窗在键盘上投下斑驳的光影。我盯着屏幕上跳动的命令行界面,手指在键盘上快速敲击——这不是什么电影场景,而是一次真实的渗透测试任务。作为安全…...

IPTVnator:一站式开源跨平台IPTV播放器解决方案

IPTVnator:一站式开源跨平台IPTV播放器解决方案 【免费下载链接】iptvnator :tv: Cross-platform IPTV player application with multiple features, such as support of m3u and m3u8 playlists, favorites, TV guide, TV archive/catchup and more. 项目地址: h…...

终极GTA5模组菜单YimMenu:5分钟快速安装与完整功能指南

终极GTA5模组菜单YimMenu:5分钟快速安装与完整功能指南 【免费下载链接】YimMenu YimMenu, a GTA V menu protecting against a wide ranges of the public crashes and improving the overall experience. 项目地址: https://gitcode.com/GitHub_Trending/yi/Yim…...

如何用FSVLM模型提升农田遥感分割精度?5个实战技巧分享

如何用FSVLM模型提升农田遥感分割精度?5个实战技巧分享 在精准农业和智慧农场管理领域,高精度的农田遥感分割技术正成为关键基础设施。传统基于纯视觉的遥感图像处理方法往往受限于复杂地貌、季节变化和作物多样性,而新兴的多模态视觉语言模型…...

DeepSeek 崩了 13 小时,不是故障,是 V4 在换引擎

正文 3月29号晚上十点半,我正让 DeepSeek 帮我改一段代码,对话框突然弹出"服务器繁忙"。以为是高峰期卡了,等几分钟就好——结果一等就是一整夜。 第二天早上七点才恢复。整整13个小时,网页端、App、API 全线变灰。微博…...

Vue3后台管理系统开发终极指南:vue-admin-box 全面解析

Vue3后台管理系统开发终极指南:vue-admin-box 全面解析 【免费下载链接】vue-admin-box vue3,vite,element-plus中后台管理系统,集成四套基础模板,大量可利用组件,模板页面 项目地址: https://gitcode.com/gh_mirrors/vu/vue-ad…...

创新视角:OpCore Simplify如何重新定义Hackintosh系统定制

创新视角:OpCore Simplify如何重新定义Hackintosh系统定制 【免费下载链接】OpCore-Simplify A tool designed to simplify the creation of OpenCore EFI 项目地址: https://gitcode.com/GitHub_Trending/op/OpCore-Simplify 在开源系统定制领域&#xff0c…...

2026届毕业生推荐的十大降重复率工具推荐

Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 能有效把文本被认作是AIGC也就是人工智能生成内容的概率给降下来的做法,是要从语…...

建立班级相册?超简单,保姆级教你在PPT里建立班级“小红书”,3步打造有温度的班级小世界!

边听边看收获更多! 班级相册超简单,保姆级教你在PPT里建立班级“小红书”社区!你有搞班级相册吗? 是不是早已 “名存实亡”? 每次班级活动拍了几十张照片,最后都散落在微信群、QQ 群的聊天记录里 —— 想找…...

ALOS DSM: Global 全球数字地表模型 (DSM) 数据集30m v4.1

目录 简介 数据集说明 空间信息 变量 代码 代码链接 结果 引用 许可 简介 ALOS World 3D - 30m (AW3D30) 是一种全球数字地表模型 (DSM) 数据集,水平分辨率约为 30 米(1 角秒网格)。该数据集基于 World 3D Topographic Data 的 DSM…...

告别JPEG文件读取烦恼:从Premature end of JPEG file到cv2.imread的实战修复指南

1. 当JPEG文件突然"罢工":Premature end of JPEG file问题解析 最近在整理一个包含10万张图片的数据集时,我遇到了一个让人抓狂的问题——大约有5%的图片在使用cv2.imread读取时会弹出"Premature end of JPEG file"的警告。虽然程序…...

[精品]基于微信小程序的校园二手书籍交易平台的设计与实现 UniApp

收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我 这里写目录标题 项目介绍项目实现效果图所需技术栈文件解析微信开发者工具HBuilderXuniappmysql数据库与主流编程语言登录的业务流程的顺序是:毕设制作流程系统性能核心代码系统测试详细…...

AI赋能传统行业:Lingbot深度估计在工业质检中的落地案例

AI赋能传统行业:Lingbot深度估计在工业质检中的落地案例 在传统的工业质检线上,质检员们常常需要面对一个棘手的难题:如何准确判断一个零件表面是否存在肉眼难以察觉的凹陷或凸起?传统的2D视觉检测系统,拍出来的照片再…...

写段代码教会你什么是HOOK技术?HOOK技术能干什么?荡

为 HagiCode 添加 GitHub Pages 自动部署支持 本项目早期代号为 PCode,现已正式更名为 HagiCode。本文记录了如何为项目引入自动化静态站点部署能力,让内容发布像喝水一样简单。 背景/引言 在 HagiCode 的开发过程中,我们遇到了一个很现实的问…...

Baiduwp-PHP:3分钟搭建百度网盘高速下载解析服务

Baiduwp-PHP:3分钟搭建百度网盘高速下载解析服务 【免费下载链接】baiduwp-php A tool to get the download link of the Baidu netdisk / 一个获取百度网盘分享链接下载地址的工具 项目地址: https://gitcode.com/gh_mirrors/ba/baiduwp-php 还在为百度网盘…...

越用越强不是广告语:拆解 Hermes Agent 的三层学习机制

用 AI agent 有一段时间了,有个问题一直没解决:每次开新会话,它对我的项目和习惯还是一无所知。上下文配置文件里写了不少,但写进去的是静态的——它不会自己学,也不会根据我真实的操作习惯去调整。跑得熟不熟&#xf…...

CANKing隐藏功能大揭秘:用Traffic Generator做压力测试的5个实战技巧

CANKing隐藏功能大揭秘:用Traffic Generator做压力测试的5个实战技巧 在汽车电子控制系统开发中,CAN总线压力测试是验证ECU稳定性和可靠性的关键环节。许多工程师虽然熟悉CANKing的基础功能,却忽略了其内置的Traffic Generator工具在复杂场景…...

3分钟搞定!WinCDEmu免费虚拟光驱终极指南:告别实体光盘的时代

3分钟搞定!WinCDEmu免费虚拟光驱终极指南:告别实体光盘的时代 【免费下载链接】WinCDEmu 项目地址: https://gitcode.com/gh_mirrors/wi/WinCDEmu 还在为找不到光驱而烦恼吗?还在为ISO文件打不开而困扰吗?今天我要向你介绍…...

SolidWorks2020多版本共存攻略:如何在同一台电脑上安装多个版本

SolidWorks多版本共存实战指南:从安装到优化的完整方案 对于机械设计师、工程师和学生而言,有时需要在同一台计算机上运行多个版本的SolidWorks。可能是为了兼容不同客户的项目文件,或是测试新版本功能的同时保留稳定版本。本文将深入探讨如何…...