【Agent】【workflow】13.带重排序的RAG工作流 - LlamaIndex Workflow示例分析
案例目标本案例展示了如何使用LlamaIndex Workflow构建一个带重排序功能的RAG检索增强生成系统。该系统通过工作流的方式组织RAG流程包括文档索引、检索、重排序和响应合成四个主要步骤实现了更精确、更高效的信息检索和生成。核心目标构建一个结构化的RAG工作流通过重排序技术提高检索结果的相关性并利用流式响应提供更好的用户体验。技术栈与核心依赖LlamaIndex Workflow- 提供工作流框架和事件驱动架构OpenAI GPT-4o-mini- 用于重排序和响应合成OpenAI Embedding- 用于文档向量化text-embedding-3-small模型VectorStoreIndex- 用于创建和存储文档向量索引LLMRerank- 用于基于LLM的重排序CompactAndRefine- 用于响应合成SimpleDirectoryReader- 用于文档加载OpenInference- 可选用于工作流可观测性环境配置本案例需要配置以下API密钥import os os.environ[OPENAI_API_KEY] sk-proj-...此外需要安装以下依赖pip install -U llama-index pip install openinference-instrumentation-llama-index3.0.0 opentelemetry-proto1.12.0 opentelemetry-exporter-otlp opentelemetry-sdk可选地可以配置Phoenix进行工作流追踪from opentelemetry.sdk import trace as trace_sdk from opentelemetry.sdk.trace.export import SimpleSpanProcessor from opentelemetry.exporter.otlp.proto.http.trace_exporter import OTLPSpanExporter as HTTPSpanExporter from openinference.instrumentation.llama_index import LlamaIndexInstrumentor # 添加Phoenix API密钥进行追踪 PHOENIX_API_KEY YOUR-PHOENIX-API-KEY os.environ[OTEL_EXPORTER_OTLP_HEADERS] fapi_key{PHOENIX_API_KEY} # 添加Phoenix span_phoenix_processor SimpleSpanProcessor( HTTPSpanExporter(endpointhttps://app.phoenix.arize.com/v1/traces) ) # 添加到追踪器 tracer_provider trace_sdk.TracerProvider() tracer_provider.add_span_processor(span_processorspan_phoenix_processor) # 装备应用程序 LlamaIndexInstrumentor().instrument(tracer_providertracer_provider)案例实现1. 数据准备首先创建数据目录并下载示例文档!mkdir -p data !wget --user-agent Mozilla https://arxiv.org/pdf/2307.09288.pdf -O data/llama2.pdf2. 定义工作流事件定义工作流中使用的自定义事件类from llama_index.core.workflow import Event from llama_index.core.schema import NodeWithScore class RetrieverEvent(Event): 检索运行的结果 nodes: list[NodeWithScore] class RerankEvent(Event): 对检索节点进行重排序的结果 nodes: list[NodeWithScore]3. 定义RAG工作流类创建RAG工作流类包含文档索引、检索、重排序和响应合成四个主要步骤from llama_index.core import SimpleDirectoryReader, VectorStoreIndex from llama_index.core.response_synthesizers import CompactAndRefine from llama_index.core.postprocessor.llm_rerank import LLMRerank from llama_index.core.workflow import ( Context, Workflow, StartEvent, StopEvent, step, ) from llama_index.llms.openai import OpenAI from llama_index.embeddings.openai import OpenAIEmbedding class RAGWorkflow(Workflow): step async def ingest(self, ctx: Context, ev: StartEvent) - StopEvent | None: 文档摄取入口点由带有dirname的StartEvent触发。 dirname ev.get(dirname) if not dirname: return None documents SimpleDirectoryReader(dirname).load_data() index VectorStoreIndex.from_documents( documentsdocuments, embed_modelOpenAIEmbedding(model_nametext-embedding-3-small), ) return StopEvent(resultindex) step async def retrieve( self, ctx: Context, ev: StartEvent ) - RetrieverEvent | None: RAG入口点由带有query的StartEvent触发。 query ev.get(query) index ev.get(index) if not query: return None print(fQuery the database with: {query}) # 将查询存储在全局上下文中 await ctx.store.set(query, query) # 从全局上下文获取索引 if index is None: print(Index is empty, load some documents before querying!) return None retriever index.as_retriever(similarity_top_k2) nodes await retriever.aretrieve(query) print(fRetrieved {len(nodes)} nodes.) return RetrieverEvent(nodesnodes) step async def rerank(self, ctx: Context, ev: RetrieverEvent) - RerankEvent: # 对节点进行重排序 ranker LLMRerank( choice_batch_size5, top_n3, llmOpenAI(modelgpt-4o-mini) ) print(await ctx.store.get(query, defaultNone), flushTrue) new_nodes ranker.postprocess_nodes( ev.nodes, query_strawait ctx.store.get(query, defaultNone) ) print(fReranked nodes to {len(new_nodes)}) return RerankEvent(nodesnew_nodes) step async def synthesize(self, ctx: Context, ev: RerankEvent) - StopEvent: 使用重排序后的节点返回流式响应。 llm OpenAI(modelgpt-4o-mini) summarizer CompactAndRefine(llmllm, streamingTrue, verboseTrue) query await ctx.store.get(query, defaultNone) response await summarizer.asynthesize(query, nodesev.nodes) return StopEvent(resultresponse)4. 运行工作流创建工作流实例并执行文档索引和查询# 创建工作流实例 w RAGWorkflow() # 摄取文档 index await w.run(dirnamedata) # 运行查询 result await w.run(queryHow was Llama2 trained?, indexindex) # 流式输出响应 async for chunk in result.async_response_gen(): print(chunk, end, flushTrue)案例效果本案例实现了一个完整的RAG工作流能够处理文档索引、检索、重排序和响应合成。以下是查询How was Llama2 trained?的执行过程和结果执行过程Query the database with: How was Llama2 trained? Retrieved 2 nodes. How was Llama2 trained? Reranked nodes to 2最终响应Llama 2 was trained through a multi-step process that began with pretraining using publicly available online sources. This was followed by the creation of an initial version of Llama 2-Chat through supervised fine-tuning. The model was then iteratively refined using Reinforcement Learning with Human Feedback (RLHF) methodologies, which included rejection sampling and Proximal Policy Optimization (PPO). During pretraining, the model utilized an optimized auto-regressive transformer architecture, incorporating robust data cleaning, updated data mixes, and training on a significantly larger dataset of 2 trillion tokens. The training process also involved increased context length and the use of grouped-query attention (GQA) to enhance inference scalability. The training employed the AdamW optimizer with specific hyperparameters, including a cosine learning rate schedule and gradient clipping. The models were pretrained on Metas Research SuperCluster and internal production clusters, utilizing NVIDIA A100 GPUs.效果亮点系统通过工作流方式组织RAG流程实现了模块化设计通过重排序技术提高了检索结果的相关性通过流式响应提供了更好的用户体验。案例实现思路工作流程图文档摄取 → 检索 → 重排序 → 响应合成StartEvent(dirname) → StopEvent(index)StartEvent(query, index) → RetrieverEvent(nodes) → RerankEvent(nodes) → StopEvent(response)核心设计思路事件驱动架构使用LlamaIndex Workflow的事件驱动模型通过定义不同类型的事件来控制工作流的执行流程。模块化设计将RAG流程分解为独立的步骤每个步骤负责特定的功能提高了代码的可维护性和可扩展性。双入口点设计工作流有两个入口点一个用于文档索引一个用于查询处理使系统更加灵活。上下文共享利用ctx.store在工作流步骤之间共享状态信息如查询字符串。流式响应使用CompactAndRefine的流式功能提供更好的用户体验。关键技术点类型注解验证工作流自动使用类型注解进行验证确保事件在步骤之间正确传递。异步处理所有步骤都是异步的提高了系统的并发处理能力。重排序技术使用LLMRerank对检索结果进行重排序提高结果相关性。可观测性可选集成OpenInference和Phoenix提供工作流执行的可视化追踪。扩展建议增加多模态支持扩展系统以支持图像、表格等多模态数据的检索和生成。实现查询转换在检索步骤前添加查询转换逻辑提高检索准确性。添加缓存机制为检索和重排序结果添加缓存提高响应速度。增强错误处理添加更健壮的错误处理机制当某个步骤失败时能够自动重试或寻找替代方案。支持多种重排序方法集成多种重排序算法根据查询类型动态选择最适合的方法。添加评估指标集成RAG评估指标如答案相关性、上下文相关性等持续优化系统性能。实现混合检索结合关键词检索和向量检索提高检索的全面性。支持多文档源扩展系统以支持从多种文档源如数据库、API、网页等检索信息。总结本案例展示了如何使用LlamaIndex Workflow构建一个带重排序功能的RAG系统。通过工作流的方式组织RAG流程实现了模块化、可扩展的架构使每个步骤都可以独立优化和替换。重排序技术的引入显著提高了检索结果的相关性而流式响应则提供了更好的用户体验。该案例的核心价值在于提供了一种结构化的RAG实现方法使流程更加清晰和可维护展示了事件驱动架构在RAG系统中的应用演示了如何通过重排序技术提高检索质量实现了流式响应提升了用户体验提供了可选的可观测性功能便于系统监控和调试这种基于工作流的RAG实现方式为构建更复杂、更智能的检索增强生成系统提供了有力参考特别适合需要高度定制化和可扩展性的应用场景。

相关新闻

agent-memory 召回路装配内收:CompositeStorage 工厂化装配 Recaller 的架构设计与循环依赖破解

agent-memory 召回路装配内收:CompositeStorage 工厂化装配 Recaller 的架构设计与循环依赖破解

人工智能AI AgentAgent 记忆RAGMCP 服务 【免费下载链接】agent-memory Memory 是一款面向 AI 智能体的长期记忆模块,为运行在 openJiuwen 框架上的智能体提供记忆提取、存储、检索与迁移能力。 项目地址: https://gitcode.com/openJiuwen/agent-memory …

2026/10/14 21:02:40 阅读更多 →
《县中的孩子》:看见县域教育生态的真实困境

《县中的孩子》:看见县域教育生态的真实困境

书读到一半的时候,我好几次停下来。不是看不懂,是有些场景太熟悉了。教室后墙的倒计时、县城中学门口等孩子的电动车、晚自习熄灯后还在走廊背书的影子——这些画面明明离大城市很遥远,却又让人觉得哪儿哪儿都是。《县中的孩子》不是那种告诉…

2026/10/14 21:02:40 阅读更多 →
GORM开发必备:Go结构体字段用值类型还是指针?

GORM开发必备:Go结构体字段用值类型还是指针?

做Go后端开发,天天跟GORM打交道的人迟早会纠结一个问题:表结构对应的struct字段,到底要不要用指针?这问题没有标准答案,但我可以从一个线上事故讲起。之前维护一个订单管理系统,前端提交"把商品数量改…

2026/10/14 21:01:39 阅读更多 →

最新新闻

电影院在线选座系统实战:Django+Flask架构下的并发抢座与状态一致性设计

电影院在线选座系统实战:Django+Flask架构下的并发抢座与状态一致性设计

提到电影院在线选座系统,很多人第一反应是“这不就是课设或者毕业设计的经典题目吗”。确实,这类系统的核心链路看着不复杂,但真从头到尾完整落地一遍,就会发现难度根本不在于增删改查,而在于几个信息量很大的隐性模块…

2026/10/14 21:52:59 阅读更多 →
PHP圈子系统源码实战:语音贴、语音房与直播后台开发

PHP圈子系统源码实战:语音贴、语音房与直播后台开发

简介:多客圈子系统是一套面向社交与直播创业者的综合性源码方案,适合具备PHP与uniapp基础的开发者二次开发,可快速搭建社区兴趣圈、语音交友、婚恋、本地门户等应用。压缩包共约2000个文件,整体56.7MB,以js、xml、php、…

2026/10/14 21:52:59 阅读更多 →
Java后端对象映射全解析:JSON、VO、Entity转换与MapStruct实战

Java后端对象映射全解析:JSON、VO、Entity转换与MapStruct实战

做 Java 后端时间长了你会发现,项目里最琐碎、最不起眼、但线上问题最多的往往不是复杂业务逻辑,而是对象之间的数据搬运。尤其是接口接收的 JSON、对内处理的 VO、最终落库的 Entity,这三者之间来回转换的代码,每天都在团队里被反…

2026/10/14 21:52:59 阅读更多 →
多客圈子系统:PHP实现语音贴、语音房与直播统一后台

多客圈子系统:PHP实现语音贴、语音房与直播统一后台

简介:多客圈子系统是一套面向社交与直播创业者的综合性源码方案,适合具备PHP与uniapp基础的开发者二次开发,可快速搭建社区兴趣圈、语音交友、婚恋、本地门户等应用。压缩包共约2000个文件,整体56.7MB,以js、xml、php、…

2026/10/14 21:52:59 阅读更多 →
Qoder智能IDE的Rule规则配置:让AI编程助手真正听懂约束

Qoder智能IDE的Rule规则配置:让AI编程助手真正听懂约束

用过AI编程助手的朋友应该都有过这种体验:第一次让它写个函数,挺惊艳;等写多了就会发现,它生成的东西总是差那么点意思——变量命名风格跟项目其他代码对不上,错误处理逻辑东一个西一个,提交信息更是七零八…

2026/10/14 21:52:59 阅读更多 →
局域网内WebUI接入OAuth2/OIDC企业SSO的完整实践指南

局域网内WebUI接入OAuth2/OIDC企业SSO的完整实践指南

刚开始做这件事的时候,我其实不太情愿。团队里那个本地 WebUI 是给内部大模型任务管理和参数调优用的,最初只是“谁要用谁自己问管理员要密码”,大家也这么用了大半年。直到公司网络合规审计点名了这个系统,要求所有内部 Web 服务…

2026/10/14 21:51:58 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/14 3:29:58 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 7:53:34 阅读更多 →