微信扫码
添加专属顾问
我要投稿
当出现问题时很难调试
它们隐藏了组件和模块的执行方式
我们的管道协调器变得越来越复杂,必须处理大量不同的边缘情况
对于复杂的管道来说,它们很难阅读
许多核心协调逻辑,如 if-else 语句和 while 循环,被嵌入到图形的边缘中。定义这些边缘变得繁琐且冗长。
处理可选和默认值的边缘情况变得困难。对于我们这样的框架来说,很难弄清楚一个参数是否会从上游节点传递过来。
定义具有循环的图形并不总是对构建代理的开发人员感觉自然。在这里,图形 UX 强制“代理”节点明确定义了传入边缘和传出边缘,迫使用户与其它节点定义冗长的通信模式。
from llama_index.core.workflow import(StartEvent,StopEvent,Workflow,step,)from llama_index.llms.openai import OpenAIclassOpenAIGenerator(Workflow):()asyncdefgenerate(self, ev: StartEvent) -> StopEvent:query = ev.get("query")llm = OpenAI()response =await llm.acomplete(query)return StopEvent(result=str(response))w = OpenAIGenerator(timeout=10, verbose=False)result =await w.run(query="What's LlamaIndex?")print(result)
:output: strpassage: str:error: strwrong_output: strpassage: str:@step()asyncdefextract(ev: StartEvent | ValidationErrorEvent-> StopEvent | ExtractionDone:StartEvent):passage = ev.get("passage")ifnot passage:return StopEvent(result="Please provide some text in input")reflection_prompt =""ValidationErrorEvent):passage = ev.passagereflection_prompt = REFLECTION_PROMPT.format(wrong_answer=ev.wrong_output, error=ev.error)llm = Ollama(model="llama3", request_timeout=30)prompt = EXTRACTION_PROMPT.format(passage=passage, schema=CarCollection.schema_json())if reflection_prompt:prompt += reflection_promptoutput =await llm.acomplete(prompt)return ExtractionDone(output=str(output), passage=passage)@step()asyncdefvalidate(ev: ExtractionDone-> StopEvent | ValidationErrorEvent:try:json.loads(ev.output)except Exception as e:failed, retrying...")return ValidationErrorEvent(error=str(e), wrong_output=ev.output, passage=ev.passage)return StopEvent(result=ev.output)w = ReflectionWorkflow(timeout=60, verbose=True)result =await w.run(passage="There are two cars available: a Fiat Panda with 45Hp and a Honda Civic with 330Hp.")print(result)
classRAGWorkflow(Workflow):asyncdefingest(self, ctx: Context, ev: StartEvent) -> Optional[StopEvent]:dataset_name = ev.get("dataset")_, documents = download_llama_dataset(dsname, "./data")ctx.data["INDEX"] = VectorStoreIndex.from_documents(documents=documents)return StopEvent(result=f"Indexed {len(documents)} documents.")
在这种情况下,ingest步骤创建了一个索引,并希望在工作流执行期间使其对可能需要它的任何其他步骤都可用。在 LlamaIndex 工作流中以符合规范的方式进行此操作的方法是声明步骤需要全局上下文的实例(@step(pass_context=True)可以完成这个操作)并将索引存储在上下文中本身,使用其他步骤可能稍后访问的预定义键。
classMyWorkflow(RAGWorkflow):@step(pass_context=True)defrerank(self, ctx: Context, ev: Union[RetrieverEvent, StartEvent]) -> Optional[QueryResult]:# 我的自定义重新排名逻辑在这里w = MyWorkflow(timeout=60, verbose=True)result =await w.run(query="Who is Paul Graham?")调试工作流
draw_all_possible_flows 生成一个图片,显示工作流中的所有步骤以及事件可能的流动方式
draw_most_recent_execution 生成一个类似的图片,只显示上次工作流执行期间实际发送的事件
完全异步,支持流式传输
默认情况下进行了仪器化,提供一键可观察性与支持的集成
逐步执行,便于调试
事件驱动依赖的验证和可视化
事件实现为 pydantic 模型,以简化自定义和进一步开发新功能
53AI,企业落地大模型首选服务商
产品:场景落地咨询+大模型应用平台+行业解决方案
承诺:免费POC验证,效果达标后再合作。零风险落地应用大模型,已交付160+中大型企业
2025-09-29
LlamaIndex 开发多智能体 Agents 入门基础
2025-09-27
LlamaIndex 开发智能体 Agents 要点解析
2025-07-21
LlamaIndex 是什么?普通人也能用它构建 AI 应用?
2025-07-13
手把手教你用 LlamaIndex 构建专属AI问答系统(新手友好版)
2025-07-04
LlamaIndex 开发大模型 Agent Workflow攻略
2025-07-01
llamaindex发布Workflows1.0轻量级编排框架
2025-05-27
Dify、n8n、Coze、Fastgpt、Ragflow到底该怎么选?超详细指南~
2025-05-27
19-LlamaIndexRAG进阶-文档切分与重排序