黑马大模型RAG与Agent智能体实战教程LangChain提示词——9、RAG开发——余弦相似度算法(点积np.dot()、模长np.linalg.norm()、文本相似度计算、模拟RAG场景)

黑马大模型RAG与Agent智能体实战教程LangChain提示词——9、RAG开发——余弦相似度算法(点积np.dot()、模长np.linalg.norm()、文本相似度计算、模拟RAG场景)

教程:https://www.bilibili.com/video/BV1yjz5BLEoY

代码:https://github.com/shangxiang0907/HeiMa-AI-LLM-RAG-Agent-Dev

云开发平台:https://hzh.sealos.run

文章目录

RAG开发-05、[扩展]余弦相似度算法

余弦相似度

在这里插入图片描述

余弦相似度算法(向量点积与向量模长乘积之商)

在这里插入图片描述

→提示词:帮我创建代码10,介绍余弦相似度算法(示例文本采用英文)

←AI回复

在这里插入图片描述


在这里插入图片描述

10_Cosine_Similarity_Algorithm.py

""" 余弦相似度算法介绍与实现 余弦相似度(Cosine Similarity)是一种常用的相似度度量方法,广泛应用于: - 文本相似度计算 - 推荐系统 - 信息检索 - 向量空间模型 - RAG(检索增强生成)中的文档检索 原理: 余弦相似度通过计算两个向量的夹角余弦值来衡量它们的相似程度。 公式:cos(θ) = (A · B) / (||A|| × ||B||) 其中: - A · B 表示向量A和B的点积 - ||A|| 和 ||B|| 分别表示向量A和B的模(长度) - 结果范围:[-1, 1],值越接近1表示越相似,越接近-1表示越不相似 优点: 1. 不受向量长度影响,只关注方向 2. 对高维稀疏向量效果好 3. 计算效率高 """import numpy as np from typing import List, Tuple import math defcosine_similarity_manual(vec1: List[float], vec2: List[float])->float:""" 手动实现余弦相似度计算 Args: vec1: 第一个向量 vec2: 第二个向量 Returns: 余弦相似度值,范围 [-1, 1] """iflen(vec1)!=len(vec2):raise ValueError("两个向量的维度必须相同")# 计算点积 dot_product =sum(a * b for a, b inzip(vec1, vec2))# 计算向量模长 magnitude1 = math.sqrt(sum(a * a for a in vec1)) magnitude2 = math.sqrt(sum(b * b for b in vec2))# 避免除零错误if magnitude1 ==0or magnitude2 ==0:return0.0# 计算余弦相似度 cosine_sim = dot_product /(magnitude1 * magnitude2)return cosine_sim defcosine_similarity_numpy(vec1: np.ndarray, vec2: np.ndarray)->float:""" 使用 NumPy 实现余弦相似度计算(更高效) Args: vec1: 第一个向量(numpy数组) vec2: 第二个向量(numpy数组) Returns: 余弦相似度值,范围 [-1, 1] """# 计算点积 dot_product = np.dot(vec1, vec2)# 计算向量模长 magnitude1 = np.linalg.norm(vec1) magnitude2 = np.linalg.norm(vec2)# 避免除零错误if magnitude1 ==0or magnitude2 ==0:return0.0# 计算余弦相似度 cosine_sim = dot_product /(magnitude1 * magnitude2)returnfloat(cosine_sim)deftext_to_vector(text:str, vocabulary: List[str])-> List[float]:""" 将文本转换为词频向量(简单的文本向量化方法) Args: text: 输入文本 vocabulary: 词汇表 Returns: 词频向量 """# 对文本做简单预处理:全部转小写并按空格切分为词列表 words = text.lower().split()# 构建词频向量:对于词表 vocabulary 中的每个词,统计它在当前文本中出现的次数# 例如 vocabulary = ["机器学习", "人工智能"],若文本中分别出现 2 次和 1 次,则 vector = [2, 1] vector =[words.count(word)for word in vocabulary]return vector defcalculate_text_similarity(text1:str, text2:str)->float:""" 计算两个文本的余弦相似度 Args: text1: 第一个文本 text2: 第二个文本 Returns: 文本相似度值 """# 构建词汇表(两个文本的所有唯一词)# 使用 set 去重:同一个词在同一文本中出现多次,只会保留一份 words1 =set(text1.lower().split()) words2 =set(text2.lower().split())# 集合并集运算(words1 | words2):获取“在 text1 或 text2 中出现过的所有不重复的词”# 因为是集合并集,所以这里已经没有重复词,vocabulary 是一个“去重后的词表” vocabulary =sorted(list(words1 | words2))# 转换为向量 vec1 = text_to_vector(text1, vocabulary) vec2 = text_to_vector(text2, vocabulary)# 计算余弦相似度return cosine_similarity_manual(vec1, vec2)deffind_most_similar(query_vector: np.ndarray, document_vectors: List[np.ndarray])-> Tuple[int,float]:""" 在文档向量集合中找到与查询向量最相似的文档 Args: query_vector: 查询向量 document_vectors: 文档向量列表 Returns: (最相似文档的索引, 相似度分数) """ similarities =[]for doc_vec in document_vectors: sim = cosine_similarity_numpy(query_vector, doc_vec) similarities.append(sim)# 找到最大相似度的索引 max_index = np.argmax(similarities) max_similarity = similarities[max_index]return max_index, max_similarity defmain():""" 主函数:演示余弦相似度的各种应用场景 """print("="*80)print("余弦相似度算法介绍与演示")print("="*80)# 1. 基础示例:计算两个向量的余弦相似度print("\n【示例1:基础向量相似度计算】")print("-"*80) vec_a =[1,2,3,4,5] vec_b =[2,4,6,8,10]# vec_b = 2 * vec_a,方向相同,相似度为1 similarity_manual = cosine_similarity_manual(vec_a, vec_b) similarity_numpy = cosine_similarity_numpy(np.array(vec_a), np.array(vec_b))print(f"向量A: {vec_a}")print(f"向量B: {vec_b}")print(f"手动实现余弦相似度: {similarity_manual:.4f}")print(f"NumPy实现余弦相似度: {similarity_numpy:.4f}")print(f"说明: 向量B是向量A的2倍,方向相同,相似度为1.0")# 2. 不同方向的向量print("\n【示例2:不同方向的向量】")print("-"*80) vec_c =[1,0,0] vec_d =[0,1,0]# 垂直向量,相似度为0 similarity_cd = cosine_similarity_numpy(np.array(vec_c), np.array(vec_d))print(f"向量C: {vec_c}")print(f"向量D: {vec_d}")print(f"余弦相似度: {similarity_cd:.4f}")print(f"说明: 两个向量垂直,相似度为0")# 3. 文本相似度计算print("\n【示例3:文本相似度计算】")print("-"*80) texts =["Machine learning is a subfield of artificial intelligence","Artificial intelligence includes various machine learning techniques","The weather is nice today and it is a good day for a walk","Deep learning is a specialized area within machine learning"]# 使用英文示例文本,便于词频法(基于空格分词)更好工作 query_text ="The relationship between machine learning and artificial intelligence"print(f"查询文本: {query_text}\n")print("计算与各文本的相似度:")for i, text inenumerate(texts,1): similarity = calculate_text_similarity(query_text, text)print(f" 文本{i}: {text}")print(f" 相似度: {similarity:.4f}\n")# 4. 文档检索示例(模拟RAG场景)print("\n【示例4:文档检索示例(模拟RAG场景)】")print("-"*80)# 模拟文档向量(实际应用中这些向量来自 embedding 模型) documents =["Python is a high level programming language widely used for data science and machine learning","Java is an object oriented programming language often used for enterprise application development","Machine learning algorithms can learn patterns and rules from data","Database management systems are used to store and manage large amounts of structured data"]# 模拟文档向量(简化示例,实际应使用 embedding 模型)# 这里使用简单的英文词频向量作为演示 query ="How to use Python for machine learning"print(f"查询: {query}\n")print("文档库:")for i, doc inenumerate(documents,1):print(f" 文档{i}: {doc}")# 计算查询与每个文档的相似度print("\n相似度排序结果:") similarities =[]for i, doc inenumerate(documents): sim = calculate_text_similarity(query, doc) similarities.append((i +1, doc, sim))# 按相似度降序排序 similarities.sort(key=lambda x: x[2], reverse=True)for rank,(doc_id, doc_text, sim)inenumerate(similarities,1):print(f" 排名{rank}: 文档{doc_id} (相似度: {sim:.4f})")print(f" 内容: {doc_text}\n")# 5. 向量归一化的重要性print("\n【示例5:向量归一化的影响】")print("-"*80) vec_e =[1,2,3] vec_f =[10,20,30]# 10倍缩放 vec_g =[100,200,300]# 100倍缩放 sim_ef = cosine_similarity_numpy(np.array(vec_e), np.array(vec_f)) sim_eg = cosine_similarity_numpy(np.array(vec_e), np.array(vec_g))print(f"向量E: {vec_e}")print(f"向量F: {vec_f} (E的10倍)")print(f"向量G: {vec_g} (E的100倍)")print(f"\nE与F的余弦相似度: {sim_ef:.4f}")print(f"E与G的余弦相似度: {sim_eg:.4f}")print(f"说明: 余弦相似度不受向量长度影响,只关注方向")# 6. 实际应用场景说明print("\n【应用场景】")print("-"*80)print("1. RAG系统:")print(" - 将查询和文档转换为向量(embedding)")print(" - 使用余弦相似度找到最相关的文档")print(" - 将相关文档作为上下文提供给LLM")print()print("2. 推荐系统:")print(" - 计算用户向量和物品向量的相似度")print(" - 推荐相似度高的物品给用户")print()print("3. 文本去重:")print(" - 计算文本之间的相似度")print(" - 识别和去除重复或高度相似的文本")print()print("4. 搜索引擎:")print(" - 计算查询和文档的相似度")print(" - 按相似度排序返回搜索结果")print("\n"+"="*80)print("演示完成!")print("="*80)if __name__ =="__main__": main()

运行代码

python3 AI_LLM_RAG_Agent_Dev/10_Cosine_Similarity_Algorithm.py 

结果:

================================================================================ 余弦相似度算法介绍与演示 ================================================================================ 【示例1:基础向量相似度计算】 -------------------------------------------------------------------------------- 向量A: [1, 2, 3, 4, 5] 向量B: [2, 4, 6, 8, 10] 手动实现余弦相似度: 1.0000 NumPy实现余弦相似度: 1.0000 说明: 向量B是向量A的2倍,方向相同,相似度为1.0 【示例2:不同方向的向量】 -------------------------------------------------------------------------------- 向量C: [1, 0, 0] 向量D: [0, 1, 0] 余弦相似度: 0.0000 说明: 两个向量垂直,相似度为0 【示例3:文本相似度计算】 -------------------------------------------------------------------------------- 查询文本: The relationship between machine learning and artificial intelligence 计算与各文本的相似度: 文本1: Machine learning is a subfield of artificial intelligence 相似度: 0.5000 文本2: Artificial intelligence includes various machine learning techniques 相似度: 0.5345 文本3: The weather is nice today and it is a good day for a walk 相似度: 0.1667 文本4: Deep learning is a specialized area within machine learning 相似度: 0.3198 【示例4:文档检索示例(模拟RAG场景)】 -------------------------------------------------------------------------------- 查询: How to use Python for machine learning 文档库: 文档1: Python is a high level programming language widely used for data science and machine learning 文档2: Java is an object oriented programming language often used for enterprise application development 文档3: Machine learning algorithms can learn patterns and rules from data 文档4: Database management systems are used to store and manage large amounts of structured data 相似度排序结果: 排名1: 文档1 (相似度: 0.3904) 内容: Python is a high level programming language widely used for data science and machine learning 排名2: 文档3 (相似度: 0.2390) 内容: Machine learning algorithms can learn patterns and rules from data 排名3: 文档2 (相似度: 0.1048) 内容: Java is an object oriented programming language often used for enterprise application development 排名4: 文档4 (相似度: 0.1010) 内容: Database management systems are used to store and manage large amounts of structured data 【示例5:向量归一化的影响】 -------------------------------------------------------------------------------- 向量E: [1, 2, 3] 向量F: [10, 20, 30](E的10倍) 向量G: [100, 200, 300](E的100倍) E与F的余弦相似度: 1.0000 E与G的余弦相似度: 1.0000 说明: 余弦相似度不受向量长度影响,只关注方向 【应用场景】 -------------------------------------------------------------------------------- 1. RAG系统: - 将查询和文档转换为向量(embedding) - 使用余弦相似度找到最相关的文档 - 将相关文档作为上下文提供给LLM 2. 推荐系统: - 计算用户向量和物品向量的相似度 - 推荐相似度高的物品给用户 3. 文本去重: - 计算文本之间的相似度 - 识别和去除重复或高度相似的文本 4. 搜索引擎: - 计算查询和文档的相似度 - 按相似度排序返回搜索结果 ================================================================================ 演示完成! ================================================================================

ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍
ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ ‌‍ᅟᅠ

Read more

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 三方库 flutter_adaptive_scaffold 的鸿蒙化适配指南 - 掌握一套代码适配全场景终端的自适应架构技术、助力鸿蒙应用构建从手机到平板及折叠屏的极致无缝交互体系 前言 在 OpenHarmony 鸿蒙应用追求“万物互联、全场景覆盖”的伟大进程中,屏幕尺寸的多样性(从 6 英寸手机到 12 英寸平板,再到 2D/3D 模式切换的折叠屏)是每一位 UI 开发者必须正面迎接的挑战。如何在不为每种设备重写 UI 的前提下,实现导航栏自动从“底部”平滑流转到“侧边”?如何在宽屏模式下自动开启“双栏(Master-Detail)”布局?flutter_adaptive_scaffold 作为一个由 Flutter

By Ne0inhk
在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程

在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程

在 macOS 上通过 Docker 本地安装 OpenClaw 完整教程 什么是 OpenClaw?—— 你的本地 AI 智能体执行框架 OpenClaw 不仅仅是一个聊天机器人,而是一个功能强大的 AI 智能体执行框架。你可以把它想象成一个能自主思考、调用工具、并替你完成复杂任务的数字员工。 🧠 核心概念 * 智能体:OpenClaw 的核心大脑。它能理解你的自然语言指令,拆解任务,并决定调用哪些工具来执行。 * 网关:所有外部访问的入口。它负责处理 WebSocket 连接、管理设备配对、路由消息,是你与智能体交互的桥梁。 * 技能:智能体可调用的具体工具,比如访问文件、操作浏览器、发送消息、查询数据库等。你可以根据需要扩展技能库。 * 记忆:OpenClaw 可以存储对话历史和重要信息,实现长期记忆和上下文理解,让交互更连贯。 * 通道:连接外部聊天平台的渠道,如

By Ne0inhk
HarmonyOS6半年磨一剑 - RcIcon组件实战案例集与应用开发指南

HarmonyOS6半年磨一剑 - RcIcon组件实战案例集与应用开发指南

文章目录 * 前言 * 项目简介 * 核心特性 * 开源计划 * rchoui官网 * 文档概述 * 第一章: 基础用法实战 * 1.1 三种符号引用方式 * 1.2 应用场景 - 工具栏快速导航 * 第二章: 尺寸系统实战 * 2.1 响应式尺寸配置 * 2.2 应用场景 - 统一设计系统尺寸规范 * 第三章: 颜色系统实战 * 3.1 多彩色系配置 * 3.2 应用场景 - 状态指示系统 * 第四章: 双风格系统实战 * 4.1 线型与实底风格对比 * 4.2 应用场景 - 底部导航栏 * 第五章: 圆角系统实战 * 5.

By Ne0inhk
Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构

欢迎加入开源鸿蒙跨平台社区:https://openharmonycrossplatform.ZEEKLOG.net Flutter 组件 short_uuids 适配鸿蒙 HarmonyOS 实战:唯一标识微缩技术,构建高性能短 ID 生成与分布式索引架构 前言 在鸿蒙(OpenHarmony)生态迈向万物互联、涉及海量离线资源标识、蓝牙广播载荷(BLE Payload)及二维码数据极限压缩的背景下,如何生成既能保留 UUID 强随机性、又能极大缩减字符长度的唯一标识符,已成为优化存储与通讯效率的“空间必修课”。在鸿蒙设备这类强调分布式软总线传输与每一字节功耗敏感的环境下,如果应用依然直接传输长度达 36 字符的标准 UUID,由于由于有效载荷溢出,极易由于由于传输协议限制导致数据截断或多次分包带来的延迟。 我们需要一种能够实现高进制转换、支持双向编解码且具备低碰撞概率的短 ID 生成方案。 short_uuids 为 Flutter 开发者引入了将标准 UUID 转化为短格式字符串的高性能算法。它利用

By Ne0inhk