概述
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))
上述代码将完成一个复杂的查询任务,生成问题、检索相关文档、重新排序以及生成最终的响应。
可能遇到的错误
- 模型未找到:确保在设置阶段正确配置了 OpenAI 模型。
- 模块链错误:检查模块链接之间的输入输出是否匹配。
- 数据读取错误:确保数据路径和文件名正确。
参考资料
如果你觉得这篇文章对你有帮助,请点赞,关注我的博客,谢谢!