【Agent】【workflow】13.带重排序的RAG工作流 - LlamaIndex Workflow示例分析

发布时间:2026/10/14 21:02:49

【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实现方式为构建更复杂、更智能的检索增强生成系统提供了有力参考特别适合需要高度定制化和可扩展性的应用场景。
延伸阅读

更多相关文章

2026/10/14 21:02:49

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

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

2026/10/14 21:02:49

ST7789V STM32驱动实战:三种SPI接口与初始化序列避坑指南

简介:ST7789V 驱动例程以 STM32F429 为主控,面向需要在小尺寸 TFT-LCD 上实现图形显示的嵌入式开发者。例程覆盖 SPI 三线/四线和 GPIO 模拟 SPI 等通讯方式,初始化序列包含屏幕方向、像素格式、时序参数等关键命令,并提供点绘、画…

2026/10/14 22:34:22

RT-Thread信号量本质:资源协调而非加锁

1. 为什么信号量不是“加锁”而是“协调”——从一个死锁现场说起刚接触 RT-Thread 时,我下意识把信号量(Semaphore)当成和互斥锁(Mutex)差不多的东西:不就是“上锁—干活—解锁”三步走?直到在…

2026/10/14 22:34:22

CoNED沿海高程数据在GEE中的淹没模拟实践与避坑指南

做沿海洪水淹没评估、海平面上升情景推演、风暴潮风险制图这类工作,第一道坎几乎都卡在高程数据上。很多新手一开始去下载普通陆地DEM,拿到沿海区域一画就露馅:陆地部分看着还行,一到滩涂、河口、潮间带,要么是空的&am…

2026/10/14 22:34:22

两台Spark实测:16GB小主机如何跑稳长上下文Agent

两台 Spark 是什么?说白了,就是我自己手头两台配置差不多的本地算力小主机,我给它们起了个代号叫 Spark,一台负责跑推理服务,一台负责干 Agent 编排和杂活。这次专门拿它们来跑本地 Agent,核心就测一件事&a…

2026/10/14 22:34:22

Certbot泛域名SSL证书自动化部署与DNS-01验证实战

1. 为什么泛域名证书不再是“高级玩家专属”——从手动折腾到一键签发的实操跃迁你有没有过这样的经历:给公司新上线的五个子站(admin.example.com、api.example.com、docs.example.com、blog.example.com、staging.example.com)逐个申请SSL证…

2026/10/14 22:34:22

生产环境Agent编排的失败降级策略:从原理到代码实践

生产环境 Agent 编排:我为什么给每个环节都加了失败降级凌晨 2 点 47 分,监控告警把我从梦里拽了出来。生产环境的某个 Agent 工作流卡在了“调用外部工具”这一步,上下游全部堵死,队列里的任务越堆越多。我爬起来看了一眼日志&am…

2026/10/14 22:29:21

C#配书代码实战:从环境配置到模块拆解与异步改造指南

简介:《C#典型模块精解》配书源代码是一套面向C#初中级学习者的配套实例工程,集中展示从基础语法到高级特性的完整落地写法。内容覆盖变量与流程控制、面向对象三大特性、ADO.NET/Entity Framework数据访问、TCP/HTTP网络通信、多线程并发、Windows Form…

2026/10/14 11:31:03

Python调用Gemini Structured Outputs实现工单路由门禁

客服工单最怕的不是模型“答错一句话”,而是它给出一段看起来合理的说明,程序却从中猜错优先级。通俗做法是:要求模型只交 JSON(JavaScript Object Notation,轻量数据格式),再让代码验证它。Gem…

2026/10/14 17:41:07

Spring Boot超市进销存系统毕设实战:从需求拆解到答辩通关

最近带的一个学生项目组里,有A同学跑来问我:选什么毕设题目最稳妥,既能让评审老师觉得工作量够,又不会在答辩时被问到语无伦次。我第一反应就是推荐基于Spring Boot的超市仓库管理系统——也就是超市进销存系统。这个题目乍一看平…

2026/10/14 2:32:55

Flutter StatefulWidget 生命周期核心解析

很多刚开始接触 Flutter 的朋友,在看完一堆“Hello World”和基础组件之后,大概率都会撞上同一堵墙:StatefulWidget 里那堆 initState、build、dispose 方法,到底什么时候被调用?为什么顺序是那样?在里面到…

2026/10/14 0:00:33

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

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

2026/10/14 0:00:33

macOS/iOS高精度计时:mach_absolute_time原理与实战

1. 项目概述:为什么mach_absolute_time是 macOS/iOS 时间测量的“黄金标准”在 macOS 和 iOS 开发中,我见过太多人用CFAbsoluteTimeGetCurrent()或NSDate.timeIntervalSinceReferenceDate做性能打点,结果在高精度场景下被系统时钟跳变、NTP 同…

2026/10/14 0:00:33

SCORM课件演示与测试全解析:从API通信到自动化验证

简介:这是一套遵循SCORM标准的交互式课件演示与测试资源,面向E-Learning课程开发者、LMS平台测试人员及在线教学从业者,用于验证课件在不同学习管理系统中的识别、传递与跟踪能力。压缩包共28个文件,约12.07MB,以swf动…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑