探索 Activeloop Deep Memory:提升检索生成系统的精度

71 阅读3分钟

引言

随着大语言模型(LLM)应用的增加,检索生成(RAG)技术逐渐受到关注。RAG通过结合检索和生成技术,可以提供更加准确和相关的响应。然而,将RAG应用于生产环境中时,面临的主要挑战包括准确性(召回率)、成本和延迟。Activeloop的Deep Memory工具为Deep Lake用户提供了一种优化向量存储的解决方案,能够有效提升检索精度,同时保证经济可行性和使用的简便性。

在本文中,我们将探索如何利用Activeloop Deep Memory构建一个RAG系统,并解析相关文档以回答特定问题。

主要内容

1. 数据集创建

首先,我们需要从Activeloop的文档中解析数据集。这可以借助BeautifulSoup库和LangChain的文档解析器来实现,例如Html2TextTransformer和AsyncHtmlLoader。

%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: ")

token = os.getenv("ACTIVELOOP_TOKEN")
openai_embeddings = OpenAIEmbeddings()

db = DeepLake(
    dataset_path="hub://ORG_ID/deeplake-docs-deepmemory",  # ORG_ID替换为你的用户名或组织名
    embedding=openai_embeddings,
    runtime={"tensor_db": True},
    token=token,
    read_only=False,
)

2. 生成深度记忆模型训练数据

利用LLM生成合成查询并训练deep_memory模型。该模型将用户的查询与已有的数据集对齐,提升检索精度。

from langchain.chains.openai_functions import create_structured_output_chain
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field

class Questions(BaseModel):
    question: str = Field(..., description="Questions about text")

llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)

prompt = ...  # 定义生成问题的Prompt
chain = create_structured_output_chain(Questions, llm, prompt, verbose=True)

def generate_queries(docs, ids, n=100):
    ...
    # 使用LLM生成查询并关联相关性

train_questions, train_relevances = ..., ...

3. 模型性能评估

训练好的deep_memory模型可以使用其内置的评估方法进行性能评估。通过RAGas,我们能够进一步提高检索精度。

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

print(recall)

代码示例

以下是一个完整的代码示例,展示如何使用Activeloop Deep Memory构建和评估RAG系统:

# 使用BeautifulSoup解析文档链接
from urllib.parse import urljoin
import requests
from bs4 import BeautifulSoup

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)

# 加载和转换数据
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)

# 生成并评估模型
# 代码省略...

常见问题和解决方案

1. 延迟增加

解决方法:优化数据分片大小,并使用更高效的查询生成方法。

2. 成本问题

解决方法:通过减少LLM的top_k输入来降低推理成本。

总结和进一步学习资源

Activeloop Deep Memory为提升RAG系统的精度提供了一种创新且有效的解决方案。通过本文,我们探讨了如何集成和评估Deep Memory功能,帮助开发人员在生产环境中实现更高效的检索生成系统。

进一步学习资源:

参考资料

  1. Activeloop Deep Memory
  2. Beautiful Soup Documentation

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

---END---