极客时间: 用 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的回应看起来不错。

试试看,玩得开心!

相关推荐
北京搜维尔科技有限公司15 分钟前
搜维尔科技:【应用】Xsens在荷兰车辆管理局人体工程学评估中的应用
人工智能·安全
说私域19 分钟前
基于开源 AI 智能名片 S2B2C 商城小程序的视频号交易小程序优化研究
人工智能·小程序·零售
YRr YRr19 分钟前
深度学习:Transformer Decoder详解
人工智能·深度学习·transformer
知来者逆24 分钟前
研究大语言模型在心理保健智能顾问的有效性和挑战
人工智能·神经网络·机器学习·语言模型·自然语言处理
云起无垠33 分钟前
技术分享 | 大语言模型赋能软件测试:开启智能软件安全新时代
人工智能·安全·语言模型
老艾的AI世界1 小时前
新一代AI换脸更自然,DeepLiveCam下载介绍(可直播)
图像处理·人工智能·深度学习·神经网络·目标检测·机器学习·ai换脸·视频换脸·直播换脸·图片换脸
翔云API1 小时前
PHP静默活体识别API接口应用场景与集成方案
人工智能
浊酒南街1 小时前
吴恩达深度学习笔记:卷积神经网络(Foundations of Convolutional Neural Networks)4.9-4.10
人工智能·深度学习·神经网络·cnn
Tony聊跨境2 小时前
独立站SEO类型及优化:来检查这些方面你有没有落下
网络·人工智能·tcp/ip·ip
懒惰才能让科技进步2 小时前
从零学习大模型(十二)-----基于梯度的重要性剪枝(Gradient-based Pruning)
人工智能·深度学习·学习·算法·chatgpt·transformer·剪枝