AI秒懂你的私有文档?RAG技术让你的AI助手变身企业知识库专家!
本文介绍了如何利用RAG技术让AI助手读取并理解私有文档解决AI无法处理私有知识的问题。通过将文档向量化并存储在向量数据库中AI可以像查阅参考书一样在回答问题时检索相关文档内容。文章详细讲解了RAG的技术原理、应用场景、技术栈选择并以LangChainChromaBGEDeepSeek的组合为例手把手演示了搭建RAG问答助手的完整过程最后还分享了避坑指南和进阶方向。先说结论你有没有遇到过这样的情况公司有一堆技术文档想问AI相关问题但AI不知道这些内容项目有大量业务文档想让AI帮忙分析但AI不了解你的业务自己积累了很多学习笔记想让AI帮你整理但AI没读过这些RAG可以解决这个问题。RAGRetrieval-Augmented Generation检索增强生成就是让AI先查阅你的文档再回答问题。普通AI只能回答训练时学过的内容 RAG AI可以回答你的私有文档里的内容什么是RAG通俗解释把RAG想象成一个带参考书考试的AI普通AI考试 - 题目请回答问题 - AI凭记忆回答可能答不上来 RAG AI考试 - 题目请回答问题 - AI先查阅相关资料 → 找到答案 → 回答问题技术原理核心概念概念通俗解释向量化把文字转成数字让计算机能理解相似向量数据库专门存向量的数据库能快速找到相似内容Embedding模型负责把文字转成向量的模型切分把长文档切成小块方便检索为什么需要RAG场景1企业知识库公司有大量内部文档技术规范文档业务流程说明历史项目文档FAQ知识库问题新人想查某个技术规范不知道在哪份文档里。RAG方案把所有文档导入直接问AIXX技术规范是什么。场景2代码库分析项目有大量代码和文档需求文档设计文档API文档代码注释问题想了解某个功能的实现不知道从哪看起。RAG方案把代码和文档导入问AIXX功能是怎么实现的。场景3个人学习助手自己积累了很多学习资料技术文章收藏学习笔记电子书问题想回顾某个知识点找不到在哪。RAG方案把资料导入问AIXX知识点我笔记里是怎么写的。RAG技术栈主流方案组件方案说明向量数据库Chroma、Milvus、PineconeChroma最简单适合入门Embedding模型BGE、M3E、OpenAIBGE是国产开源中文效果好RAG框架LangChain、LlamaIndexLangChain生态最全LLMDeepSeek、Claude、GPTDeepSeek便宜好用我的入门选择作为入门我选择最简单的组合LangChain Chroma BGE DeepSeek理由LangChain文档全示例多Chroma本地运行零配置BGE国产开源中文效果好DeepSeek便宜API调用简单第一步环境准备安装依赖pip install langchain langchain-community chromadb sentence-transformers依赖说明包名用途langchainRAG框架langchain-communityLangChain社区集成chromadb向量数据库sentence-transformersEmbedding模型Python版本需要 Python 3.9 及以上版本。第二步准备文档创建示例文档# 创建示例文档目录 import os os.makedirs(docs, exist_okTrue) # 创建几个示例文档 docs { tech_spec.md: # 用户登录技术规范 ## 接口设计 ### 请求方式 POST /api/v1/auth/login ### 请求参数 - username: 用户名必填 - password: 密码必填 - captcha: 验证码可选 ### 返回格式 { code: 0, message: success, data: { token: xxx, expireTime: 3600 } } ## 安全要求 1. 密码必须使用BCrypt加密存储 2. 登录失败5次后锁定账号30分钟 3. Token有效期不超过24小时 , business_rule.md: # 转账业务规则 ## 基本规则 1. 单笔转账限额50,000元 2. 单日累计限额200,000元 3. 转账时间00:00 - 23:59 ## 手续费规则 | 金额范围 | 手续费 | |----------|--------| | 0 - 1000 | 免费 | | 1000 - 10000 | 2元 | | 10000以上 | 5元 | ## 风控规则 1. 大额转账10万需要短信验证 2. 新设备首次转账需要人脸识别 3. 异常时间段00:00-06:00转账需要额外验证 , faq.md: # 常见问题FAQ ## Q1: 忘记密码怎么办 A: 点击登录页面的忘记密码通过手机验证码重置密码。 ## Q2: 为什么转账失败 A: 可能原因 1. 余额不足 2. 超过转账限额 3. 收款账户异常 4. 网络问题 ## Q3: 如何修改手机号 A: 进入我的 → 设置 → 账户安全 → 修改手机号需验证原手机号和新手机号。 ## Q4: Token过期怎么办 A: Token过期后需要重新登录。建议在Token过期前调用刷新接口。 } for filename, content in docs.items(): with open(fdocs/{filename}, w, encodingutf-8) as f: f.write(content) print(✅ 示例文档创建完成)第三步构建向量数据库加载文档from langchain_community.document_loaders import DirectoryLoader, TextLoader # 加载文档目录 loader DirectoryLoader( ./docs, glob**/*.md, loader_clsTextLoader, loader_kwargs{encoding: utf-8} ) documents loader.load() print(f✅ 加载了 {len(documents)} 个文档)切分文档from langchain.text_splitter import RecursiveCharacterTextSplitter # 创建切分器 text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 每块最大500字符 chunk_overlap100, # 块之间重叠100字符 separators[\n\n, \n, 。, , , , , , ] ) # 切分文档 chunks text_splitter.split_documents(documents) print(f✅ 切分成 {len(chunks)} 个文本块)创建向量数据库from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma # 创建Embedding模型使用BGE中文模型 embeddings HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh-v1.5, model_kwargs{device: cpu}, encode_kwargs{normalize_embeddings: True} ) # 创建向量数据库 vectorstore Chroma.from_documents( documentschunks, embeddingembeddings, persist_directory./chroma_db ) # 持久化存储 vectorstore.persist() print(✅ 向量数据库创建完成)第四步问答测试简单问答# 创建检索器 retriever vectorstore.as_retriever( search_kwargs{k: 3} # 返回最相关的3个文本块 ) # 检索测试 query 转账手续费是多少 docs retriever.invoke(query) print(f问题{query}\n) print(相关文档) for i, doc in enumerate(docs, 1): print(f\n--- 文档块 {i} ---) print(doc.page_content[:200] ...)结合AI回答from openai import OpenAI import os # 初始化DeepSeek客户端 client OpenAI( api_keyos.getenv(DEEPSEEK_API_KEY), base_urlhttps://api.deepseek.com ) def rag_chat(query: str) - str: RAG问答 # 1. 检索相关文档 docs retriever.invoke(query) context \n\n.join([doc.page_content for doc in docs]) # 2. 构建Prompt prompt f请根据以下参考资料回答问题。如果资料中没有相关信息请说根据现有资料无法回答。 参考资料 {context} 问题{query} 请回答 # 3. 调用AI response client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}] ) return response.choices[0].message.content # 测试 questions [ 用户登录的接口是什么, 转账超过10万需要什么验证, 忘记密码怎么办, Token有效期是多长 ] for q in questions: print(f\n问{q}) print(f答{rag_chat(q)})运行效果问用户登录的接口是什么 答根据技术规范用户登录接口是 - 请求方式POST /api/v1/auth/login - 请求参数username用户名、password密码、captcha验证码可选 问转账超过10万需要什么验证 答根据转账业务规则大额转账10万需要短信验证。 问忘记密码怎么办 答根据FAQ可以通过以下方式重置密码 点击登录页面的忘记密码通过手机验证码重置密码。 问Token有效期是多长 答根据技术规范Token有效期不超过24小时。第五步封装成工具把上面的代码封装成一个完整的RAG工具# rag_assistant.py import os from typing import List, Optional from openai import OpenAI from langchain_community.document_loaders import DirectoryLoader, TextLoader from langchain.text_splitter import RecursiveCharacterTextSplitter from langchain_community.embeddings import HuggingFaceEmbeddings from langchain_community.vectorstores import Chroma class RAGAssistant: RAG问答助手 def __init__( self, docs_dir: str ./docs, db_dir: str ./chroma_db, api_key: Optional[str] None ): self.docs_dir docs_dir self.db_dir db_dir self.api_key api_key or os.getenv(DEEPSEEK_API_KEY) # 初始化组件 self.embeddings HuggingFaceEmbeddings( model_nameBAAI/bge-small-zh-v1.5, model_kwargs{device: cpu}, encode_kwargs{normalize_embeddings: True} ) self.client OpenAI( api_keyself.api_key, base_urlhttps://api.deepseek.com ) self.vectorstore None self.retriever None def build_index(self): 构建向量索引 print(正在加载文档...) loader DirectoryLoader( self.docs_dir, glob**/*.md, loader_clsTextLoader, loader_kwargs{encoding: utf-8} ) documents loader.load() print(f 加载了 {len(documents)} 个文档) print(正在切分文档...) text_splitter RecursiveCharacterTextSplitter( chunk_size500, chunk_overlap100, separators[\n\n, \n, 。, , , , , , ] ) chunks text_splitter.split_documents(documents) print(f 切分成 {len(chunks)} 个文本块) print(正在构建向量数据库...) self.vectorstore Chroma.from_documents( documentschunks, embeddingself.embeddings, persist_directoryself.db_dir ) self.vectorstore.persist() self.retriever self.vectorstore.as_retriever( search_kwargs{k: 3} ) print(✅ 索引构建完成) def load_index(self): 加载已有索引 self.vectorstore Chroma( persist_directoryself.db_dir, embedding_functionself.embeddings ) self.retriever self.vectorstore.as_retriever( search_kwargs{k: 3} ) print(✅ 索引加载完成) def chat(self, query: str, show_context: bool False) - str: 问答 if not self.retriever: raise ValueError(请先调用 build_index() 或 load_index()) # 检索 docs self.retriever.invoke(query) context \n\n.join([doc.page_content for doc in docs]) if show_context: print(f\n--- 检索到的相关内容 ---) for i, doc in enumerate(docs, 1): print(f\n[文档块 {i}]) print(doc.page_content[:200] ...) # 构建Prompt prompt f请根据以下参考资料回答问题。如果资料中没有相关信息请说根据现有资料无法回答。 参考资料 {context} 问题{query} 请回答 # 调用AI response self.client.chat.completions.create( modeldeepseek-chat, messages[{role: user, content: prompt}] ) return response.choices[0].message.content # 使用示例 if __name__ __main__: # 创建助手 assistant RAGAssistant() # 首次使用构建索引 # assistant.build_index() # 后续使用加载已有索引 assistant.load_index() # 问答 while True: query input(\n请输入问题输入 quit 退出: ) if query.lower() quit: break answer assistant.chat(query, show_contextTrue) print(f\n回答{answer})踩过的坑坑1Embedding模型下载慢问题第一次使用BGE模型需要从HuggingFace下载国内可能很慢。解决使用镜像站点import os os.environ[HF_ENDPOINT] https://hf-mirror.com或者提前下载模型到本地指定本地路径。坑2文档编码问题问题加载文档时报编码错误。解决明确指定编码loader TextLoader(file_path, encodingutf-8)坑3切分粒度不合适问题切分太小语义不完整切分太大检索不精准。解决根据文档特点调整参数text_splitter RecursiveCharacterTextSplitter( chunk_size500, # 调整这个值 chunk_overlap100, # 调整这个值 )建议技术文档chunk_size500-1000长篇文章chunk_size1000-2000对话记录chunk_size300-500坑4检索不到相关内容问题明明文档里有但检索不到。解决检查切分是否合理调整检索数量 kretriever vectorstore.as_retriever( search_kwargs{k: 5} # 增加返回数量 )尝试不同的检索方式# 相似度检索 docs vectorstore.similarity_search(query, k3) # MMR检索最大边际相关性增加多样性 docs vectorstore.max_marginal_relevance_search(query, k3)进阶方向RAG还有很多可以深入的方向方向说明难度文档解析支持PDF、Word、Excel等格式⭐⭐多轮对话记住上下文连续问答⭐⭐混合检索向量检索 关键词检索⭐⭐⭐重排序对检索结果重新排序⭐⭐⭐Agent让AI自主决定何时检索⭐⭐⭐⭐01什么是AI大模型应用开发工程师如果说AI大模型是蕴藏着巨大能量的“后台超级能力”那么AI大模型应用开发工程师就是将这种能量转化为实用工具的执行者。AI大模型应用开发工程师是基于AI大模型设计开发落地业务的应用工程师。这个职业的核心价值在于打破技术与用户之间的壁垒把普通人难以理解的算法逻辑、模型参数转化为人人都能轻松操作的产品形态。无论是日常写作时用到的AI文案生成器、修图软件里的智能美化功能还是办公场景中的自动记账工具、会议记录用的语音转文字APP这些看似简单的应用背后都是应用开发工程师在默默搭建技术与需求之间的桥梁。他们不追求创造全新的大模型而是专注于让已有的大模型“听懂”业务需求“学会”解决具体问题最终形成可落地、可使用的产品。CSDN粉丝独家福利给大家整理了一份AI大模型全套学习资料这份完整版的 AI 大模型学习资料已经上传CSDN朋友们如果需要可以扫描下方二维码点击下方CSDN官方认证链接免费领取【保证100%免费】02AI大模型应用开发工程师的核心职责需求分析与拆解是工作的起点也是确保开发不偏离方向的关键。应用开发工程师需要直接对接业务方深入理解其核心诉求——不仅要明确“要做什么”更要厘清“为什么要做”以及“做到什么程度算合格”。在此基础上他们会将模糊的业务需求拆解为具体的技术任务明确每个环节的执行标准并评估技术实现的可行性同时定义清晰的核心指标为后续开发、测试提供依据。这一步就像建筑前的图纸设计若出现偏差后续所有工作都可能白费。技术选型与适配是衔接需求与开发的核心环节。工程师需要根据业务场景的特点选择合适的基础大模型、开发框架和工具——不同的业务对模型的响应速度、精度、成本要求不同选型的合理性直接影响最终产品的表现。同时他们还要对行业相关数据进行预处理通过提示词工程优化模型输出或在必要时进行轻量化微调让基础模型更好地适配具体业务。此外设计合理的上下文管理规则确保模型理解连贯需求建立敏感信息过滤机制保障数据安全也是这一环节的重要内容。应用开发与对接则是将方案转化为产品的实操阶段。工程师会利用选定的开发框架构建应用的核心功能同时联动各类外部系统——比如将AI模型与企业现有的客户管理系统、数据存储系统打通确保数据流转顺畅。在这一过程中他们还需要配合设计团队打磨前端交互界面让技术功能以简洁易懂的方式呈现给用户实现从技术方案到产品形态的转化。测试与优化是保障产品质量的关键步骤。工程师会开展全面的功能测试找出并修复开发过程中出现的漏洞同时针对模型的响应速度、稳定性等性能指标进行优化。安全合规性也是测试的重点需要确保应用符合数据保护、隐私安全等相关规定。此外他们还会收集用户反馈通过调整模型参数、优化提示词等方式持续提升产品体验让应用更贴合用户实际使用需求。部署运维与迭代则贯穿产品的整个生命周期。工程师会通过云服务器或私有服务器将应用部署上线并实时监控运行状态及时处理突发故障确保应用稳定运行。随着业务需求的变化他们还需要对应用功能进行迭代更新同时编写完善的开发文档和使用手册为后续的维护和交接提供支持。03薪资情况与职业价值市场对这一职业的高度认可直接体现在薪资待遇上。据猎聘最新在招岗位数据显示AI大模型应用开发工程师的月薪最高可达60k。在AI技术加速落地的当下这种“技术业务”的复合型能力尤为稀缺让该职业成为当下极具吸引力的就业选择。AI大模型应用开发工程师是AI技术落地的关键桥梁。他们用专业能力将抽象的技术转化为具体的产品让大模型的价值真正渗透到各行各业。随着AI场景化应用的不断深化这一职业的重要性将更加凸显也必将吸引更多人才投身其中推动AI技术更好地服务于社会发展。CSDN粉丝独家福利给大家整理了一份AI大模型全套学习资料这份完整版的 AI 大模型学习资料已经上传CSDN朋友们如果需要可以扫描下方二维码点击下方CSDN官方认证链接免费领取【保证100%免费】