ARTICLE DETAIL

资讯详情

深耕编程入门与网站建设的一线实战洞察。

Unstract Document Classifier 工具完全指南:环境配置、本地调试与 Docker 部署实战

Unstract Document Classifier 工具完全指南:环境配置、本地调试与 Docker 部署实战 Unstract Document Classifier 工具完全指南环境配置、本地调试与 Docker 部署实战【免费下载链接】unstractLLM-Driven Extraction of Unstructured Data — Built for API Deployments ETL Pipeline Workflows项目地址: https://gitcode.com/GitHub_Trending/un/unstract导读本文聚焦 Unstract 项目中的 Document Classifier文档分类器工具它位于 tools/classifier是 Unstract 内置的 LLM 驱动型工具读取输入文档后调用 LLM 将其归入用户定义的分类桶classification bin并把源文件复制到对应文件夹。文章以 tools/classifier/README.md 为主干完整覆盖其环境变量、本地开发调试、SPEC/PROPERTIES/ICON/VARIABLES/RUN 五大命令的用法并深入仓库源码解读其校验逻辑、提示词构造、结果清洗与输出落盘机制。读完本文你将能够独立配置环境、本地运行该工具、基于 Docker 镜像进行容器化测试并理解其分类流程的底层实现。工具概览分类文件并复制到对应文件夹Document Classifier 的核心能力一句话即可概括读取一个文件提取文本交给 LLM 分类再把源文件复制到以分类结果命名的文件夹bin中。从 properties.json 可以看到它的元数据displayNameFile ClassifierfunctionNameclassifytoolVersion0.0.80输入是待分类的文件输出是把文件放入其被归入的文件夹结果以 JSON 形式返回包含input_file与result两个字段restrictions.maxFileSize为200MBallowedFileTypes为*任意类型依赖两类适配器LLMClassifier LLM必选与文本抽取适配器 Text Extraction Adapter必选不使用 embedding 服务与向量库。在主程序 src/main.py 中UnstractClassifier继承 SDK 的BaseToolrun()的完整执行链为从 settings 读取classificationBins、useCache、textExtractorId、llmAdapterId用文本抽取适配器X2Text提取文本或直接以 UTF-8 读取文件内容见 helper.py拼接分类提示词并调用 LLM清洗 LLM 输出得到唯一匹配的分类桶将源文件复制到output_dir/分类名/下并把{input_file: ..., result: ...}写入工具结果。必需的环境变量工具运行依赖以下环境变量见 README 表格 与 sample.env变量说明sample.env 示例值PLATFORM_SERVICE_HOSTplatform service 运行所在主机http://unstract-platform-servicePLATFORM_SERVICE_PORTservice 监听端口3001PLATFORM_SERVICE_API_KEYplatform 的 API Keyadd_platform_key_from_Unstract_frontendEXECUTION_DATA_DIR文件系统中存放工具执行内容的目录../data_dir或bucket/execution/org_id/workflow_id/execution_id需要特别留意 sample.env 中EXECUTION_DATA_DIR的两处出现一处是本地调试用的目录路径如../data_dir另一处是工作流执行文件系统配置需要同时提供WORKFLOW_EXECUTION_FILE_STORAGE_CREDENTIALS示例为 minio 存储含endpoint_url、key、secret用于说明执行数据存放的 bucket 与存储提供方。文件系统配置会通过 SDK 参与工作流执行文件的读写因此容器化部署时必须与实际存储环境保持一致。此外 sample.env 还给出了可选的X2TEXT_HOST默认http://unstract-x2text-service与X2TEXT_PORT默认3004用于连接独立的 x2text 服务。这些变量会通过 SDK 被加载实际生效值以运行环境为准。本地调试环境搭建创建虚拟环境并安装依赖README 推荐的本地开发流程README#L16-L36python -m venv .venv source .venv/bin/activate pip install -r requirements.txtrequirements.txt 的内容比较特殊它通过可编辑安装-e file:...引用仓库内的三个本地包——unstract/core、unstract/sdk1[aws]、unstract/flags。其中[aws]扩展是因为工具使用临时/瞬态存储时需要 aws 相关依赖。因此在本地运行时这三个包所在的源码目录必须可被解析若想使用本地开发版 unstract-sdk可按 README 说明从本地仓库安装pip install -e ~/path_to_repo/sdks/.注意本仓库的工具代码位于 unstract/sdk1/src并非独立的sdks/目录README 中的路径是示意请替换为你本地实际的 SDK 仓库路径。准备执行环境复制sample.env为.env填入必需的变量值。该文件通过 SDK 配合 python-dotenv 加载README 原文说明。每次执行前更新EXECUTION_DATA_DIR指向的data_dir因为工具会更新该目录下的INFILE与METADATA.json执行数据必须是最新的。五大 CLI 命令SPEC / PROPERTIES / ICON / VARIABLES / RUN工具入口为python main.py通过--command选择命令。命令由 SDK 的ToolEntrypoint统一解析启动见 entrypoint.py 与 main.py 底部 的UnstractClassifier.from_tool_args/ToolEntrypoint.launch调用。SPEC输出运行时配置的 JSON Schemapython main.py --command SPECSPEC 代表工具运行时settings的 JSON Schema。源码见 src/config/spec.json其要点必填字段classificationBins数组至少 2 个minItems: 2且uniqueItems: trueclassificationBins中每个桶为字符串unknown与__unstract_failed是保留桶unknown表示 LLM 无法判断分类__unstract_failed表示该文件工具运行失败useCache布尔值默认true描述为使用缓存结果注在 helper.py 的 find_classification 中该参数已被标记为 deprecated实际不再使用。PROPERTIES输出工具元数据python main.py --command PROPERTIES输出工具的version、description、inputs、outputs等元数据即 properties.json 的内容toolVersion: 0.0.80ioCompatibility表明 api/file/db 三类来源与目标的兼容能力adapter声明所需的 LLM 与文本抽取适配器。ICON输出前端使用的 SVG 图标python main.py --command ICON返回工具在 Unstract 前端展示所用的 SVG 图标源文件为 src/config/icon.svg。VARIABLES输出运行时变量python main.py --command VARIABLES代表工具运行时使用的环境变量envs。当前实现见 runtime_variables.jsonrequired为空数组、properties为空对象即该文件层面不声明额外运行时变量实际依赖的环境变量由.env/ 运行环境提供见上文环境变量表。RUN执行一次分类RUN 命令所需的 settings 结构可通过 SPEC 获得或直接查看config/spec.json。README 给出的本地执行示例python main.py \ --command RUN \ --settings { llmAdapterId: e9884c72-3920-43e7-9904-bb59f308f50d, classificationBins: [business, sports, politics, entertainment, tech], useCache: true } \ --log-level DEBUG参数说明llmAdapterId用于分类的 LLM 适配器实例 ID必填对应 properties.json 中adapter.languageModels[0]的isRequired: trueclassificationBins分类桶列表至少两个且不能包含保留桶unknown详见下文校验逻辑useCache是否使用缓存默认为true--log-level DEBUG以 DEBUG 级别输出日志便于观察 LLM 响应等内部过程。配置校验与保留桶约束源码级解读RUN 启动后会先执行validate()main.py L26-L45违反任一规则会stream_error_and_exit直接终止classificationBins不能为空桶数量必须 ≥ 2桶列表中不能包含保留桶unknownReservedBins.UNKNOWN unknown见 helper.py L12-L14——因为该桶由系统保留用于标记无法分类的文件必须提供llmAdapterId否则提示 Choose an LLM to perform the classification.必须提供textExtractorId否则提示 Choose a text extractor to extract the documents.。保留桶定义在 helper.py 的 ReservedBinsunknownLLM 无法从给定分类中确定归属时使用__unstract_failed工具运行失败时使用stream_error_and_exit默认把源文件复制到该桶bin_to_copy_to默认值。分类执行流程与提示词构造在run()中main.py L47-L156核心步骤为1. 文本抽取。ClassifierHelper.extract_text优先使用textExtractorId指定的 x2text 适配器抽取文本_extract_from_adapter经X2Text.process返回TextExtractionResult.extracted_text未指定时退化为直接从文件按 UTF-8 读取_extract_from_file。抽取失败会以 Unable to extract text 退出。2. 文本截断。根据 LLM 的get_max_tokens预留 50 1000 tokens 给输出计算max_bytes max_tokens * 1.3按字节截断输入文本避免超出模型上下文窗口。3. 提示词构造。若用户桶列表不含unknown工具会自动追加该保留桶bins.append(ReservedBins.UNKNOWN)并给每个桶加单引号后拼进提示词。实际提示词为Classify the following text into one of the following categories: business sports politics entertainment tech unknown. Your categorization should be strictly exactly one of the items in the categories given, do not provide any explanation. Find a semantic match of category if possible. If it does not categorize well into any of the listed categories, categorize it as unknown. Do not enclose the result within single quotes. Text: ... Category:该提示词要求 LLM 严格输出给定分类之一、不做解释、不输出引号匹配不上则归入unknown。4. 结果清洗。clean_llm_responsehelper.py L220-L261对 LLM 输出做容错处理小写化、截取前 100 个词用正则\b...\b统计各桶出现次数只有当恰好一个桶命中时才采用该分类若命中 0 个或多个桶则报错并把文件移动到unknown桶。这一机制保证了LLM 随口输出额外文本时仍能稳定归类。5. 落盘与结果输出。copy_source_to_output_binhelper.py L54-L77将源文件从workflow_filestorage复制到output_dir/classification/source_name底层使用FileStorageUtils.copy_file_to_destination随后通过stream_single_step_message输出CLASSIFICATION分类名并以write_tool_result写入 JSON 结果含input_file与result供下游工具或 API 消费。基于 Docker 镜像的测试构建镜像在包含Dockerfile的目录下构建README#L94-L103docker build -t unstract/tool-classifier:0.0.1 .Dockerfile 的关键点基础镜像python:3.12-slim-trixie安装dumb-init、libmagic-dev、poppler-utils后者服务于 unstructured 库的文档 partition把unstract/sdk1、unstract/core、unstract/flags三个本地包复制进镜像并通过-e file:方式安装保证工具与 SDK 版本一致预装 OpenTelemetry 相关组件opentelemetry-distro、opentelemetry-exporter-otlp等并以opentelemetry-instrument python main.py作为 ENTRYPOINT实现可观测性埋点。运行容器运行前需保证EXECUTION_DATA_DIR指向的目录包含工具运行所需信息且 platform-service 等必要服务已启动。然后执行README#L106-L119docker run -it \ --network unstract-network \ --env-file .env \ -v $(pwd)/data_dir:/app/data_dir \ unstract/tool-classifier:0.0.1 \ --command RUN \ --settings { llmAdapterId: e9884c72-3920-43e7-9904-bb59f308f50d, classificationBins: [business, sports, politics, entertainment, tech], useCache: true } \ --log-level DEBUG参数解读--network unstract-network加入 Unstract 的 Docker 网络使容器能够访问 platform-service、x2text-service 等对端服务与 sample.env 中的服务主机名对应--env-file .env注入本地.env中配置的环境变量-v $(pwd)/data_dir:/app/data_dir将宿主机的执行数据目录挂载到容器内/app/data_dir使EXECUTION_DATA_DIR指向的路径在容器内外一致镜像名unstract/tool-classifier:0.0.1与构建时保持一致命令及 settings 与本地 RUN 完全相同便于两种方式对照验证。与 Unstract 平台工作流的集成关系从源码结构看Document Classifier 属于 Unstract 平台中的工作流工具tool它运行于 workflow 执行环境通过 SDK 的BaseTool获得workflow_filestorage、执行元数据SOURCE_NAME等与平台服务通信能力并将分类结果JSON 与文件落盘回传给工作流。其读文件 → LLM 分类 → 复制到桶的模式可直接嵌入 ETL Pipeline例如按业务、法务、财务等维度自动归档导入文档或在多分类路由中作为决策节点后续步骤按分类结果分流处理。用户可在 Unstract 前端配置该工具选择 LLM、文本抽取适配器并指定分类桶实际配置后由平台注入相应 settings 与执行数据目录。常见问题与调试建议Classification bins are required. / At least two classification bins are required.settings 未传classificationBins或数量少于 2请检查 SPEC 约束minItems: 2。提示 Classification bin unknown is reserved...用户桶中显式包含了保留桶unknown应删除系统会在运行时自动追加。Choose an LLM to perform the classification.缺少llmAdapterId需先在平台配置 LLM 适配器实例。Choose a text extractor to extract the documents.缺少textExtractorId需配置文本抽取适配器。Unable to extract text文本抽取失败检查 x2text 服务是否可达、文件是否可读。文件被归入unknown/__unstract_failed前者是 LLM 未命中任何桶或命中多个桶见clean_llm_response的多匹配分支后者表示运行异常可配合--log-level DEBUG查看 LLM 原始响应与异常栈。本地执行报错找不到模块确认已按 requirements.txt 安装unstract/core、unstract/sdk1[aws]、unstract/flags且.env已就位。总结Document Classifier 是 Unstract 生态中一个结构清晰、可独立测试的 LLM 工具环境上依赖 platform-service 与 x2text 服务运行上通过--command区分元数据查询与真实执行逻辑上以抽取文本 → 构造提示词 → LLM 分类 → 结果清洗 → 复制落盘为完整闭环并以保留桶unknown/__unstract_failed兜底异常场景。无论是通过python main.py本地调试还是docker builddocker run容器化验证均可对照 README、spec.json 与 main.py 快速上手并将其无缝接入 Unstract 的 ETL 与 API 部署工作流。【免费下载链接】unstractLLM-Driven Extraction of Unstructured Data — Built for API Deployments ETL Pipeline Workflows项目地址: https://gitcode.com/GitHub_Trending/un/unstract创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表