微信扫码
与创始人交个朋友
我要投稿
当出现问题时很难调试
它们隐藏了组件和模块的执行方式
我们的管道协调器变得越来越复杂,必须处理大量不同的边缘情况
对于复杂的管道来说,它们很难阅读
许多核心协调逻辑,如 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+中大型企业
2024-12-17
llamaindex实战-ChatEngine-Context(上下文)模式
2024-12-01
LlamaIndex,让AI唤醒你的数据
2024-11-29
llamaindex实战-Agent-自定义工具函数
2024-11-22
llamaindex实战-Agent-让Agent调用多个工具函数(本地部署)
2024-11-19
llamaindex实战-Workflow:工作流入门(本地部署断网运行)
2024-11-15
llamaindex实战-Agent-在Agent中使用RAG查询(本地部署)
2024-11-07
深度解析 REAcT Agent 的实现:利用 LlamaIndex 和 Gemini 提升智能代理工作流
2024-11-04
手把手教你用Coze零代码搭建一个智能搜索智能体,高时效性、保姆级!
2024-07-09
2024-04-20
2024-06-05
2024-04-25
2024-04-28
2024-05-09
2024-07-20
2024-04-26
2024-06-19
2024-04-08