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

LLM 应用开发:RAG 与知识增强

LLM 应用开发RAG 与知识增强1. 技术分析1.1 RAG 概述RAG (Retrieval-Augmented Generation) 将检索与生成结合RAG 架构 知识库检索 → 生成回答 流程: 1. 问题向量化 2. 检索相关文档 3. 构建提示词 4. LLM 生成回答1.2 RAG 组件组件功能常用工具知识库存储文档FAISS、Pinecone向量化文本转向量Sentence-BERT、OpenAI Embedding检索查询匹配BM25、向量检索生成回答生成GPT-4、Llama-21.3 RAG 类型RAG 类型 Basic RAG: 简单检索生成 Advanced RAG: 多步检索、重排序 Hybrid RAG: 关键词向量混合检索2. 核心功能实现2.1 知识库构建import torch import faiss from sentence_transformers import SentenceTransformer class VectorStore: def __init__(self, model_nameall-MiniLM-L6-v2): self.model SentenceTransformer(model_name) self.index None self.documents [] def add_documents(self, documents): self.documents.extend(documents) embeddings self.model.encode(documents, convert_to_tensorTrue) if self.index is None: dimension embeddings.shape[1] self.index faiss.IndexFlatL2(dimension) self.index.add(embeddings.cpu().numpy()) def search(self, query, k5): query_embedding self.model.encode([query], convert_to_tensorTrue) distances, indices self.index.search(query_embedding.cpu().numpy(), k) results [] for i, idx in enumerate(indices[0]): results.append({ document: self.documents[idx], distance: distances[0][i] }) return results class HybridSearch: def __init__(self): self.vector_store VectorStore() self.bm25_index None def build_bm25(self, documents): from rank_bm25 import BM25Okapi tokenized_docs [doc.split() for doc in documents] self.bm25_index BM25Okapi(tokenized_docs) def search(self, query, k5): vector_results self.vector_store.search(query, k) vector_indices set([self.vector_store.documents.index(r[document]) for r in vector_results]) bm25_scores self.bm25_index.get_scores(query.split()) bm25_results sorted(enumerate(bm25_scores), keylambda x: x[1], reverseTrue)[:k] bm25_indices set([idx for idx, _ in bm25_results]) combined_indices vector_indices.union(bm25_indices) results [] for idx in combined_indices: results.append({ document: self.vector_store.documents[idx], source: both if idx in vector_indices and idx in bm25_indices else vector if idx in vector_indices else bm25 }) return results[:k]2.2 RAG 流水线class RAGPipeline: def __init__(self, llm, vector_store): self.llm llm self.vector_store vector_store def generate_prompt(self, query, documents): context \n\n.join([f文档{i1}: {doc[document]} for i, doc in enumerate(documents)]) prompt f基于以下文档回答问题 {context} 问题{query} 请根据文档内容给出详细的回答。如果文档中没有相关信息请说明。 return prompt def answer(self, query): documents self.vector_store.search(query) prompt self.generate_prompt(query, documents) answer self.llm.generate(prompt) return answer, documents class AdvancedRAG: def __init__(self, llm, vector_store): self.llm llm self.vector_store vector_store def refine_query(self, query): refinement_prompt f将以下问题优化为更适合检索的形式 原始问题{query} 优化后的问题 refined self.llm.generate(refinement_prompt) return refined.strip() def rerank(self, query, documents): rerank_prompt f根据与问题的相关性对以下文档进行排序 问题{query} 文档列表 {chr(10).join([f{i1}. {doc[document][:100]}... for i, doc in enumerate(documents)])} 请返回排序后的文档编号用逗号分隔 ranking self.llm.generate(rerank_prompt) indices [int(i.strip()) - 1 for i in ranking.split(,)] return [documents[i] for i in indices if 0 i len(documents)] def answer(self, query): refined_query self.refine_query(query) documents self.vector_store.search(refined_query) reranked_docs self.rerank(query, documents) prompt self._generate_prompt(query, reranked_docs) answer self.llm.generate(prompt) return answer, reranked_docs2.3 文档处理class DocumentProcessor: def __init__(self): pass def load_pdf(self, path): from PyPDF2 import PdfReader reader PdfReader(path) text for page in reader.pages: text page.extract_text() \n return text def split_text(self, text, chunk_size512, overlap100): chunks [] start 0 while start len(text): end min(start chunk_size, len(text)) chunks.append(text[start:end]) if end len(text): break start end - overlap return chunks def process_document(self, path): text self.load_pdf(path) chunks self.split_text(text) return chunks class KnowledgeBaseManager: def __init__(self): self.vector_store VectorStore() self.processor DocumentProcessor() def add_document(self, path): chunks self.processor.process_document(path) self.vector_store.add_documents(chunks) def add_directory(self, directory): import os for filename in os.listdir(directory): if filename.endswith(.pdf): path os.path.join(directory, filename) self.add_document(path)3. 性能对比3.1 检索方法对比方法速度准确性适用场景BM25快中关键词匹配Vector中高语义匹配Hybrid中很高综合场景3.2 向量化模型对比模型维度速度准确性all-MiniLM-L6-v2384快中all-mpnet-base-v2768中高text-embedding-ada-0021536中很高3.3 RAG 效果对比场景纯LLMBasic RAGAdvanced RAG事实问答70%85%90%技术文档60%80%88%多文档推理50%75%85%4. 最佳实践4.1 RAG 配置选择def select_rag_config(use_case): configs { fact_qa: { embedding_model: all-mpnet-base-v2, chunk_size: 512, overlap: 100, top_k: 3 }, tech_docs: { embedding_model: text-embedding-ada-002, chunk_size: 1024, overlap: 200, top_k: 5 }, general: { embedding_model: all-MiniLM-L6-v2, chunk_size: 512, overlap: 50, top_k: 3 } } return configs.get(use_case, configs[general]) class RAGConfigGenerator: staticmethod def from_use_case(use_case): return select_rag_config(use_case)4.2 RAG 部署class RAGDeployer: def __init__(self, config): self.config config def build(self): vector_store VectorStore(self.config[embedding_model]) llm self._load_llm() kb_manager KnowledgeBaseManager() kb_manager.vector_store vector_store kb_manager.add_directory(self.config[documents_dir]) pipeline RAGPipeline(llm, vector_store) return pipeline def _load_llm(self): from transformers import AutoModelForCausalLM, AutoTokenizer model AutoModelForCausalLM.from_pretrained(self.config[llm_model]) tokenizer AutoTokenizer.from_pretrained(self.config[llm_model]) return LLMInference(model, tokenizer)5. 总结RAG 是 LLM 应用开发的重要范式知识库构建文档向量化存储检索找到相关信息生成基于检索结果回答优化查询优化、重排序对比数据如下Advanced RAG 比 Basic RAG 提升 5-10% 准确率Hybrid 检索结合了关键词和语义的优势推荐使用 512-1024 token 的 chunk 大小向量数据库选择影响检索速度和成本

相关文章:

LLM 应用开发:RAG 与知识增强

LLM 应用开发:RAG 与知识增强 1. 技术分析 1.1 RAG 概述 RAG (Retrieval-Augmented Generation) 将检索与生成结合: RAG 架构知识库检索 → 生成回答流程:1. 问题向量化2. 检索相关文档3. 构建提示词4. LLM 生成回答1.2 RAG 组件 组件功能常用工具知识库…...

LLM 推理优化:加速与量化

LLM 推理优化:加速与量化 1. 技术分析 1.1 LLM 推理挑战 LLM 推理面临的主要挑战: 推理挑战计算量大: O(nd)内存占用高: 参数 KV Cache延迟要求: 实时应用需求1.2 推理优化方法 方法原理加速比精度损失量化降低精度2-4x小蒸馏知识迁移1.5-2x小剪枝移除冗…...

2026校招技术岗薪资大盘点:AI方向白菜价40w起,这个方向却跌破20w

上周帮学弟看offer,吓了一跳。某大厂给AI对齐岗的校招白菜价,总包42w。同一个公司,传统测试开发岗,开出了18w。差了不止一倍。这不是个例。我翻了牛客网五月最新的offer帖,又问了几个在阿里、字节、美团的朋友&#xf…...

从Token泛滥到 Token 极度节俭:2026程序员必须掌握的推理成本优化指南

最近三个月,我身边越来越多的技术团队开始感受到一种压力。不是模型不够强,是账单涨得太快。我们组上个月刚把几个核心业务切到某新模型,效果确实好,但推理成本翻了4倍。老板问了一句:这钱能不能省一半?会议…...

从树莓派Pico到Linux开发板:手把手教你移植MPU6050 I2C驱动(附完整源码)

从树莓派Pico到Linux开发板:MPU6050 I2C驱动移植实战指南 当你在树莓派Pico上轻松驱动了MPU6050传感器后,想要将这个功能迁移到Linux开发板上时,可能会发现两者之间的差异远比想象中大。本文将带你深入理解Linux内核驱动框架,并手…...

Tauri+Next.js桌面应用开发:从零构建轻量级跨平台工具

1. 项目概述:一个现代桌面应用开发的“瑞士军刀” 如果你正在寻找一个能让你用熟悉的Web技术栈(Next.js React)快速构建高性能、跨平台桌面应用的开箱即用模板,那么 kvnxiao/tauri-nextjs-template 绝对值得你花时间深入研究。…...

Modern C++ Template 包管理器集成:Conan与Vcpkg最佳实践

Modern C Template 包管理器集成:Conan与Vcpkg最佳实践 【免费下载链接】modern-cpp-template A template for modern C projects using CMake, Clang-Format, CI, unit testing and more, with support for downstream inclusion. 项目地址: https://gitcode.com…...

kkFileView容器网络性能优化:基于SR-IOV的硬件加速终极指南

kkFileView容器网络性能优化:基于SR-IOV的硬件加速终极指南 【免费下载链接】kkFileView Universal File Online Preview Project based on Spring-Boot 项目地址: https://gitcode.com/GitHub_Trending/kk/kkFileView 在现代云原生应用中,容器化…...

如何利用OR-Tools优化出版业:印刷调度与分销路线的完整指南

如何利用OR-Tools优化出版业:印刷调度与分销路线的完整指南 【免费下载链接】or-tools Googles Operations Research tools: 项目地址: https://gitcode.com/gh_mirrors/or/or-tools OR-Tools是Google开发的强大开源运筹学工具库,能够帮助出版企业…...

如何10分钟搞定300张照片的智能水印处理?

如何10分钟搞定300张照片的智能水印处理? 【免费下载链接】semi-utils 一个批量添加相机机型和拍摄参数的工具,后续「可能」添加其他功能。 项目地址: https://gitcode.com/gh_mirrors/se/semi-utils 作为一名摄影爱好者,你是否曾为给…...

shadcn-ui-expansions Infinite Scroll 实现原理:构建高性能无限滚动列表的完整指南

shadcn-ui-expansions Infinite Scroll 实现原理:构建高性能无限滚动列表的完整指南 【免费下载链接】shadcn-ui-expansions More components built on top of shadcn-ui. 项目地址: https://gitcode.com/gh_mirrors/sh/shadcn-ui-expansions shadcn-ui-expa…...

Bootstrap 4到Bootstrap 5最核心的变化是什么.txt

响应式开发应统一管理断点变量与媒体查询mixin、限制嵌套层级≤3层并用BEM语法扁平化、禁用跨文件extend改用include、分离布局与视觉响应逻辑,核心在于职责边界清晰化。响应式断点写死在媒体查询里,改起来像修水管直接把 768px、1024px 这类数值散落在各…...

大麦网自动化购票系统:Python脚本实现高效票务获取完整指南

大麦网自动化购票系统:Python脚本实现高效票务获取完整指南 【免费下载链接】Automatic_ticket_purchase 大麦网抢票脚本 项目地址: https://gitcode.com/GitHub_Trending/au/Automatic_ticket_purchase 在当今热门演出票务市场,手动抢票的成功率…...

Windows热键冲突检测:快速定位被占用快捷键的终极指南

Windows热键冲突检测:快速定位被占用快捷键的终极指南 【免费下载链接】hotkey-detective A small program for investigating stolen key combinations under Windows 7 and later. 项目地址: https://gitcode.com/gh_mirrors/ho/hotkey-detective 你是否曾…...

3步掌握:微信数据本地解密与恢复完整方案

3步掌握:微信数据本地解密与恢复完整方案 【免费下载链接】WechatDecrypt 微信消息解密工具 项目地址: https://gitcode.com/gh_mirrors/we/WechatDecrypt 你是否曾因更换手机而丢失珍贵的微信聊天记录?或者不小心删除了重要的商务对话&#xff1…...

代码开挂:IT人的超能力技能树

好的,这是一份关于“写代码像开挂:IT人的超能力技能树”的技术文章大纲:标题: 写代码如开挂:解锁IT人的超能力技能树导语: 想象一下,写代码不再是枯燥的敲键盘,而是像在游戏中开启“…...

变附着系数AGV横摆稳定性控制【附程序】

✨ 长期致力于无人搬运车、横摆稳定性、变附着系数、路面附着系数估计、直接横摆力矩控制研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)自适应无迹卡…...

trade ai编辑器使用规范

Spring Cloud 代码生成规范 v1.0 角色定义 您是一位经验丰富的Spring Cloud架构师,专注于: 严格遵循Java 17 Spring Boot 3.2.4 Spring Cloud Alibaba技术栈实现高内聚低耦合的微服务架构确保生成的代码与项目现有规范100%兼容 核心架构原则依赖注入: …...

保姆级教程:在VMware Workstation 16 Pro上为ArchLinux配置完整的拖放和剪贴板共享

在VMware Workstation Pro上为ArchLinux配置无缝交互功能全指南 对于追求极致效率的开发者而言,虚拟机与宿主机之间的隔阂常常成为工作流中的瓶颈。想象一下,当你在宿主机上浏览到一个关键的技术文档,却无法直接将链接分享到虚拟机中的开发环…...

终极指南:如何将SVProgressHUD与Xcode Cloud完美集成

终极指南:如何将SVProgressHUD与Xcode Cloud完美集成 【免费下载链接】SVProgressHUD A clean and lightweight progress HUD for your iOS and tvOS app. 项目地址: https://gitcode.com/gh_mirrors/sv/SVProgressHUD SVProgressHUD是一个轻量级、简洁美观的…...

SARScape处理Sentinel-1数据实战:手把手教你如何检查和编辑SBAS连接图(Connection Graph)

SARScape处理Sentinel-1数据的SBAS连接图深度解析与实战优化 当处理Sentinel-1数据的SBAS-InSAR分析时,连接图(Connection Graph)的质量直接影响最终形变监测结果的可靠性。许多用户在完成数据预处理后,面对复杂的点线图和报告文件…...

为 Hermes Agent 配置 Taotoken 自定义提供商接入指南

🚀 告别海外账号与网络限制!稳定直连全球优质大模型,限时半价接入中。 👉 点击领取海量免费额度 为 Hermes Agent 配置 Taotoken 自定义提供商接入指南 Hermes Agent 是一个功能强大的 AI 智能体开发框架,支持通过自定…...

Python包管理‘备胎’方案:除了pip install,你的whl本地仓库建好了吗?

Python包管理‘备胎’方案:构建企业级whl本地仓库的完整实践 当团队开发遇到内网隔离、依赖版本锁死或跨国镜像访问延迟时,临时四处搜寻whl文件就像在代码仓库里玩扫雷——每次pip install都可能是场冒险。真正的工程化解决方案,是把散落在百…...

告别U盘!用CentOS 7.9 + iPXE + dnsmasq搭建一个能装CentOS/AlmaLinux/Ubuntu的万能网络启动盘

告别U盘!用CentOS 7.9 iPXE dnsmasq搭建万能网络启动环境 每次机房新设备到货或系统升级时,运维人员最头疼的就是反复制作不同系统的启动U盘。传统方式不仅效率低下,还常遇到U盘兼容性问题。本文将分享如何利用一台闲置的CentOS 7.9服务器&…...

别再手动画线了!用AutoCAD VBA脚本自动生成船体型线图(附完整代码)

别再手动画线了!用AutoCAD VBA脚本自动生成船体型线图(附完整代码) 船舶设计工程师们,是否厌倦了在AutoCAD中反复绘制相同的型线图?那些看似简单的横剖线、纵剖线和肋骨型线,往往消耗大量时间在机械性操作上…...

3分钟告别网盘限速:免费开源油猴脚本使用指南

3分钟告别网盘限速:免费开源油猴脚本使用指南 【免费下载链接】baiduyun 油猴脚本 - 一个免费开源的网盘下载助手 项目地址: https://gitcode.com/gh_mirrors/ba/baiduyun 还在为网盘下载速度慢如蜗牛而烦恼吗?想要摆脱客户端的束缚,直…...

全民可玩的超元力迷你沙盘赛车,解锁轻量化竞速游乐新风口

如今的休闲娱乐市场,大众早已不满足于单调的电玩游戏、普通亲子游乐,更偏爱有参与感、有操控感、有竞技氛围的实体互动项目。超元力迷你沙盘赛车凭借真实驾驶体验、轻量化落地条件、多人互动竞技属性,迅速出圈成为文旅游乐、商业综合体、亲子…...

从点亮LED到驱动电机:用ESP32和SimpleFOC库开启你的第一个硬件项目

从点亮LED到驱动电机:用ESP32和SimpleFOC库开启你的第一个硬件项目 当你第一次拿到ESP32开发板时,或许会被它小巧的尺寸和丰富的接口所迷惑——这块比拇指大不了多少的电路板,真的能像宣传的那样轻松控制电机吗?作为过来人&#…...

从串行到以太网:SEMI E37 HSMS协议如何重塑半导体设备通信

1. 半导体设备通信的进化史:从串口到以太网 十年前我第一次接触半导体设备通信时,车间里密密麻麻的串口线让我印象深刻。每条产线上十几台设备,每台设备背后都拖着几根九针串口线,像蜘蛛网一样缠绕在一起。当时最头疼的就是排查通…...

Bayard查询DSL完全手册:9种查询类型详解与实战案例

Bayard查询DSL完全手册:9种查询类型详解与实战案例 【免费下载链接】bayard A full-text search and indexing server written in Rust. 项目地址: https://gitcode.com/gh_mirrors/ba/bayard Bayard是一个使用Rust编写的高性能全文搜索和索引服务器&#xf…...