RAG&知识图谱

RAG&知识图谱

RAG&知识图谱 RAG&知识图谱 Modified November 26, 2025 • 第二轮提问:“可以用鸡肉代替牛肉吗?” → 系统可能错误地返回“宫保鸡丁的鸡肉处理方法”(上下文丢失) 问题根源: 1. 实体漂移:未跟踪核心实体(如“麻婆豆腐”) 2. 属性失联:未关联菜谱的食材、步骤、替代方案等结构化信息 3. 短期记忆缺失:无法继承前序对话的上下文 如何实现RAG的记忆 核心架构 🌰 用户提问 │ ▼ 实体识别(NER) → 更新当前实体焦点 │ ▼ 结构化记忆查询 → 存在? → 返回属性值 │ 否 ▼ 问题意图分析 → 存在? → 返回属性值 │ 否 ▼ 问题重构 → 生成新问题 │ ▼ 原始RAG检索 → 生成答案 │ ▼ 上下文更新与确认 中文分词技术实现与选型 主流分词工具对比 jieba 介绍 jieba 是一个 Python 实现的中文分词工具,具有简单易用、功能丰富等特点,开源且免费使用, 支持精确模式、全模式、搜索引擎模式等多种分词模式,可以实现基本的中文分词、词性标注、关键词提取等功能,还支持自定义词典,方便用户根据特定领域或需求进行个性化分词。 HanLP 介绍 HanLP 是由一系列模型与算法组成的 NLP 工具包,支持 Java、Python 等多种编程语言,涵盖了中文分词、词性标注、命名实体识别、依存句法分析、文本分类等多个自然语言处理任务。 两者对比 HanLP 的功能更为全面,除了基本的分词功能外,还涵盖了命名实体识别、依存句法分析等多种高级 NLP 任务;而 jieba 主要侧重于中文分词及相关的基础功能,如关键词提取等。 jieba 的运行速度较快,占用资源相对较少,适合处理大规模文本数据的分词任务;HanLP 由于功能复杂,涉及多种模型计算,尤其是在处理大规模数据时,运行时间可能会更长。 菜谱场景分词优化 创建领域词典(recipe lexicon.txt): Code block Plain Text 麻婆豆腐 3 n 宫保鸡丁 3 n 郫县豆瓣酱 4 n 焯水 2 v 炝锅 2 v 代码实现: Code block Bash import jieba jieba.load userdict("recipe lexicon.txt") def recipe segment(text): words = jieba.lcut(text, use paddle=True) return [(w, flag) for w, flag in posseg.lcut(text)] 实体追踪算法 Code block Python class EntityTracker:def init (self, max memory=3): self.history = deque(maxlen=max memory) self.current focus = None def update(self, entities): 实体权重计算 weights = {} for ent in entities: weights[ent] = weights.get(ent, 0) + 1if ent in self.history: weights[ent] = 1.5 焦点实体选择self.current focus = max(weights, key=weights.get, default=None) self.history.append(self.current focus) 问题意图理解技术实现 问题意图理解是指分析用户输入问题的目的和需求,确定其背后所表达的真实意图。在多轮问答场景中,准确理解问题意图至关重要,它能帮助模型更好地把握用户需求,提供更准确、更相关的回答,使对话更加流畅和自然。 预训练模型的强大表征能力:transformers 架构的预训练模型,如 BERT、GPT 等,在大规模语料上进行预训练,学习到了丰富的语言知识和语义信息,能够很好地捕捉问题中的语义特征和意图线索。 灵活的微调机制:可以基于预训练模型,通过在特定的问题意图理解数据集上进行微调,使模型适应具体的任务和领域,从而提高意图理解的准确性。 Code block Python 原始问题: 麻婆豆腐怎么做? 重构问题: 麻婆豆腐怎么做? 原始问题: 它是川菜么? 重构问题: 麻婆豆腐是川菜么? 原始问题: 食材呢? 重构问题: 麻婆豆腐的食材有哪些? 问题重构与记忆管理 上下文感知的问题重构算法 Code block Python def reconstruct question(self, current question): if not current question or not isinstance(current question, str): raise ValueError("问题不能为空且必须是字符串") if not self.context: current tokens = self.track question(current question) self.original subject = self.get subject(current tokens) self.context.append(current question) return current question current tokens = self.track question(current question) current subject = self.get subject(current tokens) last reconstructed question = self.context[ 1] 记忆存储结构设计 Code block Python class MultiRoundQuestionMemory:def init (self, memory rounds=3): self.memory rounds = memory rounds self.context = [] self.original subject = None def reset memory(self): self.context = [] self.original subject = None def set memory rounds(self, rounds): self.memory rounds = rounds def track question(self, question): return jieba.lcut(question) 记忆功能给Dify提供接口 由于代码比较复杂和第三方库的原因,代码不能直接在dify运行,需要提供http的接口供Dify调用 Code block Python @app.route('/reconstruct', methods=['POST']) def reconstruct(): data = request.get json() if not data or 'question' not in data: return jsonify({'error': 'Invalid request, question is required'}), 400 question = data['question'] try: reconstructed = memory.reconstruct question(question) return jsonify({ 'original question': question, 'reconstructed question': reconstructed }) except ValueError as e: return jsonify({'error': str(e)}), 400 @app.route('/reset', methods=['POST']) def reset(): memory.reset memory() return jsonify({'status': 'memory reset successfully'}) Dify工作流集成 通过Http请求实现多轮问答的功能,后面的流程就和我们之前讲的类似了。 数据分段策略/标准/父子/问答 向量数据库的存储原理:为什么要分段? 向量数据库通过将文本转化为高维向量(通常为768 1024维),在数学空间中以余弦相似度或欧氏距离度量语义相关性。 向量化表示: • 使用嵌入模型将文本转换为高维向量 • 这些向量捕获了文本的语义特征,语义相似的文本在向量空间中距离相近 相似度计算: • 采用余弦相似度、欧氏距离等度量方式 • 计算查询向量与存储向量之间的距离,返回最相似的top k结果 文本长度对向量表示的影响 1. 信息稀释效应: • 长文本包含过多信息,导致关键语义被稀释 • 向量表示趋向于"平均化",失去对核心概念的精准捕捉 1. 注意力机制局限: • 现代嵌入模型的注意力机制对长序列处理能力有限 • 超过模型最佳处理长度(如512token)后表示质量下降 1. 实证研究显示: • 文本长度在50 300词时向量表示最有效 • 超过500词后相似度计算的准确性显著降低 分段(Chunking)策略的重要性 为解决长文本表示问题,RAG系统普遍采用分段策略: 1. 固定长度分块: • 简单按字符/词数分割(如256token一段) • 优点:实现简单;缺点:可能切断语义连贯性 1. 基于内容的分段: • 按段落、标题等自然边界分割 • 第二轮提问:“可以用鸡肉代替牛肉吗?” → 系统可能错误地返回“宫保鸡丁的鸡肉处理方法”(上下文丢失) 问题根源: 1. 实体漂移:未跟踪核心实体(如“麻婆豆腐”) 2. 属性失联:未关联菜谱的食材、步骤、替代方案等结构化信息 3. 短期记忆缺失:无法继承前序对话的上下文 如何实现RAG的记忆 核心架构 🌰 用户提问 │ ▼ 实体识别(NER) → 更新当前实体焦点 │ ▼ 结构化记忆查询 → 存在? → 返回属性值 │ 否 ▼ 问题意图分析 → 存在? → 返回属性值 │ 否 ▼ 问题重构 → 生成新问题 │ ▼ 原始RAG检索 → 生成答案 │ ▼ 上下文更新与确认 用户提问 │ ▼ 实体识别(NER) → 更新当前实体焦点 │ ▼ 结构化记忆查询 → 存在? → 返回属性值 │ 否 ▼ 问题意图分析 → 存在? → 返回属性值 │ 否 ▼ 问题重构 → 生成新问题 │ ▼ 原始RAG检索 → 生成答案 │ ▼ 上下文更新与确认 中文分词技术实现与选型 主流分词工具对比 jieba 介绍 jieba 是一个 Python 实现的中文分词工具,具有简单易用、功能丰富等特点,开源且免费使用, 支持精确模式、全模式、搜索引擎模式等多种分词模式,可以实现基本的中文分词、词性标注、关键词提取等功能,还支持自定义词典,方便用户根据特定领域或需求进行个性化分词。 HanLP 介绍 HanLP 是由一系列模型与算法组成的 NLP 工具包,支持 Java、Python 等多种编程语言,涵盖了中文分词、词性标注、命名实体识别、依存句法分析、文本分类等多个自然语言处理任务。 两者对比 HanLP 的功能更为全面,除了基本的分词功能外,还涵盖了命名实体识别、依存句法分析等多种高级 NLP 任务;而 jieba 主要侧重于中文分词及相关的基础功能,如关键词提取等。 jieba 的运行速度较快,占用资源相对较少,适合处理大规模文本数据的分词任务;HanLP 由于功能复杂,涉及多种模型计算,尤其是在处理大规模数据时,运行时间可能会更长。 菜谱场景分词优化 创建领域词典(recipe lexicon.txt): 代码实现: 实体追踪算法 问题意图理解技术实现 问题意图理解是指分析用户输入问题的目的和需求,确定其背后所表达的真实意图。在多轮问答场景中,准确理解问题意图至关重要,它能帮助模型更好地把握用户需求,提供更准确、更相关的回答,使对话更加流畅和自然。 预训练模型的强大表征能力:transformers 架构的预训练模型,如 BERT、GPT 等,在大规模语料上进行预训练,学习到了丰富的语言知识和语义信息,能够很好地捕捉问题中的语义特征和意图线索。 灵活的微调机制:可以基于预训练模型,通过在特定的问题意图理解数据集上进行微调,使模型适应具体的任务和领域,从而提高意图理解的准确性。 问题重构与记忆管理 上下文感知的问题重构算法 记忆存储结构设计 记忆功能给Dify提供接口 由于代码比较复杂和第三方库的原因,代码不能直接在dify运行,需要提供http的接口供Dify调用 Dify工作流集成 通过Http请求实现多轮问答的功能,后面的流程就和我们之前讲的类似了。 数据分段策略/标准/父子/问答 向量数据库的存储原理:为什么要分段? 向量数据库通过将文本转化为高维向量(通常为768 1024维),在数学空间中以余弦相似度或欧氏距离度量语义相关性。 向量化表示: • 使用嵌入模型将文本转换为高维向量 • 这些向量捕获了文本的语义特征,语义相似的文本在向量空间中距离相近 相似度计算: • 采用余弦相似度、欧氏距离等度量方式 • 计算查询向量与存储向量之间的距离,返回最相似的top k结果 文本长度对向量表示的影响 1. 信息稀释效应: • 长文本包含过多信息,导致关键语义被稀释 • 向量表示趋向于"平均化",失去对核心概念的精准捕捉 1. 注意力机制局限: • 现代嵌入模型的注意力机制对长序列处理能力有限 • 超过模型最佳处理长度(如512token)后表示质量下降 1. 实证研究显示: • 文本长度在50 300词时向量表示最有效 • 超过500词后相似度计算的准确性显著降低 分段(Chunking)策略的重要性 为解决长文本表示问题,RAG系统普遍采用分段策略: 1. 固定长度分块: • 简单按字符/词数分割(如256token一段) • 优点:实现简单;缺点:可能切断语义连贯性 1. 基于内容的分段: • 按段落、标题等自然边界分割 Dify里面的几种分段方式 2.1 普通分块(标准分块) 实现方式 通过固定长度的文本块分割(如每段500字),结合Embedding模型将文本转换为向量。 优点 1. 灵活性高:适用于通用文档处理,支持多源数据(PDF、Word、网页等); 2. 检索效率平衡:混合检索结合向量与关键字匹配,召回率提升30%; 缺点 1. 上下文割裂:固定长度分块可能导致语义不连贯; 2. 资源消耗较大:高质量模式依赖Embedding模型,需较高算力。 适用场景 • 通用知识库构建(如企业文档管理); • 需要快速响应混合检索的问答系统。 问答分块(QA分块) 实现方式 通过LLM为每段文本生成问答对(Q&A pairs),检索时匹配用户问题与预生成的相似问题,返回对应答案段落。在问答模式下会自动调用LLM生成问答对,并优化检索流程。 优点 1. 精准匹配:通过语义相似度直接匹配问题,减少噪声干扰; 2. 用户体验优化:适用于FAQ场景,回答更简洁直接; 3. 支持复杂查询:通过QA对覆盖长尾问题。 缺点 1. 生成成本高:需额外计算资源生成问答对; 2. 依赖模型能力:问答对质量受LLM生成能力限制。 适用场景 • 客服系统与FAQ库; • 需要高精度问答的垂直领域(如法律、医疗)。 父子策略/层级分块 实现方式 通过人工干预或规则定义分块层级,例如将文档按章节划分父块,再对每章内容进行子块分割。允许用户手动调整分块大小和清洗规则。 优点 1. 语义连贯性:层级结构保留上下文关系; 2. 灵活可控:适用于结构化文档(如技术手册、合同)。 缺点 1. 开发成本高:需人工标注或规则设计; 2. 扩展性差:难以适应非结构化数据。 适用场景 • 法律合同解析(按条款分层); • 学术论文检索(按摘要、正文、参考文献分级)。 父子策略/全文分块 实现方式 通过人工干预或规则定义分块层级,例如将全文文档做为父块,再对内容进行子块分割。允许用户手动调整分块大小和清洗规则。 优点 1. 语义连贯性:文档内容结构全部保留; 2. 灵活可控:适用于论文、作文等文章类。 缺点 1. 开发成本高:检索速度和成功率较低; 2. 扩展性差:难以适应非结构化数据。 适用场景 • 文章的全参考; • 学术论文全文参考。 作者留言 2025年4月27日 这里首先不记录 agent 相关项目的部署、安装、模型的下载,ollama 的代理设置、配置等内容,该部分为基础内容。自行搜索安装。 同时关于一些 agnet 内的操作也不做讲解,自行搜索 本内容属于更深层次的部分,更偏向 rag 知识图谱方面的内容。非基础内容。不适合新手学习奥! 2025年6月7日 理论上就写这么多,无论是针对企业级、个人、教育方面的知识库,根据内容都应该自己手搓出来。 至于为什么不做多一些有关Dify工作流 agent相关的内容?主要是相关的教程多的很,自己但凡真的想学,免费的都能找到好多。 其次就是最近发现很多人都很纯真,我有点抓狂, 索性就不做基础内容,乐得清静。 实际内容上还有缺陷,就是在后面很少举例子了。一开始觉得让非技术人员也能看明白,到后面自己也是懒了。想着赶紧弄完算了。能看懂的一定能看懂,看不懂的一定看不懂。 后面的话 应该会新开一个AI绘画炼丹的手册内容和Comfyui官方弄得节点介绍做个知识库。 如果做这两个的话就要欠债了,因为在弄这个内容的时候我也在弄有关劳动者相关的知识图谱,就是围绕劳动法关联其他法律和广东省地方的条例的知识库,现在还没弄完。争取6月底弄完他。然后找个服务器对外放一个月 看看有没有要修改的地方。 Embedding 模型作用与原理详解 Embedding 模型是什么 当我们使用检索增强生成(RAG)技术来搭建本地知识库时,Embedding 模型就如同这个图书馆的智能索引系统,能让我们快速准确地找到所需的知识。 简单来讲,Embedding 就像是给数据穿上了一件“数字外衣”,把原本各种各样的数据(比如文本、图像、语音等)转化成一组数字,也就是向量来表示。 Embedding 向量本质上是将语义信息映射到高维空间的数学坐标。以 3D 空间为例: • "猫" → [0.7, 0.3, 0.1] • "犬" → [0.68, 0.25, 0.15] • "发动机" → [ 0.4, 0.8, 0.5] 实际上 Embedding 模型在实际中其实是多种维度,并不是实际上展示三维。 实际上 Embedding 模型在实际中其实是多种维度,并不是实际上展示三维。 维度解释 • 低维(<100):语义区分能力弱,可能出现"苹果"(水果)与"苹果"(手机)混淆 • 高维( 1000):需要更多计算资源,但能捕捉"跑步"与"慢跑"的细微差别 围绕嵌入的开源研究相当活跃,并且定期发布新的模型。了解最新发布的模型的一个好地方是 MTEB 排行榜 https://huggingface.co/spaces/mteb/leaderboard 🌰 假设我们有 5 个简单的单词:国王、王后、男人、女人、苹果。Embedding 模型会把这些词转换成数字向量,同时保留它们之间的关系。 (One hot 编码) 国王: [1, 0, 0, 0, 0] 王后: [0, 1, 0, 0, 0] 男人: [0, 0, 1, 0, 0] 女人: [0, 0, 0, 1, 0] 苹果: [0, 0, 0, 0, 1] 这种表示无法体现任何语义关系。 (假设 2 维向量) 经过训练后,可能得到: 国王: [1.2, 0.8] 王后: [1.0, 0.9] 男人: [0.9, 0.1] 女人: [0.8, 0.2] 苹果: [0.1, 0.1] 关键观察 语义相似性: ◦ "国王"和"王后"向量接近(都与王室相关) ◦ "男人"和"女人"向量接近(都代表人) ◦ "苹果"远离其他词(完全不同类别) 关系保留: 我们可以做向量运算: 国王 男人 + 女人 ≈ [1.2 0.9+0.8, 0.8 0.1+0.2] = [1.1, 0.9] ≈ 王后 这正好反映了"国王对应男人,那么王后就对应女人"的逻辑关系 可视化: y 轴 ^ | 王后● | 国王● | 女人● 男人● | + x 轴 苹果● 实际应用场景 当你在淘宝搜索"夏季男士 T 恤"时: 1. Embedding 模型将"男士"转换为向量[0.9, 0.1] 2. 将"T 恤"转换为[0.3, 0.4] 3. 系统会寻找向量接近(0.9+0.3)/2=[0.6,0.25]的商品 4. 可能返回"男式短袖 T 恤"(其 embedding 可能是[0.65,0.2]) 这样即使搜索词不完全匹配,也能找到相关商品。 假设我们有 5 个简单的单词:国王、王后、男人、女人、苹果。Embedding 模型会把这些词转换成数字向量,同时保留它们之间的关系。 (One hot 编码) 国王: [1, 0, 0, 0, 0] 王后: [0, 1, 0, 0, 0] 男人: [0, 0, 1, 0, 0] 女人: [0, 0, 0, 1, 0] 苹果: [0, 0, 0, 0, 1] 这种表示无法体现任何语义关系。 (假设 2 维向量) 经过训练后,可能得到: 国王: [1.2, 0.8] 王后: [1.0, 0.9] 男人: [0.9, 0.1] 女人: [0.8, 0.2] 苹果: [0.1, 0.1] 关键观察 语义相似性: ◦ "国王"和"王后"向量接近(都与王室相关) ◦ "男人"和"女人"向量接近(都代表人) ◦ "苹果"远离其他词(完全不同类别) ◦ "国王"和"王后"向量接近(都与王室相关) ◦ "男人"和"女人"向量接近(都代表人) ◦ "苹果"远离其他词(完全不同类别) 关系保留: 我们可以做向量运算: 国王 男人 + 女人 ≈ [1.2 0.9+0.8, 0.8 0.1+0.2] = [1.1, 0.9] ≈ 王后 这正好反映了"国王对应男人,那么王后就对应女人"的逻辑关系 可视化: y 轴 ^ | 王后● | 国王● | 女人● 男人● | + x 轴 苹果● 实际应用场景 当你在淘宝搜索"夏季男士 T 恤"时: 1. Embedding 模型将"男士"转换为向量[0.9, 0.1] 2. 将"T 恤"转换为[0.3, 0.4] 3. 系统会寻找向量接近(0.9+0.3)/2=[0.6,0.25]的商品 4. 可能返回"男式短袖 T 恤"(其 embedding 可能是[0.65,0.2]) 这样即使搜索词不完全匹配,也能找到相关商品。 常用模型深度对比 选择四个 embedding 模型。它们的名气比较大,使用也比较多。模型的主要特性摘要如下。 模型没有绝对的好与坏,只在于使用的场景有区别、占用资源的不同 模型没有绝对的好与坏,只在于使用的场景有区别、占用资源的不同 在本地知识库搭建中,我们重点关注的是文本 Embedding,它能把文本信息变成计算机更容易理解和处理的向量形式。 相关解释 向量维度:具体的方法就是这个词它要和谁靠近,具体参考高维空间的数学坐标,比如健身和跳舞,中间的距离就会用比如余弦相似度,归一等方法进行计算 相关解释 向量维度:具体的方法就是这个词它要和谁靠近,具体参考高维空间的数学坐标,比如健身和跳舞,中间的距离就会用比如余弦相似度,归一等方法进行计算 Embedding 模型的原理 词向量化 独热编码(one hot encoding) 独热编码是一种简单直接的词向量化方法。想象我们有一个水果词汇表,里面只有“苹果”“香蕉”“橘子”三个词。我们可以给每个词分配一个二进制向量,这个向量只有一个位置是 1,其余位置都是 0。例如: • “苹果”表示为 [1, 0, 0] • “香蕉”表示为 [0, 1, 0] • “橘子”表示为 [0, 0, 1] 这种表示有明显的缺点,如果词汇表变得非常大,这样的向量会非常长,而且无法体现词与词之间的语义关系,比如“苹果”和“香蕉”都属于水果,在这种表示方法下它们看起来毫无关联。 词嵌入(word embeddings) 词嵌入是一种更高级的词向量化方法,像 word2vec、glove 等模型都属于词嵌入模型。 以 word2vec 为例,它通过预测词的上下文来学习词向量。假设我们有这样一个句子“我喜欢吃苹果”,word2vec 会根据“苹果”周围的词(“喜欢”“吃”)来学习“苹果”的向量表示。 最终,语义相似的词在向量空间中会靠得很近。比如“苹果”和“香蕉”,它们的向量在空间中的位置会比较接近,因为它们都是水果。 句子向量化 简单平均/加权平均 简单平均就是把句子中每个词的向量加起来,然后除以词的数量,得到句子的向量。 例如,句子“我爱祖国”, 假设“我”的向量是 [0.1, 0.2, 0.3],“爱”的向量是 [0.4, 0.5, 0.6],“祖国”的向量是 [0.7, 0.8, 0.9],那么句子向量就是这三个向量相加后除以 3。加权平均则是根据词的重要性给每个词的向量赋予不同的权重,再进行计算。比如在一个句子中,关键词的权重可以设得高一些。 递归神经网络(RNN) RNN 就像一个有记忆力的小机器人,它会按照句子中词的顺序依次处理每个词,并且会记住之前处理过的信息。 例如,对于句子“我今天去超市买了苹果”, RNN 会先处理“我”,然后结合“我”的信息处理“今天”,以此类推,最终生成整个句子的向量表示。能够更好地处理长句子,因为它们有特殊的机制来避免在处理长序列时丢失重要信息。 这个向量方式可以理解为背课文,需要从头到尾一句一句的背下来 这个向量方式可以理解为背课文,需要从头到尾一句一句的背下来 卷积神经网络(CNN) CNN 就像一个拿着放大镜的检查员,它会在句子中滑动一个小窗口(卷积核),捕捉句子中的局部特征。 比如在句子“这家餐厅的披萨非常好吃”中 CNN 可能会通过卷积核发现“披萨好吃”这样的局部特征,然后根据这些特征生成句子向量。 这个向量方式可以理解为背大纲,但是缺点是不能背太多。比如给他一本身,他很难快速背下来。 这个向量方式可以理解为背大纲,但是缺点是不能背太多。比如给他一本身,他很难快速背下来。 自注意力机制(如 Transformer) 自注意力机制就像是一个聪明的秘书,它会关注句子中每个词与其他词的关系。对于句子“小明和小红一起去公园玩”,会分析“小明”和“小红”之间的关系,以及它们和“公园”“玩”的关系,然后综合这些信息生成句子向量。这样就能更好地捕捉句子中词与词之间复杂的语义关系。 这个向量方式可以将一本书,把每一个大纲、每一个课拆解出来然后进行并行处理,并同时整理大纲之间、课之间的语义关系 这个向量方式可以将一本书,把每一个大纲、每一个课拆解出来然后进行并行处理,并同时整理大纲之间、课之间的语义关系 文档向量化 简单平均/加权平均 和句子向量化类似,对文档中的每个句子向量进行平均或加权平均,得到文档的向量表示。 比如一篇关于旅游的文档,有多个句子描述不同的景点,将这些句子向量平均后就得到了文档向量。 文档主题模型 就像一个分类大师,它会分析文档中词的分布,找出文档的主题。 例如,一篇文档中多次出现“足球”“比赛”“球员”等词,可能会判断这篇文档的主题是足球。然后根据主题分布生成文档的向量表示。 层次化模型(如 doc2vec) doc2vec 是 word2vec 的扩展,它不仅考虑了文档中的词,还考虑了文档的整体信息。 比如有一系列关于不同电影的评论文档,doc2vec 可以学习到每个文档的独特向量表示,同时也能体现出文档之间的相似性。 距离公式的本质 假设向量 A=[a₁,a₂,a₃], B=[b₁,b₂,b₃] 🌰 假设: • 向量 A = [1, 3, 5](例如:表示某个商品的"价格=1,销量=3,评分=5") • 向量 B = [2, 4, 1](另一个商品的对应特征) 1. 余弦相似度 公式: ∥A∥⋅∥B∥ A⋅B = 1 2 +3 2 +5 2 ⋅ 2 2 +4 2 +1 2 1×2+3×4+5×1 计算步骤: 1. 分子(点积): 2+12+5=19 2. 分母: • ∥A∥= 1+9+25 = 35 ≈5.916 • ∥B∥= 4+16+1 = 21 ≈4.583 3. 结果: 5.916×4.583 19 ≈ 27.11 19 ≈0.70 解释:两向量方向相似度约 70%(值越接近 1 越相似)。 2. 欧氏距离 公式: (1−2) 2 +(3−4) 2 +(5−1) 2 计算步骤: 假设: • 向量 A = [1, 3,

在 小宇宙note 阅读完整内容