txtai 工作流数据导出指南:ExportTask 将任务输出写入 CSV 与 Excel
【免费下载链接】txtai💡 All-in-one AI framework for semantic search, LLM orchestration and language model workflows项目地址: https://gitcode.com/GitHub_Trending/tx/txtai
ExportTask 是 txtai 工作流体系中的一个专用任务(Task),负责把工作流中前序任务产生的结果批量导出为 CSV 或 Excel(xlsx)文件。它适用于语义检索、RAG、摘要等流水线结束后需要落盘存档、人工审阅或交付给下游系统的场景,也可以作为中间环节在导出的同时把结果继续传递给后续任务。读完本文,你将掌握 ExportTask 的 Python 与配置(YAML)两种创建方式、output与timestamp两个关键参数的语义、底层基于 Pandas 的写入实现原理,以及如何通过workflow安装选项正确启用该功能。
ExportTask 是什么
ExportTask 是 txtai 内置的任务类型之一,其定位非常单一:将任务输出导出为 CSV 或 Excel。它本身不做复杂的数据变换,而是承接工作流中前一个任务(例如摘要、实体抽取、相似度计算)的产出,逐元素整理后写入本地文件。
从源码看,ExportTask 继承了通用的Task基类(见 src/python/txtai/workflow/task/base.py),基类已经承担了输入过滤(select)、解包(unpack)、并发执行(concurrency)、多 action 结果合并(merge)等通用职责,ExportTask 只需通过register方法补充自己的专属参数(output、timestamp)并重写__call__完成写盘动作,见 src/python/txtai/workflow/task/export.py。
ExportTask 对输入数据的结构没有严格要求:元素可以是普通字符串、元组或字典。当元素为字典时,字典的键会成为导出表格的列名(这一点在后面的测试用例中可以得到印证);当元素为列表或元组时,Pandas 会自动生成数字列索引。
快速上手:Python 方式创建
最简单的用法是直接把 ExportTask 放入Workflow,需要显式指定输出文件路径:
from txtai.workflow import ExportTask, Workflow # 指定输出路径,工作流执行时会将任务结果写入该文件 workflow = Workflow([ExportTask(output="export.csv")]) workflow(["Input 1", "Input 2"])执行后,当前目录下会生成export.csv,每一行对应一个输入元素。需要注意:原文档示例中的导入语句写的是from txtai.workflow import FileTask, Workflow,但实际使用的是ExportTask,请按上文修正为导入ExportTask(两者都由 src/python/txtai/workflow/task/init.py 统一导出,可直接from txtai.workflow import ExportTask)。
ExportTask 返回的是原始任务输出(outputs),因此它完全可以作为工作流的中间任务使用——先落盘一份副本,再把同样的数据交给下一个任务继续处理,实现"边导出、边流转"。
配置驱动:YAML 方式创建
与 txtai 其他组件一致,ExportTask 也可以通过工作流配置文件声明式创建。任务类型名export由 src/python/txtai/workflow/task/factory.py 中的TaskFactory.get解析:本地任务名会被自动拼接为xxxTask类名(export→ExportTask),再通过配置字典实例化:
workflow: name: tasks: - task: export output: export.csv timestamp: true其中task指定任务类型为export,output与timestamp会作为关键字参数传入ExportTask。这种方式非常适合把导出逻辑固化到工作流配置中,与 API 部署(见 docs/api/index.md)配合实现"配置文件即工作流"。
参数详解
ExportTask 通过register方法接收两个专属参数,见 src/python/txtai/workflow/task/export.py:
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
output | str | None | 输出文件路径。扩展名为.xlsx时使用 Pandas 写入 Excel,其余扩展名一律按 CSV 处理 |
timestamp | bool | None | 为True时,在文件名扩展名之前插入当前 UTC 时间戳,避免多次运行互相覆盖 |
register方法还承担了依赖校验职责:如果环境中未安装 Pandas,会直接抛出ImportError,提示信息为ExportTask is not available - install "workflow" extra to enable。
此外,ExportTask 作为Task子类,同样继承基类的通用参数,包括action、select、unpack、column、merge、initialize、finalize、concurrency、onetomany等(完整签名见 src/python/txtai/workflow/task/base.py),可用于精细化控制参与导出的数据范围与执行方式。
底层实现原理
ExportTask 的执行逻辑非常直观,核心代码位于 src/python/txtai/workflow/task/export.py,可拆解为四个步骤:
第一步:执行任务本体。__call__首先调用基类的__call__得到处理后的outputs,这一步保证了与基类任务调度机制的兼容。
第二步:解析输出扩展名。通过os.path.splitext拆分output,取扩展名并转为小写,用于决定写入格式:
parts = list(os.path.splitext(output)) extension = parts[-1].lower()第三步:按需附加时间戳。当timestamp=True时,使用 UTC 时间生成格式为%Y%m%dT%H%M%SZ的字符串(例如20260914T034705Z),并插入到扩展名之前:
timestamp = datetime.datetime.now(datetime.timezone.utc).strftime("%Y%m%dT%H%M%SZ") parts[-1] = timestamp + parts[-1] output = ".".join(parts)例如export.csv会变成export.20260914T034705Z.csv。使用 UTC 时间而非本地时间,保证了跨时区部署时文件命名的一致性。
第四步:按扩展名写入文件。扩展名为.xlsx时调用pd.DataFrame(outputs).to_excel(output, index=False),否则调用pd.DataFrame(outputs).to_csv(output, index=False)。index=False意味着 Pandas 的默认行索引不会被写入文件,导出的表格只有数据列。值得注意的是,CSV 分支是"兜底"逻辑——除了.xlsx之外的一切扩展名(.csv、.tsv等)都会走to_csv。
最后,方法返回原始outputs,从而保持任务链的输入输出一致性。
依赖与安装前提
ExportTask 依赖 Pandas,写入 Excel(.xlsx)还需要openpyxl引擎。这两者都位于 txtai 的workflow可选依赖组中(见 setup.py):
extras["workflow"] = [ "apache-libcloud>=3.3.1", "croniter>=1.2.0", "openpyxl>=3.0.9", "pandas>=1.1.0", "pillow>=7.1.2", "requests>=2.26.0", "xmltodict>=0.12.0", ]因此使用前需要安装:
pip install txtai[workflow]如果只安装基础版 txtai 而未安装workflow扩展,实例化 ExportTask 时会因pandas导入失败而抛出上文提到的ImportError(见 src/python/txtai/workflow/task/export.py 的顶层条件导入逻辑)。该检查在register阶段完成,也就是在Task.__init__调用register(**kwargs)时触发(见 src/python/txtai/workflow/task/base.py)。
测试用例验证
仓库自带的单元测试 test/python/testworkflow.py(testExportWorkflow)完整覆盖了 ExportTask 的三种典型场景,可直接作为使用范本:
- Excel 导出:
ExportTask(output=path)处理字典列表[{"id": 1, "text": "Sentence 1"}, {"id": 2, "text": "Sentence 2"}]后,断言生成的.xlsx文件非空; - CSV 导出:同样的输入与
output="export.csv",断言生成的 CSV 文件非空; - 带时间戳的 CSV 导出:
ExportTask(output=path, timestamp=True)执行后,通过glob匹配export-timestamp*.csv找到实际生成的时间戳文件并断言其非空。
测试同时印证了两个事实:其一,字典元素会按 key 展开为表格列(id、text);其二,时间戳机制确实会把文件名改写为带YYYYMMDDTHHMMSSZ后缀的形式。
实战组合:导出语义检索结果
ExportTask 的典型价值在于把工作流终点"落盘"。例如将文档数据经过分词、向量化后,把检索结果导出为 CSV 存档:
from txtai.embeddings import Embeddings from txtai.workflow import ExportTask, Task, Workflow embeddings = Embeddings(path="sentence-transformers/all-MiniLM-L6-v2") # 第一个任务执行语义检索,第二个任务导出结果 workflow = Workflow([ Task(lambda x: [embeddings.search(q)[0] for q in x]), ExportTask(output="results.xlsx", timestamp=True), ]) list(workflow(["query 1", "query 2"]))结合timestamp=True,每次运行都会生成独立命名的文件,方便留痕比对;而 ExportTask 透传输出的特性,也让后续可以继续追加StorageTask(云存储)等任务,将导出文件进一步归档(完整任务列表见 docs/workflow/task/index.md)。
小结
ExportTask 是 txtai 工作流中最轻量也最实用的收尾任务之一:两个参数、一段基于 Pandas 的写盘逻辑,即可把任意工作流产出固化为 CSV 或 Excel。理解其output扩展名驱动的格式选择、timestamp的 UTC 命名规则,以及workflow扩展的依赖前提,你就可以在语义搜索、RAG、批处理等各类流水线中安全、可复现地完成数据导出。
【免费下载链接】txtai💡 All-in-one AI framework for semantic search, LLM orchestration and language model workflows项目地址: https://gitcode.com/GitHub_Trending/tx/txtai
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考