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

极客时间: 用 Word2Vec, LangChain, Gemma 模拟全本地检索增强生成(RAG)

  每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领域的领跑者。点击订阅,与未来同行! 订阅:https://rengongzhineng.io/

最近,Apple的研究人员推出了ReALM,紧随Google的Gemma、Meta的Llama以及微软的其他几个产品之后,完全本地运行大型语言模型(LLM)的应用越来越受到关注。我在《宅乐时光:用Gemma在本地玩LangChain 2》中尝试了本地运行Langchain,唯一缺失的是嵌入部分。为了在本地完整模拟RAG,我在以下代码中添加了word2vec嵌入。

import json
import numpy as np
from gensim.models import KeyedVectors
from langchain_community.llms import Ollama 
import logging# 基础日志配置
logging.basicConfig(level=logging.INFO)# 使用预训练的Word2Vec模型计算嵌入
def compute_embeddings(text, embedding_model):words = [word for word in text.split() if word in embedding_model.key_to_index]if words:return np.mean([embedding_model[word] for word in words], axis=0)else:return np.zeros(embedding_model.vector_size)# 加载预训练的Word2Vec嵌入
try:model_path = 'GoogleNews-vectors-negative300.bin'  # 模型下载正确路径embedding_model = KeyedVectors.load_word2vec_format(model_path, binary=True)
except Exception as e:logging.error(f"加载Word2Vec模型失败: {e}")# 从JSON加载数据
try:with open('my_data.json', 'r') as file:data = json.load(file)
except Exception as e:logging.error(f"加载JSON数据错误: {e}")data = []def simulate_rag(data, prompt):matches = []threshold = 0.4  # 余弦相似度示例阈值prompt_embedding = compute_embeddings(prompt, embedding_model)for passage in data:combined_text = f"{passage['title']} {passage['content']}".lower()passage_embedding = compute_embeddings(combined_text, embedding_model)similarity = np.dot(prompt_embedding, passage_embedding) / (np.linalg.norm(prompt_embedding) * np.linalg.norm(passage_embedding))print(f"passage: {passage}")print(f"Similarity: {similarity}")if similarity > threshold:matches.append(passage)return matches[:2]  # 返回前2个检索的段落prompt = "Nedved Yang喜欢吃什么?你能推荐新加坡的哪个地方给他吃吗?"# 从本地数据检索相关段落
retrieved_passages = simulate_rag(data, prompt)
print(f"**检索到的段落:**\n{retrieved_passages}")# 构建LLM提示
llm_prompt = f"用户查询: {prompt}\n\n检索到的信息:\n"
for passage in retrieved_passages:llm_prompt += f"- {passage['title']}:\n  - {passage['content']}\n  - 来源: {passage['source']}\n"print(f"**LLM提示:**\n{llm_prompt}")
llm = Ollama(model="gemma:2b")
llm_response = llm.invoke(llm_prompt)  # 替换您的LLM交互方法
final_response = f"**LLM回应:**\n{llm_response}"# 打印最终回应
print(final_response)

在使用word2vec进行本地嵌入前,您需要从网上下载它,例如从​​​​​​https://github.com/harmanpreet93/load-word2vec-google?tab=readme-ov-file。然后,您可以加载它来计算嵌入。我遇到了一个问题,即`retrieved_passages`返回为空。通过下面的手动测试,我发现根本原因是相似度低于阈值。

# 示例手动测试prompt_embedding = compute_embeddings("Nedved Yang喜欢吃什么?", embedding_model)
example_entry = "Nedved Yang喜欢辛辣和素食菜肴。"
entry_embedding = compute_embeddings(example_entry, embedding_model)
similarity = np.dot(prompt_embedding, entry_embedding) / (np.linalg.norm(prompt_embedding) * np.linalg.norm(entry_embedding))
print(f"Similarity: {similarity}")

在调整阈值后,来自Gemma的回应看起来不错。

试试看,玩得开心!

相关文章:

极客时间: 用 Word2Vec, LangChain, Gemma 模拟全本地检索增强生成(RAG)

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…...

VBA操作Word

检查word中的字体情况 Sub ListAllFontsInDocument()Dim doc As DocumentDim rng As RangeDim char As RangeDim fontName As StringDim uniqueFonts As Collection 初始化集合用于存储唯一字体名称Set uniqueFonts New Collection 获取当前活动文档Set doc ActiveDocument …...

Linux文件IO(4):目录操作和文件属性获取

目录 1. 前言 2. 函数介绍 2.1 访问目录 – opendir 2.2 访问目录 – readdir 2.3 访问目录 – closedir 2.4 修改文件访问权限 – chmod/fchmod 2.5 获取文件属性 – stat/lstat/fstat 2.5.1 文件属性 – struct stat 2.6 文件类型 – st_mode 3. 代码练习 3.1 要求 3.2 代…...

【C语言】_文件类型,结束判定与文件缓冲区

目录 1. 文本文件和二进制文件 2. 文件读取结束的判定 3. 文件缓冲区 1. 文本文件和二进制文件 根据数据的组织形式,数据文件被称为文本文件或二进制文件; 数据在内存中以二进制的形式存储,如果不加转换地输出到外存,就是二进…...

YOLOV8注意力改进方法:DoubleAttention(附代码)

原论文地址:原论文地址 DoubleAttention网络结构的优点在于,它能够有效地捕获图像中不同位置和不同特征的重要性,从而提高了图像识别和分割的性能。 论文相关内容介绍: 论文摘要:学习捕捉远程关系是图像/视频识别的…...

每日一题 --- 前 K 个高频元素[力扣][Go]

前 K 个高频元素 题目:347. 前 K 个高频元素 给你一个整数数组 nums 和一个整数 k ,请你返回其中出现频率前 k 高的元素。你可以按 任意顺序 返回答案。 示例 1: 输入: nums [1,1,1,2,2,3], k 2 输出: [1,2]示例 2: 输入: nums [1], k 1 输出: …...

Rust所有权和Move关键字使用和含义讲解,以及Arc和Mutex使用

Rust 所有权规则 一个值只能被一个变量所拥有,这个变量被称为所有者。 一个值同一时刻只能有一个所有者,也就是说不能有两个变量拥有相同的值。所以对应变量赋值、参数传递、函数返回等行为,旧的所有者会把值的所有权转移给新的所有者&#…...

【YOLOV5 入门】——构建自己的数据集模型训练模型检验

一、准备工作 1、数据收集 图片类型数据不用多说;视频类型数据利用opencv进行抽帧保存为一张张图片,这里选取30s的名侦探柯南片段进行试验,确保环境解释器下安装了opencv(我使用的是另一个虚拟环境): im…...

MacBook 访达使用技巧【mac 入门】

快捷键 打开访达搜索窗口默认快捷键【⌥ ⌘ 空格键】可以在键盘【系统偏好设置 -> 键盘->快捷键->聚焦】修改 但是我不会去修改它,因为我不常用访达的搜索窗口,更多的是想快速打开访达文件夹窗口,可以通过第三方软件定义访达的快…...

常见溯源,反溯源,判断蜜罐手段

常见溯源,反溯源,判断蜜罐手段 1.溯源手段2.反溯源手段3.如何判断蜜罐🍯4.案例:MySQL读文件蜜罐 1.溯源手段 IP地址追踪:通过IP地址追踪可以确定攻击者的地理位置和ISP信息等;通过攻击IP历史解析记录/域名…...

蓝桥杯刷题-09-三国游戏-贪心⭐⭐⭐

蓝桥杯2023年第十四届省赛真题-三国游戏 小蓝正在玩一款游戏。游戏中魏蜀吴三个国家各自拥有一定数量的士兵X, Y, Z (一开始可以认为都为 0 )。游戏有 n 个可能会发生的事件,每个事件之间相互独立且最多只会发生一次,当第 i 个事件发生时会分别让 X, Y,…...

Windows编译运行TensorRT-YOLOv9 (C++)

Windows编译运行yolov9-bytetrack-tensorrt(C) 1 基础环境2 编译yolov9-bytetrack-tensorrt(1)下载yolov9-bytetrack-tensorrt源码(2)修改CMakeLists.txt(3)CMake编译 3 yolov9模型转…...

.NET 设计模式—简单工厂(Simple Factory Pattern)

简介 简单工厂模式(Simple Factory Pattern)属于类的创建型模式,又叫静态工厂方法模式(Static FactoryMethod Pattern),是通过一个工厂类来创建对象,根据不同的参数或条件返回相应的对象实例。这种模式隐藏…...

聊聊Linux内核中内存模型

介绍 在Linux中二进制的程序从磁盘加载到内存,运行起来后用户态是使用pid来唯一标识进程,对于内核都是以task_struct表示。二进制程序中的数据段、代码段、堆都能提现在task_struct中。每一个进程都有自己的虚拟地址空间,虚拟地址空间包含几…...

docker自动化部署示例

前提 安装docker 、 docker-cpmpose、git、打包环境(如meaven、jdk、node等) 原理 git Dockerfile docker-compose 获取源码(代码仓库)获取可运行程序的镜像(docker)将打包后的程序放入镜像内&#xf…...

Redis精品案例解析:Redis实现持久化主要有两种方式

Redis实现持久化主要有两种方式:RDB(Redis DataBase)和AOF(Append Only File)。这两种方式各有优缺点,适用于不同的使用场景。 1. RDB持久化 RDB持久化是通过创建一个二进制的dump文件来保存当前Redis数据…...

Python | Leetcode Python题解之第14题最长公共前缀

题目: 题解: class Solution:def longestCommonPrefix(self, strs: List[str]) -> str:def isCommonPrefix(length):str0, count strs[0][:length], len(strs)return all(strs[i][:length] str0 for i in range(1, count))if not strs:return &quo…...

烧坏两块单片机,不知道原因?

没有看你的原理图,以下是造成烧毁芯片的几个环节: 1. 最大的可能性是你的单片机电机控制输出与电机驱动电路没有隔离。 我的经验,使用STM32控制电机,无论是直流电机脉宽调制,还是步进电机控制,控制电路与…...

SV学习笔记(八)

文章目录 SV入门练习基本数据类型字符串类型数组类型接口的定义与例化类的封装类的继承package的使用随机约束线程的同步线程的控制虚方法方法(任务与函数)SV用于设计 参考资料 SV入门练习 基本数据类型 有符号无符号、四状态双状态、枚举类型、结构体…...

Java反射常用方法

反射 作用: 对于任意一个对象,把对象所有的字段名和值,保存到文件中去利用反射动态的创造对象和运行方法 1. 获取字节码文件对象 方法描述Class.forName(String)通过类的全限定名字符串获取字节码文件对象。类字面量直接使用类的字面量获…...

Hitboxer终极指南:游戏键盘冲突一键解决,操作精度提升300%

Hitboxer终极指南:游戏键盘冲突一键解决,操作精度提升300% 【免费下载链接】socd SOCD cleaner tool for epic gamers 项目地址: https://gitcode.com/gh_mirrors/so/socd 还在为游戏操作中的方向键冲突而烦恼吗?当你在激烈的对战中同…...

iperf3网络性能测试工具完全指南:从安装到企业级应用

iperf3网络性能测试工具完全指南:从安装到企业级应用 【免费下载链接】iperf3-win-builds iperf3 binaries for Windows. Benchmark your network limits. 项目地址: https://gitcode.com/gh_mirrors/ip/iperf3-win-builds 在当今数字化时代,网络…...

揭秘C++多态:动态行为的核心奥秘

C 多态:面向对象的动态行为核心机制多态性是面向对象编程(OOP)的核心概念之一,它允许对象在运行时根据其实际类型表现出不同的行为。在C中,多态性主要通过虚函数(virtual functions)和继承机制实…...

springboot+vue基于web的宠物商城领养网站的设计与实现

目录同行可拿货,招校园代理 ,本人源头供货商功能模块分析技术实现要点特色功能扩展安全与性能项目技术支持源码获取详细视频演示 :文章底部获取博主联系方式!同行可合作同行可拿货,招校园代理 ,本人源头供货商 功能模块分析 用户模块 注册与登录&#…...

Qt Network 模块中的 TCP/IP 网络编程详解

Qt 是一个功能强大的跨平台 C 框架,其 Qt Network 模块为应用程序提供了丰富的网络通信能力,极大地简化了网络编程的复杂性。在众多网络协议中,TCP/IP 协议栈是互联网通信的基础,Qt Network 提供了 QTcpSocket 和 QTcpServer 等类…...

Kettle转换里‘阻塞数据’控件为啥不灵?我用这个真实ETL案例给你讲透

Kettle转换中‘阻塞数据’控件的实战解析:从失效到精准控制 在ETL工具Kettle的实际应用中,数据流的精确控制往往是决定任务成败的关键。许多中高级用户在使用"阻塞数据直到步骤都完成"控件时,都曾遇到过看似配置正确却无法生效的困…...

IDEA插件开发:集成Nunchaku-flux-1-dev实现代码注释自动图解

IDEA插件开发:集成Nunchaku-flux-1-dev实现代码注释自动图解 1. 引言 作为一名Java开发者,你是否曾经面对过这样的困境:接手一个复杂的遗留系统,代码量庞大但注释稀少,逻辑关系错综复杂,光是理解代码执行…...

告别天价桥接芯片!用高云GW5AT-LV15MG132 FPGA搞定MIPI C-PHY摄像头测试盒

国产FPGA革新摄像头测试方案:高云GW5AT-LV15MG132的MIPI C-PHY实战解析 在摄像头模组生产线上,测试环节的成本与效率直接关系到企业竞争力。传统测试方案依赖进口FPGA搭配昂贵桥接芯片,不仅物料清单(BOM)成本居高不下…...

C#处理复杂JSON数据:Newtonsoft.Json多级嵌套反序列化实战(附避坑指南)

C#处理复杂JSON数据:Newtonsoft.Json多级嵌套反序列化实战(附避坑指南) 在当今数据驱动的开发环境中,JSON已成为事实上的数据交换标准。特别是对于C#开发者而言,处理来自API响应、配置文件或NoSQL数据库的复杂JSON结构…...

YOLO12入门必看:从上传图片到JSON结果输出完整操作流程

YOLO12入门必看:从上传图片到JSON结果输出完整操作流程 1. 引言:为什么你需要了解YOLO12? 如果你正在寻找一个既快又准的目标检测工具,那么YOLO12的出现,可能就是你一直在等的那个答案。 想象一下这样的场景&#x…...