基于LlamaIndex的查询管道如何实现复杂数据工作流

概述

LlamaIndex 提供了一种声明式查询 API ,允许您将不同的模块链接在一起,以便在您的数据上协调简单到复杂的工作流。本文将详细介绍如何使用 LlamaIndex 的 QueryPipeline 抽象,通过实际的代码示例展示其功能,包括提示链、检索、重新排序和响应合成等。

安装与设置

在开始之前,我们需要安装必要的依赖,并进行初始化设置。以下是安装过程:

%pip install llama-index-embeddings-openai
%pip install llama-index-postprocessor-cohere-rerank
%pip install llama-index-llms-openai

接着,我们进行一些基本的设置:

import os
from llama_index.core import (
    StorageContext,
    VectorStoreIndex,
    load_index_from_storage,
)
from llama_index.core import PromptTemplate, QueryPipeline
from llama_index.llms.openai import OpenAI

# 设置 OpenAI LLM 模型
Settings.llm = OpenAI(model="gpt-3.5-turbo")
Settings.embed_model = OpenAIEmbedding(model="text-embedding-3-small")

# 读取数据
from llama_index.core import SimpleDirectoryReader
reader = SimpleDirectoryReader("../data/paul_graham")
docs = reader.load_data()

if not os.path.exists("storage"):
    index = VectorStoreIndex.from_documents(docs)
    # 保存索引到磁盘
    index.set_index_id("vector_index")
    index.storage_context.persist("./storage")
else:
    # 重建存储上下文并加载索引
    storage_context = StorageContext.from_defaults(persist_dir="storage")
    index = load_index_from_storage(storage_context, index_id="vector_index")

示例:组合提示和LLM

我们将展示如何将提示和LLM串联起来,并生成相关电影的列表。

# 定义提示和LLM
prompt_str = "Please generate related movies to {movie_name}"
prompt_tmpl = PromptTemplate(prompt_str)
llm = OpenAI(model="gpt-3.5-turbo")

# 创建查询管道
p = QueryPipeline(chain=[prompt_tmpl, llm], verbose=True)

# 运行查询管道
output = p.run(movie_name="The Departed")

print(str(output))

上述代码将输出与电影《无间道风云》相关的电影列表。

高级用法:完整的RAG查询管道

这里我们将展示如何创建一个完整的RAG(Retrieve and Generate)查询管道,包括查询重写、检索、重新排序和响应合成。

from llama_index.postprocessor.cohere_rerank import CohereRerank
from llama_index.core.response_synthesizers import TreeSummarize

# 定义模块
prompt_str = "Please generate a question about Paul Graham's life regarding the following topic {topic}"
prompt_tmpl = PromptTemplate(prompt_str)
llm = OpenAI(model="gpt-3.5-turbo")
retriever = index.as_retriever(similarity_top_k=3)
reranker = CohereRerank()
summarizer = TreeSummarize(llm=llm)

# 定义查询管道
p = QueryPipeline(verbose=True)
p.add_modules(
    {
        "llm": llm,
        "prompt_tmpl": prompt_tmpl,
        "retriever": retriever,
        "summarizer": summarizer,
        "reranker": reranker,
    }
)

# 添加模块链接
p.add_link("prompt_tmpl", "llm")
p.add_link("llm", "retriever")
p.add_link("retriever", "reranker", dest_key="nodes")
p.add_link("llm", "reranker", dest_key="query_str")
p.add_link("reranker", "summarizer", dest_key="nodes")
p.add_link("llm", "summarizer", dest_key="query_str")

# 运行管道
response = p.run(topic="YC")
print(str(response))

上述代码将完成一个复杂的查询任务,生成问题、检索相关文档、重新排序以及生成最终的响应。

可能遇到的错误

  1. 模型未找到:确保在设置阶段正确配置了 OpenAI 模型。
  2. 模块链错误:检查模块链接之间的输入输出是否匹配。
  3. 数据读取错误:确保数据路径和文件名正确。

参考资料

如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值