引言
随着大语言模型(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功能,帮助开发人员在生产环境中实现更高效的检索生成系统。
进一步学习资源:
参考资料
如果这篇文章对你有帮助,欢迎点赞并关注我的博客。您的支持是我持续创作的动力!
---END---