利用Activeloop Deep Memory优化RAG系统的准确性和成本

70 阅读3分钟

引言

近年来,随着大型语言模型(LLM)的快速发展,基于检索增强生成(Retrieval-Augmented Generation,RAG)的系统逐渐受到关注。RAG将信息检索与生成结合在一起,提供了处理复杂查询的新方法。然而,在将RAG集成到生产环境中时,开发者常面临准确性、成本和延迟等挑战。Activeloop的Deep Memory工具通过引入一个微型神经网络层,帮助用户优化其向量存储,提升检索准确性并保持低成本。本文将介绍如何使用Deep Memory提升RAG系统的性能。

主要内容

1. 数据集创建

我们将使用BeautifulSoup和LangChain解析Activeloop文档,建立一个RAG系统以回答文档中的问题。首先,安装必要的库:

%pip install --upgrade --quiet tiktoken langchain-openai python-dotenv datasets langchain deeplake beautifulsoup4 html2text ragas

确保您已创建Activeloop账户并获取API令牌。

import os
import getpass
from langchain_community.vectorstores import DeepLake
from langchain_openai import ChatOpenAI, OpenAIEmbeddings

os.environ["OPENAI_API_KEY"] = getpass.getpass("Enter your OpenAI API token: ")
os.environ["ACTIVELOOP_TOKEN"] = getpass.getpass("Enter your ActiveLoop API token: ")

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,
)

使用BeautifulSoup抓取所有网页链接:

import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin

def get_all_links(url):
    response = requests.get(url)
    if response.status_code != 200:
        print(f"Failed to retrieve the page: {url}")
        return []

    soup = BeautifulSoup(response.content, "html.parser")
    links = [urljoin(url, a["href"]) for a in soup.find_all("a", href=True) if a["href"]]
    return links

base_url = "https://docs.deeplake.ai/en/latest/"
all_links = get_all_links(base_url)

利用LangChain加载和转换数据为可读格式。

from langchain_community.document_loaders.async_html import AsyncHtmlLoader
from langchain_community.document_transformers import Html2TextTransformer

loader = AsyncHtmlLoader(all_links)
docs = loader.load()

html2text = Html2TextTransformer()
docs_transformed = html2text.transform_documents(docs)

2. 生成合成查询并训练Deep Memory

生成用户查询并训练Deep Memory模型对齐用户查询与数据集。

from typing import List
import random
from langchain_openai import OpenAIEmbeddings
from tqdm import tqdm

def generate_queries(docs: List[str], ids: List[str], n: int = 100):
    questions = []
    relevances = []
    pbar = tqdm(total=n)
    while len(questions) < n:
        r = random.randint(0, len(docs) - 1)
        text, label = docs[r], ids[r]
        generated_qs = [chain.run(input=text).question]
        questions.extend(generated_qs)
        relevances.extend([[(label, 1)] for _ in generated_qs])
        pbar.update(len(generated_qs))
    return questions[:n], relevances[:n]

questions, relevances = generate_queries(docs, ids, n=200)
train_questions, train_relevances = questions[:100], relevances[:100]

训练Deep Memory模型:

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

3. 评估Deep Memory性能

使用Deep Memory的评估方法查看模型在新数据上的表现。

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

4. Deep Memory推理与成本节约

通过减少传递给LLM的top_k项,Deep Memory在提高准确性的同时降低推理成本。

retriever = db.as_retriever()
retriever.search_kwargs["deep_memory"] = True
retriever.search_kwargs["k"] = 10

query = "Deamination of cytidine to uridine on the minus strand of viral DNA results in catastrophic G-to-A mutations in the viral genome."
qa = RetrievalQA.from_chain_type(
    llm=ChatOpenAI(model="gpt-4"), chain_type="stuff", retriever=retriever
)
print(qa.run(query))

常见问题和解决方案

挑战一:数据抓取与解析的复杂性

建议使用强大的库如BeautifulSoup以及LangChain,以确保数据处理的高效和准确。

挑战二:模型训练需求的识别

在训练中引入合成数据以弥补初期用户查询的不足。

总结和进一步学习资源

本文探讨了如何通过Activeloop Deep Memory优化RAG系统的性能。凭借其微型神经网络层,Deep Memory在不增加成本的情况下提升了检索准确性。开发者可以参考Activeloop的官方文档和LangChain资源获取更多信息。

参考资料

  1. Activeloop 官方文档
  2. LangChain 文档

如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!

---END---