亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定

改進的RAG與Llama3和Ollama

在本文中,我们将介绍如何使用完全本地的基础设施实现高级RAG,利用Meta昨天发布的最先进的开源大型语言模型Llama-3。本文将作为一个实用指南,用于第一天实现使用Llama-3的高级RAG。

由作者 M K Pavan Kumar 创建。

介绍:

在本文中,我们将创建一个高级的RAG,它将根据输入到管道中的研究论文来回答用户的问题。构建此管道所使用的技术栈如下所示。

  1. Ollama Embedding 模型mxbai-embed-large
  2. Ollama 量化 Llama-3 8b 模型
  3. 本地托管的 Qdrant 矢量数据库。

通过这种设置,可以明显看出两点:一是产生的成本为绝对0,二是信息高度安全和私密。

什么是HyDE?

HyDE,即假设文档嵌入,源自高伟等人在2022年发表的题为“无需相关标签的精确零样本密集检索”论文的创新工作。这项研究的主要目标是提升零样本密集检索的性能,该检索依赖于语义嵌入相似性。提出的解决方案HyDE通过两步方法来实现。

来自 HyDE 原始论文中的内容,

在初始步骤,称为步骤1中,一个语言模型——具体来说就是GPT-3——通过指令提示来生成一个基于原始查询的假设文档。这个过程是根据论文中的一个问题精心设计的,确保文档的相关性,尽管它是假设性的。

移动到步骤2,生成的假设文档通过使用Contriever转换为嵌入向量,Contriever被描述为一个“无监督对比编码器”。这个编码器将假设文档转换为向量表示,然后用于后续的相似性搜索和检索任务。

HyDE 的基本功能是通过两个关键组件将文档转换为向量嵌入。第一个方面涉及使用语言模型进行生成任务,旨在捕获即使是假设文档中的相关性,同时承认可能存在事实不准确的情况。随后,通过对比编码器管理的文档与文档之间的相似性任务,优化嵌入过程,过滤掉多余的细节并提高效率。

值得注意的是,HyDE 的表现超过了现有的无监督密集检索器,如 Contriever。此外,它在各种任务和语言上表现出与经过微调的检索器相当的性能。这种方法将密集检索简化为两个连贯的任务,标志着基于语义嵌入的检索方法的一个显著进步。

实现:
    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

初始化:

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

    # 加载本地数据目录并将数据分块以供进一步处理  
    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 = []

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

    # 创建本地 Qdrant 向量存储  
    logger.info("初始化与向量存储相关的对象")  
    client = qdrant_client.QdrantClient(host="localhost", port=6333)  
    vector_store = QdrantVectorStore(client=client, collection_name="research_papers")

本地嵌入和LLM模型

    # 本地向量嵌入模型  
    logger.info("初始化 OllamaEmbedding")  
    embed_model = OllamaEmbedding(model_name='mxbai-embed-large', base_url='http://localhost:11434')  
    logger.info("初始化全局设置")  
    Settings.embed_model = embed_model  
    Settings.llm = Ollama(model="llama3", base_url='http://localhost:11434')  
    Settings.transformations = [text_parser]

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

    logger.info("枚举文档")  
    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("枚举文本片段")  
    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("枚举节点")  
    for node in nodes:  
        node_embedding = embed_model.get_text_embedding(  
            node.get_content(metadata_mode=MetadataMode.ALL)  
        )  
        node.embedding = node_embedding  

    logger.info("初始化存储上下文")  
    storage_context = StorageContext.from_defaults(vector_store=vector_store)  
    logger.info("在 VectorStoreIndex 中索引节点")  
    index = VectorStoreIndex(  
        nodes=nodes,  
        storage_context=storage_context,  
        transformations=Settings.transformations,  
    )  

    logger.info("使用 top_k 为 5 初始化 VectorIndexRetriever")  
    vector_retriever = VectorIndexRetriever(index=index, similarity_top_k=5)  
    response_synthesizer = get_response_synthesizer()  
    logger.info("创建 RetrieverQueryEngine 实例")  
    vector_query_engine = RetrieverQueryEngine(  
        retriever=vector_retriever,  
        response_synthesizer=response_synthesizer,  
    )  
    logger.info("创建 HyDEQueryTransform 实例")  
    hyde = HyDEQueryTransform(include_original=True)  
    hyde_query_engine = TransformQueryEngine(vector_query_engine, hyde)  

    logger.info("检索查询响应")  
    response = hyde_query_engine.query(  
        str_or_query_bundle="实验中使用的所有数据集和论文中提到的数据集有哪些")  
    print(response)  

    client.close()

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

输出:

代码输出显示论文中讨论的数据集。

结论:

总之,通过利用诸如Meta的Llama-3大型语言模型、HyDE等高级技术方法,以及借助Ollama的强大功能,我们准备构建无与伦比的RAG管道。通过仔细调整关键超参数,如top_kchunk_sizechunk_overlap,我们可以达到新的准确性和效率高度。这种高级工具和精细优化的结合,有望充分发挥我们系统的全部潜力,为开创性进展铺平道路,并确保我们的解决方案在创新和卓越方面处于领先地位,同时保证最高的隐私和安全。

點擊查看更多內容
TA 點贊

若覺得本文不錯,就分享一下吧!

評論

作者其他優質文章

正在加載中
  • 推薦
  • 評論
  • 收藏
  • 共同學習,寫下你的評論
感謝您的支持,我會繼續努力的~
掃碼打賞,你說多少就多少
贊賞金額會直接到老師賬戶
支付方式
打開微信掃一掃,即可進行掃碼打賞哦
今天注冊有機會得

100積分直接送

付費專欄免費學

大額優惠券免費領

立即參與 放棄機會
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號

舉報

0/150
提交
取消