微信扫码
添加专属顾问
我要投稿
当出现问题时很难调试
它们隐藏了组件和模块的执行方式
我们的管道协调器变得越来越复杂,必须处理大量不同的边缘情况
对于复杂的管道来说,它们很难阅读
许多核心协调逻辑,如 if-else
语句和 while
循环,被嵌入到图形的边缘中。定义这些边缘变得繁琐且冗长。
处理可选和默认值的边缘情况变得困难。对于我们这样的框架来说,很难弄清楚一个参数是否会从上游节点传递过来。
定义具有循环的图形并不总是对构建代理的开发人员感觉自然。在这里,图形 UX 强制“代理”节点明确定义了传入边缘和传出边缘,迫使用户与其它节点定义冗长的通信模式。
from llama_index.core.workflow import(
StartEvent,
StopEvent,
Workflow,
step,
)
from llama_index.llms.openai import OpenAI
classOpenAIGenerator(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: str
passage: str
:
error: str
wrong_output: str
passage: 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.passage
reflection_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_prompt
output =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-04-03
TypeScript版LlamaIndex来袭!用Agentic RAG构建智能AI代理,效率与隐私双提升!
2025-03-25
解锁 llamaindex agentworkflow 的潜力:有效多代理编排的 5 个关键策略
2025-02-25
首发完整版教程,MCP 集成至 LlamaIndex 的技术实践
2025-01-11
LlamaIndex :企业级知识助理,万物可知
2024-12-26
深入了解 LlamaIndex 工作流程:事件驱动的 LLM 架构
2024-12-23
LlamaIndex工作流详解:提升数据处理效率的关键
2024-12-17
llamaindex实战-ChatEngine-Context(上下文)模式
2024-12-01
LlamaIndex,让AI唤醒你的数据
2024-07-09
2024-04-25
2024-04-20
2024-04-28
2024-06-05
2024-05-09
2024-06-19
2024-07-20
2024-04-26
2024-04-19