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

news2024/11/15 10:00:47

  每周跟踪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的回应看起来不错。

试试看,玩得开心!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1575452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux中安装nacos

Linux中安装nacos 一、前言二、准备1、下载2、上传到服务器3、解压 三、配置1、备份配置文件2、导入sql3、修改前4、修改后 四、使用1、启动2、关闭 一、前言 最近国外的docker似乎是出什么问题,试过很多手段都拉不下 nacos 镜像,就打算在服务器装一下 …

二. CUDA编程入门-双线性插值计算

目录 前言0. 简述1. 执行一下我们的第十个CUDA程序2. Bilinear interpolation3. 代码分析总结参考 前言 自动驾驶之心推出的 《CUDA与TensorRT部署实战课程》,链接。记录下个人学习笔记,仅供自己参考 Note:关于 CUDA 加速双线程插值的内容博主…

golang slice总结

目录 概述 一、什么是slice 二、slice的声明 三、slice的初始化、创建 make方式创建 创建一个包含指定长度的切片 创建一个指定长度和容量的切片 创建一个空切片 创建一个长度和容量都为 0 的切片 new方式创建 短声明初始化切片 通过一个数组来创建切片 声明一个 …

Coursera上托福专项课程01:TOEFL Reading and Listening Sections Skills Mastery 学习笔记

TOEFL Reading and Listening Sections Skills Mastery Course Certificate 本文是学习 https://www.coursera.org/learn/toefl-reading-listening-sections-skills-mastery 这门课的笔记,如有侵权,请联系删除。 文章目录 TOEFL Reading and Listening …

【微服务】面试题(一)

最近进行了一些面试,这几个问题分享给大家 一、分别介绍一下微服务、分布式以及两者的区别 微服务(Microservices)和分布式系统(Distributed Systems)是两种不同的软件架构风格,虽然它们之间有些重叠&#…

SV学习笔记(五)

文章目录 线程的使用程序和模块什么是线程线程的概念澄清 线程的控制fork并行线程语句块fork…joinfork…join_any等待所有衍生线程停止单个线程停止多个线程停止被多次调用的任务 线程的通信写在前面event事件通知的需求semaphore旗语mailbox信箱三种通信的比较和应用 参考资料…

探索数据结构:特殊的双向队列

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:数据结构与算法 贝蒂的主页:Betty’s blog 1. 双向队列的定义 **双向队列(double‑ended queue)**是一种特殊的队列…

[羊城杯 2020]Easyphp2 ---不会编程的崽

摆烂一周了,继续更!!题目还是简单哦。 提示明显要我们修改数据包,第一反应是修改referer。试了一下不太对。url很可能存在文件包含 使用伪协议读取一下源码吧。它过滤了base64关键字。尝试url编码绕过,这里可以使用二…

实景三维技术在推进城市全域数字化转型的作用

4月2日,国家数据局发布《深化智慧城市发展推进城市全域数字化转型的指导意见(征求意见稿)》(下称:《指导意见》),向社会公开征求意见。 《指导意见》作为推进城市数字化转型的重要文件&#xf…

11、子串-滑动窗口最大值

题解: 双端队列是一种特殊的队列,允许你在队列的两端进行插入和删除操作。在滑动窗口问题中,我们使用它来存储可能是当前窗口最大值的元素的索引。 维护队列的顺序: 当新元素进入窗口时,我们将它与队列尾部的元素进…

echarts 毕节区县地图 包含百管委、高新区 (手扣)

百度网盘 链接:https://pan.baidu.com/s/14yiReP8HT_bNCGMOBajexg 提取码:isqi

MQ简介和面试题

一,什么是MQ MQ全称是Mwessage Queue(消息队列),是在消息传输过程中保存消息的容器,多用于分布式系统之间进行通信,解耦和低耦合性 二,常见的MQ产品 RebbitMQ,RocketMQ, ActiveMQ, Kafka, ZeroMQ, MetaMQ 其中我们…

(学习日记)2024.04.06:UCOSIII第三十四节:互斥量函数接口讲解

写在前面: 由于时间的不足与学习的碎片化,写博客变得有些奢侈。 但是对于记录学习(忘了以后能快速复习)的渴望一天天变得强烈。 既然如此 不如以天为单位,以时间为顺序,仅仅将博客当做一个知识学习的目录&a…

STM32CubeMX+MDK通过I2S接口进行音频输入输出(全双工读写一个DMA回调)

一、前言 目前有一个关于通过STM32F411CEUx的I2S总线接口控制SSS1700芯片进行音频输入输出的研究。 SSS1700 是具有片上振荡器的 3S 高度集成的USB音频控制器芯片 。 SSS1700 功能支持96 KHz 24 位采样率,带外部音频编解码器(24 位/96KHz I2S 输入和输出…

工具推荐-针对Nacos利器-NacosExploitGUI_v4.0

Nacos是由阿里所开发的一个更易于构建云原生应用的动态服务发现、配置管理和服务管理平台。 工具简介 集成Nacos的各种poc Nacos控制台默认口令漏洞(nacos,nacos)Nacostoken.secret.key默认配置(QVD-2023-6271)Nacos-clientYaml反序列化漏洞Nacos Jraft Hessian反序列化漏洞…

【Hadoop技术框架-MapReduce和Yarn的详细描述和部署】

前言: 💞💞大家好,我是书生♡,今天的内容主要是Hadoop的后两个组件:MapReduce和yarn的相关内容。同时还有Hadoop的完整流程。希望对大家有所帮助。感谢大家关注点赞。 💞💞前路漫漫&…

使用GDAL进行简单的坐标系转换

使用GDAL进行简单的坐标系转换 使用python GDAL进行简单的坐标系转换,暂时不考虑不同基准坐标系转换的精度问题。 安装环境 使用UbuntuAnaconda python 环境 conda install gdal 定义坐标系 from osgeo import gdal from osgeo import osrsrs_wgs84 osr.Spati…

ICP配准算法

配准算法 问题定义ICP(point to point)算法思想步骤分解point to point和point to plane的区别ICP配准算法的标准流程NDT 本篇将介绍配准算法,将介绍ICP(point to point)、ICP(point to plane)和NDT算法。其中ICP有两种,point to point表示通过构建点与点…

力扣347. 前 K 个高频元素

思路:记录元素出现的次数用map; 要维护前k个元素,不至于把所有元素都排序再取前k个,而是新建一个堆,用小根堆存放前k个最大的数。 为什么是小根堆?因为堆每次出数据时只出堆顶,每次把当前最小的…

文旅元宇宙|“元宇宙+”全面赋能智慧文旅场景建设

元宇宙作为下一代互联网入口,正在潜移默化的改变着人生的生活方式,不断催生新业态,带给人们前所未有的体验。元宇宙概念的崛起,正以其独特的魅力,引领着一场全新的智慧文旅革命。元宇宙,这个融合了虚拟现实…