引言
近年来,随着大型语言模型(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资源获取更多信息。
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---