AI 智能应用开发(持续更新中)

张开发
2026/5/7 19:29:40 15 分钟阅读

分享文章

AI 智能应用开发(持续更新中)
AI 智能应用开发全解析RAG简介RAG 核心思想核心价值与作用RAG 系统处理全流程分词为什么需要分词Jieba 中文分词简介分词模式精确模式全模式搜索引擎模式模式对比高级功能添加自定义词自定义词典关键词提取停用词清洗简介为什么要清洗停用词表开源词表过滤分词停用词清洗分词清洗的应用场景Embedding 向量化简介为什么需要向量化检索策略稠密检索向量检索原理优点缺点稀疏检索BM25 检索原理优点缺点混合检索为什么需要混合检索优点结果融合RRF 融合算法原理优势代码实现RERANK 重排序简介区别较向量检索代码实现RAG简介RAGRetrieval-Augmented Generation即检索生成增强是目前最主流的 LLM 落地架构之一。RAG 核心思想在生成答案前先从外部知识库检索相关信息片段将其作为“参考资料”传递给 LLM引导模型基于真实、精确的外部数据生成回答。核心价值与作用解决知识滞后与过时的问题- LLM 的训练数据通常都有时间截至点例如训练于 2024 年的大模型无法知晓 2025 年及之后的事件 - RAG 通过引入外部知识库可以实时更新信息让模型掌握最新的知识。解决事实性错误与幻觉的问题- LLM 有时会生成看似合理但与事实不符的内容这种行为即“幻觉” - RAG 通过强制模型基于检索到可信来源进行回答大大降低了产生幻觉的可能提升了答案的准确性与可信度。解决成本高昂与数据隐私的问题- 通过微调Fine-tuning更新模型知识成本高、周期长 - 若非本地部署还存在将私有数据暴露给第三方模型提供商的风险 - RAG 架构无需重新训练模型更新知识直接使用外部最新知识 - 既降低了成本又能保证数据隐私知识库私有。RAG 系统处理全流程一句话总结先把知识“向量化存好”再用“关键词检索 语义检索”一起找内容最后交给大模型生成答案。分词为什么需要分词构建语义基础准确的分词是后续所有 NLP 任务如词性标注、实体识别的基石提升检索与召回精度错误分词会导致专有名词被切断生成的向量无法准确表征原义从而显著降低搜索引擎的召回率优化大模型生成质量高质量分词有助于精准筛选和组织上下文信息减少噪声干扰使 LLM 的生成内容更聚焦于核心语义。Jieba 中文分词简介与英文不同中文词语之间没有固定的分隔符如空格因此需要依靠分词工具进行划分。 Jieba 是 Python 中最流行的中文分词工具它以简单易用、高效和灵活著称支持多种分词模式、用户自定义词典和关键词提取结合了基于前缀词典的高效扫描与隐马尔可夫模型HMM机器学习算法能够精准处理复杂的中文文本结构。分词模式Jieba 提供了三种主要的分词模式精确模式特点旨在将文本切分成最精确的词语无冗余结果优点准确率极高文本分析的首选模式缺点无法处理所有歧义问题对未登录词识别较弱适用词频统计、RAG 系统文本向量化。全模式特点全切分扫描词汇组合覆盖较全优点分词速度快对未登录词友好缺点结果冗余度太高包含过多无效分词适用快速词汇匹配、数据的探索性分析例词典编写搜索引擎模式特点精确模式输出的最优切分长词再切分优点兼顾准确性与召回率能够同时支持精确匹配和部分前缀/子词检索缺点相比精确模式输出词数增多但比全模式冗余少分词速度略慢于全模式需额外计算长词的细分仍可能产生少量噪声如过度切分常见组合适用搜索引擎索引构建、细粒度文本检索如用户输入“北京大学”既能匹配“北京大学”也能匹配“北京”或“大学”、推荐系统模式对比importjieba user_input我来到北京清华大学# 精确匹配seg_listlist(jieba.cut(user_input,cut_allFalse))print(精确模式: / .join(seg_list))# 全模式seg_listlist(jieba.cut(user_input,cut_allTrue))print(全模式: / .join(list(seg_list)))# 搜索引擎模式seg_listlist(jieba.cut_for_search(user_input))print(搜索引擎模式: / .join(list(seg_list)))精确模式我/ 来到/ 北京/ 清华大学全模式我/ 来到/ 北京/ 清华/ 清华大学/ 华大/ 大学搜索引擎模式我/ 来到/ 北京/ 清华/ 华大/ 大学/ 清华大学高级功能添加自定义词importjieba# 精确模式示例user_input雨下整夜是一首很美的歌seg_listlist(jieba.cut(user_input))print(/ .join(seg_list))# 输出雨下/ 整夜/ / 是/ 一首/ 很/ 美/ 的/ 歌# 添加自定义词jieba.add_word(雨下整夜)seg_listlist(jieba.cut(user_input))print(/ .join(seg_list))# 输出雨下整夜/ / 是/ 一首/ 很/ 美的/ 歌自定义词典importjieba# 精确模式示例user_input我来到隐世修所很开心这里比森寒冬港的环境好很多seg_listlist(jieba.cut(user_input))print(/ .join(seg_list))# 输出我/ 来到/ 隐世修/ 所/ 很/ 开心/ / 这里/ 比森寒/ 冬港/ 的/ 环境/ 好/ 很多script_pathos.path.dirname(os.path.abspath(__file__))user_dict_pathos.path.join(script_path,userdict.txt)# 加载用户自定义词典内容隐世修所 10 ns森寒冬港 10 nsjieba.load_userdict(user_dict_path)seg_listlist(jieba.cut(user_input))print(/ .join(seg_list))# 输出我/ 来到/ 隐世修所/ 很/ 开心/ / 这里/ 比/ 森寒冬港/ 的/ 环境/ 好/ 很多关键词提取简单来说它就是在你已有的分词基础上帮你从文本里找出最能代表核心内容的几个词。jieba 提供了两种无监督的算法来实现这一点TF-IDF和TextRank。基于 TF-IDF 的关键词提取# 基于TF-IDF的关键词提取user_input我来到隐世修所很开心这里比森寒冬港的环境好很多keywordsanalyse.extract_tags(user_input,topK5,withWeightTrue)print(关键词)forkeywordinkeywords:print(keyword)# 关键词# (隐世修所, 1.7078239289857142)# (森寒冬港, 1.7078239289857142)# (开心, 1.161765236597143)# (来到, 0.7693838405871428)# (环境, 0.7402877264185713)基于 TextRank 的关键词提取# 基于TextRank的关键词提取keywordsanalyse.textrank(user_input,topK5,withWeightTrue)print(关键词)forkeywordinkeywords:print(keyword)# 关键词# (开心, 1.0)# (森寒冬港, 0.7470070442103558)# (隐世修所, 0.6683682393186766)# (来到, 0.6656674769499933)# (环境, 0.40679763001497043)停用词清洗简介文本中频繁出现但本身不携带过多实际语义的字符它们的存在往往会干扰核心信息的提取。为什么要清洗一句话总结停用词清洗的目的是去噪提效——去掉那些“高频无用”的词让算法集中精力于真正有含义的内容。减少数据噪音提升检索精度避免大量停用词稀释核心词语的权重加强模型对文本主题的理解降低计算成本提升检索速度显著降低文本特征维度减少存储和内存占用加速后续处理如向量化、聚类、分类、关键词提取降低大模型Token消耗避免大量不相关的停用词被计入模型输入总数。停用词表开源词表哈工大停用词表hit_stopwords.txtNLP 领域最经典、应用最广泛的中文停用词表之一百度停用词表baidu_stopwords.txt基于海量网络搜索日志整理覆盖大量网络流行虚词川大机器智能实验室词库scu_stopwords.txt针对特定领域语境优化包含更多语境相关的停用词通用中文停用词表cn_stopwords.txt通用集合适合大多数常规的文本处理场景。过滤分词停用词清洗演示importjieba,os# 定义加载停用词表的函数defload_stopwords(file_path):stopwordsset()# 使用集合存储查找速度快复杂度为O(1)try:withopen(file_path,r,encodingutf-8)asf:forlineinf:wordline.strip()# 去除行首行尾的空白字符ifword:# 确保不添加空行stopwords.add(word)exceptFileNotFoundError:print(f文件{file_path}未找到)exceptExceptionase:print(f读取文件{file_path}时发生错误:{e})returnstopwords# 定义清洗函数defclean_text(text,stopwords):分词并去除停用词print(f原始文本:{text})wordsjieba.lcut(text)print(f分词结果:{words})filtered_words[wordforwordinwordsifwordnotinstopwords]print(f去除停用词后的结果:{filtered_words})return .join(filtered_words)if__name____main__:script_pathos.path.dirname(os.path.abspath(__file__))stopwords_fileos.path.join(script_path,hit_stopwords.txt)# 停用词文件路径stopwordsload_stopwords(stopwords_file)user_inputRAG的优点是什么cleaned_textclean_text(user_input,stopwords)print(f清洗后的文本:{cleaned_text})# 输出结果# 分词结果: [RAG, 的, 优点, 是, 什么, ]# 去除停用词后的结果: [RAG, 优点]# 清洗后的文本: RAG 优点分词清洗的应用场景在将用户输入提交给大模型处理前RAG 架构的做法通常需要先执行知识库检索。混合检索结合了稠密检索向量语义检索和稀疏检索如 BM-25是当前的主流方法。这两种检索方式对输入文本的预处理需求存在显著差异稠密检索向量语义检索得益于现代向量数据库的能力此分支通常无需进行传统分词和停用词清洗等预处理。向量模型能够捕捉词语的上下文语义关系保留原始文本特征包括潜在的停用词往往更能精确表达查询的完整语义意图从而提升向量检索的精度。稀疏检索BM-25 等此类方法主要依赖关键词匹配和词频统计等非语义级机制。因此对输入文本执行分词、停用词去除等清洗操作至关重要。移除无关词汇、标准化词形后的精简文本能显著减少噪声更精准地匹配文档中的关键词从而有效提升基于词袋模型的稀疏检索的精度。因此在混合检索架构中预处理尤其是分词和清洗主要服务于稀疏检索组件。预处理生成的“干净”文本被输入 BM-25 等稀疏检索器而原始或仅轻微处理的文本则直接用于向量语义检索以实现各自的最佳性能。Embedding 向量化简介Embedding 向量化是将文本词语、句子、段落等转换为固定长度的稠密浮点数向量的过程。这些向量在语义空间中的位置可以表示文本的内在含义——语义越接近的文本其向量在空间中也越靠近。在 RAG 系统中Embedding 模型负责将用户查询和知识库文档映射到同一向量空间从而实现基于语义相似度的检索让系统不仅能找到关键词匹配的内容还能理解“买水果”与“选购苹果、香蕉”这类同义表达。为什么需要向量化计算机无法直接理解人类的自然语言但擅长处理数值计算。向量化的本质就是将文本转换为计算机能够运算的数值形式从而让机器可以“理解”和比较文本之间的语义关系。在 RAG 系统检索增强生成中向量化主要解决了以下几个关键问题实现语义搜索而非仅关键词匹配传统方式关键词匹配如 BM25、TF-IDF只能找到包含完全相同词语的文档。例如搜索“买水果”无法匹配到“选购苹果、香蕉”因为词语完全不同。向量化后通过嵌入模型将“买水果”和“选购苹果、香蕉”映射到语义空间中相近的位置计算向量相似度如余弦相似度就能召回语义相关的文档。让计算机能够“计算相似度”文本本身是离散的、符号化的无法直接做加减乘除。转化为固定长度的稠密向量后就可以通过数学运算如点积、欧氏距离快速比较两段文本的相似程度为检索排序提供依据。支持大规模高效检索一旦文档被向量化我们可以预先构建向量索引如 HNSW、IVF实现毫秒级的海量相似度搜索。如果没有向量化每次查询都要遍历所有文档并进行复杂的语义理解成本极高且不现实。捕捉深层的语义特征好的嵌入模型能够学习到同义词、上下位词、甚至隐含的情感倾向。例如“开心”和“快乐”、“这个电影很棒”与“这部影片非常精彩”在向量空间中都能相互靠近。这种能力让 RAG 系统不仅依赖字面匹配而是真正理解用户意图。融合多模态信息向量化不仅可以处理文本还能处理图像、音频等。将它们映射到同一语义空间后就可以实现跨模态检索例如用文字描述搜索图片。检索策略稠密检索向量检索原理将查询问题和文档参考资料映射到同一个向量空间通过计算向量间的距离来衡量相关性。流程如下优点语义理解强能捕捉同义词、上下文和隐含语义不依赖字面匹配匹配更智能例如“如何修自行车”可匹配到“单车维修指南”抗噪声对拼写错误、同义替换等有一定鲁棒性支持多模态可将文本、图像等映射到同一空间进行跨模态检索。缺点计算成本高训练和推理需要GPU资源尤其是大规模索引。领域依赖性强在未见过的专业领域可能性能下降明显。可解释性差难以解释为什么某篇文档被召回黑箱特性。数据需求大需要大量高质量的标注数据来训练模型。稀疏检索BM25 检索原理基于词袋模型和倒排索引用精确的词项匹配及统计权重如 BM25计算查询与文档的相关性。词袋表示将文本表示为高维稀疏向量每一维对应词典中的一个词值通常是词频TF、TF-IDF 或 BM25 权重倒排索引预先建立“词 → 包含该词的文档列表”的映射实现快速定位。流程如下优点检索速度快依靠倒排索引无需遍历所有文档。精确匹配能力强对专业术语、编号等精确词召回准确。可解释性高高亮匹配词清晰说明为什么文档被召回。资源消耗低只需要 CPU 和少量内存无需 GPU。成熟稳定几十年的工业级实践易于调优如调整 BM25 的 k1、b 参数。缺点语义鸿沟无法理解同义词、近义词如“车”与“汽车”无法匹配。词形敏感对拼写错误、时态、词形变化无力。稀疏向量维度爆炸词典大小动辄几十万维但实际有效计算仍借助倒排索引。忽略词序和语境“猫追老鼠”与“老鼠追猫”会被视为相同若只考虑词袋。长尾查询召回弱罕见词或组合可能出现零匹配。混合检索为什么需要混合检索混合检索通过融合稠密检索的语义理解能力和稀疏检索的关键词匹配能力实现“语义精确”互补是当下高质量检索系统尤其是RAG的标准方案。优点召回率更高两类检索的漏检文档往往不重叠合并后可覆盖更多相关结果鲁棒性强单一方法失效时如查询中包含罕见词且为同义词另一方法可能仍有效平衡精准与语义既保留关键词的精确性又利用语义泛化能力。结果融合在混合检索中结果融合是指将来自不同检索通路如稀疏检索的 BM25 结果、稠密检索的向量相似度结果返回的文档列表合并成一个统一的、按相关性排序的最终列表的过程。常用方法方法原理优点缺点RRF倒数排名融合只使用文档在各结果列表中的排名忽略原始分数。公式无需分数归一化对离群值鲁棒简单高效未能利用原始分数信息加权求和先将不同检索器的分数归一化到相同范围如 0~1然后加权相加。可以调节每个检索器的权重归一化方式敏感权重需手动或学习得到学习排序LTR使用机器学习模型如 RankNet, LambdaMART从标注数据中学习融合规则。理论上最佳能挖掘复杂模式需要大量标注数据训练成本高RRF 融合算法原理优势代码实现RERANK 重排序简介区别较向量检索代码实现

更多文章