Activeloop Deep Memory: 提升RAG系统的检索准确性

在AI领域,Retrieval-Augmented Generation (RAG) 已经成为主流技术之一。随着高级RAG技术和智能代理的不断出现,它们拓展了RAG的应用潜力。然而,在生产环境中集成RAG却面临一些挑战,其中最重要的是提高检索准确性、控制成本和降低延迟。Activeloop带来的Deep Memory功能为Deep Lake用户提供了一种解决方案,通过简单的神经网络层来提高检索的准确性,同时保持较低的成本。

1. 技术背景介绍

在基本应用场景中,使用OpenAI的Ada模型结合简单的相似度搜索即可产生满意的效果。然而,为了达到更高的检索准确性或召回率,可能需要采用复杂的检索技术,这通常会增加延迟和成本。Activeloop的Deep Memory通过小型神经网络层对用户查询进行训练,与相关的语料库数据匹配,能够将检索准确性提高到27%,并且对检索速度影响很小,使用简单。

2. 核心原理解析

Deep Memory的核心在于通过训练一个神经网络模型来映射用户的查询与数据集中的相关数据,提升检索的精度。这种模型可以看作是一个高级的语料库匹配器,它能够有效地筛选出最相关的文档,并通过少量的计算资源来提升整体检索的性能。

3. 代码实现演示

以下是一个使用Deep Memory来增强RAG系统检索准确性的完整代码示例:

# 安装必要的库
%pip install --upgrade --quiet tiktoken langchain-openai python-dotenv datasets langchain deeplake beautifulsoup4 html2text ragas

import getpass
import os
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import DeepLake
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain.chains.openai_functions import create_structured_output_chain
from pydantic import BaseModel, Field
import random
from tqdm import tqdm

# 配置API密钥
os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API token: ")
os.environ["ACTIVELOOP_TOKEN"] = getpass.getpass("Enter your ActiveLoop API token: ")

ORG_ID = "your-org-id"
openai_embeddings = OpenAIEmbeddings()

# 创建DeepLake数据集
db = DeepLake(
    dataset_path=f"hub://{ORG_ID}/deeplake-docs-deepmemory",
    embedding=openai_embeddings,
    runtime={"tensor_db": True},
    token=os.getenv("ACTIVELOOP_TOKEN"),
    read_only=False,
)

# 解析DeepLake文档并加载数据
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup

base_url = "https://docs.deeplake.ai/en/latest/"
response = requests.get(base_url)
soup = BeautifulSoup(response.content, "html.parser")
links = [urljoin(base_url, a["href"]) for a in soup.find_all("a", href=True) if a["href"]]

from langchain_community.document_loaders.async_html import AsyncHtmlLoader
loader = AsyncHtmlLoader(links)
docs = loader.load()

from langchain_community.document_transformers import Html2TextTransformer
html2text = Html2TextTransformer()
docs_transformed = html2text.transform_documents(docs)

from langchain_text_splitters import RecursiveCharacterTextSplitter
chunk_size = 4096
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size)
docs_new = []

for doc in docs_transformed:
    if len(doc.page_content) < chunk_size:
        docs_new.append(doc)
    else:
        docs_new.extend(text_splitter.create_documents([doc.page_content]))

db.add_documents(docs_new)

# 生成合成查询并训练Deep Memory
questions, relevances = generate_queries(
    docs=db.vectorstore.dataset.text.data(fetch_chunks=True, aslist=True)["value"],
    ids=db.vectorstore.dataset.id.data(fetch_chunks=True, aslist=True)["value"],
    n=200
)

train_questions, train_relevances = questions[:100], relevances[:100]
test_questions, test_relevances = questions[100:], relevances[100:]

job_id = db.vectorstore.deep_memory.train(
    queries=train_questions,
    relevance=train_relevances,
)

recall = db.vectorstore.deep_memory.evaluate(
    queries=test_questions,
    relevance=test_relevances,
)

print("Deep Memory evaluation complete!")

4. 应用场景分析

Deep Memory适用于需要高检索准确性的应用场景,例如需要迅速找到相关法律文本或技术文档的环境。在这些情况下,能够迅速而准确地检索相关信息对于节省时间和提高工作效率至关重要。

5. 实践建议

建议在使用Deep Memory时,首先评估应用场景的需求和资源约束,以便调整模型的复杂度和检索策略。对于大规模应用场景,可以结合LangChain中的其他工具进一步优化查询和数据处理流程。

如果遇到问题欢迎在评论区交流。

—END—

上一篇: SurrealDB:现代应用的终极数据库解决方案
下一篇: 使用ElasticSearch和BM25进行高效文档检索
scaFHIO
博客等级 码龄2年 815粉丝 · 237原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值