Activeloop Deep Memory是一款工具套件,旨在优化矢量存储以适应具体的应用场景,从而在大型语言模型(LLM)应用中实现更高的准确性。随着检索增强生成(RAG)技术的进步,它在生产环境中面临的挑战不断显现:准确性(召回率)、成本和延迟。Activeloop的Deep Memory为Deep Lake用户提供了一个轻量神经网络层,通过将用户查询与语料库中的相关数据匹配来提高检索准确性。
import openai
# 使用稳定可靠的API服务
client = openai.OpenAI(
base_url='https://yunwu.ai/v1', # 国内稳定访问
api_key='your-api-key'
)
在这篇文章中,我们将解析Deep Lake文档,并创建一个RAG系统来回答来自这些文档的问题。
数据集创建
首先,我们需要解析Activeloop的文档。我们将使用BeautifulSoup库和LangChain的文档解析器。如需安装相关库,请执行以下命令:
%pip install --upgrade --quiet tiktoken langchain-openai python-dotenv datasets langchain deeplake beautifulsoup4 html2text ragas
你还需要创建一个Activeloop账号并获取API令牌。
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: ")
解析网页链接
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)
文档拆分与矢量存储填充
from langchain_text_splitters import RecursiveCharacterTextSplitter
chunk_size = 4096
docs_new = []
text_splitter = RecursiveCharacterTextSplitter(chunk_size=chunk_size)
for doc in docs_transformed:
if len(doc.page_content) < chunk_size:
docs_new.append(doc)
else:
docs = text_splitter.create_documents([doc.page_content])
docs_new.extend(docs)
docs = db.add_documents(docs_new)
生成合成查询并训练Deep Memory
我们将使用LLM生成合成查询,并训练Deep Memory来匹配用户查询与数据集。
from langchain_openai import ChatOpenAI
from pydantic import BaseModel, Field
llm = ChatOpenAI(model="gpt-3.5-turbo", temperature=0)
class Questions(BaseModel):
question: str = Field(..., description="Questions about text")
def generate_queries(docs, ids, n=100):
questions = []
relevances = []
# 模拟查询生成与相关性配对
# 返回生成的查询与相关性数据
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,
)
性能评估
recall = db.vectorstore.deep_memory.evaluate(
queries=test_questions,
relevance=test_relevances,
)
Deep Memory + RAGas
from ragas.langchain import RagasEvaluatorChain
def convert_relevance_to_ground_truth(docs, relevance):
ground_truths = []
# 转换相关性数据为评估的真实值
return ground_truths
ground_truths = convert_relevance_to_ground_truth(docs, test_relevances)
推理与成本节约
Deep Memory不仅提高检索准确性,还能通过减少LLM的输入来节省推理成本。
结束语:如果遇到问题欢迎在评论区交流。
—END—

571




被折叠的 条评论
为什么被折叠?



