大模型技术教程 | 使用 Llama3 和 Ollama 改进了 RAG

◆介绍:

在本文中,我们将创建一个高级 RAG,它将根据作为管道输入给出的研究论文来回答用户查询。用于构建该管道的技术堆栈如下。

  • Ollama 嵌入模型 mxbai-embed-large
  • Ollama 量化Llama-3 8b 模型
  • 本地托管的 Qdrant 向量数据库。

通过这种设置,明显的两件事是所产生的成本绝对为 0,并且信息高度安全和私密。

◆HyDE 是什么?

HyDE(即假设文档嵌入)源自Gau 等人在 2022 年论文中提出的创新工作。标题为“无需相关标签的精确零射击密集检索”。这项研究的主要目标是增强依赖于语义嵌入相似性的零样本密集检索。所提出的解决方案 HyDE 通过两步方法运行。

在初始步骤(称为“步骤 1”)中,语言模型(具体以 GPT-3 为例)通过指令提示引导,根据原始查询生成假设文档。这一过程是针对论文中提出的问题精心定制的,尽管文件具有假设性,但仍确保了相关性。

转到步骤 2,生成的假设文档通过利用 Contriever(其特征为“无监督对比编码器”)转换为嵌入向量。该编码器有助于将假设文档转换为向量表示,然后将其用于后续的相似性搜索和检索任务。

HyDE 的基本功能是通过两个关键组件将文档转换为向量嵌入。第一个方面涉及使用语言模型的生成任务,旨在即使在假设的文档中也能捕获相关性,并承认事实不准确的可能性。随后,由对比编码器管理的文档-文档相似性任务完善了嵌入过程,过滤掉无关的细节并提高了效率。

值得注意的是,HyDE 超越了现有的无监督密集检索器(例如 Contriever)的性能。此外,它在不同任务和语言中表现出与微调检索器相当的性能。这种方法将密集检索压缩为两个连贯的任务,标志着基于语义嵌入的检索方法的显着进步。

◆实现:

代码语言:javascript

复制



from llama_index.core import (
    SimpleDirectoryReader,
    VectorStoreIndex,
    StorageContext,
    Settings,
    get_response_synthesizer)
from llama_index.core.query_engine import RetrieverQueryEngine, TransformQueryEngine
from llama_index.core.node_parser import SentenceSplitter
from llama_index.core.schema import TextNode, MetadataMode
from llama_index.vector_stores.qdrant import QdrantVectorStore
from llama_index.embeddings.ollama import OllamaEmbedding
from llama_index.llms.ollama import Ollama
from llama_index.core.retrievers import VectorIndexRetriever
from llama_index.core.indices.query.query_transform import HyDEQueryTransform
import qdrant_client
import logging

初始化:

代码语言:javascript

复制

logging.basicConfig(level=logging.INFO)
logger = logging.getLogger(__name__)


# load the local data directory and chunk the data for further processing
docs = SimpleDirectoryReader(input_dir="data", required_exts=[".pdf"]).load_data(show_progress=True)
text_parser = SentenceSplitter(chunk_size=512, chunk_overlap=100)


text_chunks = []
doc_ids = []
nodes = []

创建向量存储以推送嵌入。

代码语言:javascript

复制

# Create a local Qdrant vector store
logger.info("initializing the vector store related objects")
client = qdrant_client.QdrantClient(host="localhost", port=6333)
vector_store = QdrantVectorStore(client=client, collection_name="research_papers")

本地嵌入和 LLM 模型

代码语言:javascript

复制

# local vector embeddings model
logger.info("initializing the OllamaEmbedding")
embed_model = OllamaEmbedding(model_name='mxbai-embed-large', base_url='<http://localhost:11434>')
logger.info("initializing the global settings")
Settings.embed_model = embed_model
Settings.llm = Ollama(model="llama3", base_url='<http://localhost:11434>')
Settings.transformations = [text_parser]

创建节点、向量存储、HyDE 转换器,最后进行查询

代码语言:javascript

复制

logger.info("enumerating docs")
for doc_idx, doc in enumerate(docs):
    curr_text_chunks = text_parser.split_text(doc.text)
    text_chunks.extend(curr_text_chunks)
    doc_ids.extend([doc_idx] * len(curr_text_chunks))


logger.info("enumerating text_chunks")
for idx, text_chunk in enumerate(text_chunks):
    node = TextNode(text=text_chunk)
    src_doc = docs[doc_ids[idx]]
    node.metadata = src_doc.metadata
    nodes.append(node)


logger.info("enumerating nodes")
for node in nodes:
    node_embedding = embed_model.get_text_embedding(
        node.get_content(metadata_mode=MetadataMode.ALL)
    )
    node.embedding = node_embedding


logger.info("initializing the storage context")
storage_context = StorageContext.from_defaults(vector_store=vector_store)
logger.info("indexing the nodes in VectorStoreIndex")
index = VectorStoreIndex(
    nodes=nodes,
    storage_context=storage_context,
    transformations=Settings.transformations,
)


logger.info("initializing the VectorIndexRetriever with top_k as 5")
vector_retriever = VectorIndexRetriever(index=index, similarity_top_k=5)
response_synthesizer = get_response_synthesizer()
logger.info("creating the RetrieverQueryEngine instance")
vector_query_engine = RetrieverQueryEngine(
    retriever=vector_retriever,
    response_synthesizer=response_synthesizer,
)
logger.info("creating the HyDEQueryTransform instance")
hyde = HyDEQueryTransform(include_original=True)
hyde_query_engine = TransformQueryEngine(vector_query_engine, hyde)


logger.info("retrieving the response to the query")
response = hyde_query_engine.query(
    str_or_query_bundle="what are all the data sets used in the experiment and told in the paper")
print(response)


client.close()

上面的代码首先配置 INFO 级别消息的日志记录,以便可以在输出中看到每个日志,然后继续从本地目录加载 PDF 数据,将其拆分为文本块。它建立了一个 Qdrant 向量存储来存储研究论文嵌入,并初始化 Ollama 文本嵌入模型以从文本生成嵌入。配置全局设置,处理文本块并将其与文档 ID 关联。文本节点是从块创建的,保留元数据,并使用 Ollama 模型为这些节点生成嵌入。然后,该脚本设置一个存储上下文,用于对 Qdrant 向量存储中的文本嵌入进行索引,并继续对它们进行索引。向量检索器被配置为检索相似的嵌入,并且查询引擎被初始化以处理查询。HyDE 查询转换是为了增强查询处理而设置的。最后,执行查询以检索有关论文实验中提到的数据集的信息,并打印响应。

输出:

在这里插入图片描述

◆结论:

总之,通过利用 Meta 的大型语言模型等尖端技术的力量Llama-3,以及 等复杂的方法HyDE,并利用 的功能Ollama,我们准备构建无与伦比的 RAG 管道。通过对top_k、chunk_size、 和等关键超参数进行细致的微调chunk_overlap,我们可以将准确性和有效性提升到新的高度。先进工具和细致优化的融合有望释放我们系统的全部潜力,为突破性进步铺平道路,并确保我们的解决方案站在创新和卓越的前沿,并具有最大的隐私和安全性。

如何学习AI大模型?

作为一名热心肠的互联网老兵,我决定把宝贵的AI知识分享给大家。 至于能学习到多少就看你的学习毅力和能力了 。我已将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。

这份完整版的大模型 AI 学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费

一、全套AGI大模型学习路线

AI大模型时代的学习之旅:从基础到前沿,掌握人工智能的核心技能!

img

二、640套AI大模型报告合集

这套包含640份报告的合集,涵盖了AI大模型的理论研究、技术实现、行业应用等多个方面。无论您是科研人员、工程师,还是对AI大模型感兴趣的爱好者,这套报告合集都将为您提供宝贵的信息和启示。

img

三、AI大模型经典PDF籍

随着人工智能技术的飞速发展,AI大模型已经成为了当今科技领域的一大热点。这些大型预训练模型,如GPT-3、BERT、XLNet等,以其强大的语言理解和生成能力,正在改变我们对人工智能的认识。 那以下这些PDF籍就是非常不错的学习资源。

img

四、AI大模型商业化落地方案

img

作为普通人,入局大模型时代需要持续学习和实践,不断提高自己的技能和认知水平,同时也需要有责任感和伦理意识,为人工智能的健康发展贡献力量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值