如今这条链通常被拼接在 OCR 脚本、临时文件、模型调用、SQL 任务和审查工具之间。
⚠ 系统分散 · 到处是 glue code · 来源引用丢失 · 难以调试 · 可复现性差
从 FILE、IMAGEFILE、AUDIOFILE 或 VIDEOFILE 引用开始,组合媒体算子、SQL 和 Python UDF;解析、OCR 和转写由你配置的库与模型完成。
在输出文本和向量时同时选择业务 ID、来源 URI 和片段时间戳。将模型分类与人工复核状态分开保存,便于下游用户核对原始材料。
通过分布式 sink 向 Milvus、Qdrant 执行 upsert,或用 Arrow Stream Load 写入 Doris。按目标系统配置表结构、凭据和向量维度。
这段根据教程简化的 SQL 构造 FILE 和 AUDIOFILE 引用,调用教程中的转写 UDF,为带时间戳的片段生成向量。完整教程包含 Python UDF 注册、模型配置、候选分类和 DorisStreamLoadSink 写入。
-- Adapted excerpt: the tutorial registers transcribe_audio in prepare.py. WITH recordings AS ( SELECT regexp_extract(f.url, '([^/]+)[.]wav$', 1) AS ticket_id, audio_file(file(f.url, NULL, NULL, NULL, NULL)) AS audio FROM list_files('./recordings/*.wav') AS f ), transcripts AS ( SELECT ticket_id, audio.url AS source_uri, transcribe_audio(audio) AS segments_json FROM recordings ), segments AS ( SELECT ticket_id, source_uri, unnest(from_json(segments_json, '[{"segment_id":"INTEGER","text":"VARCHAR","start_ms":"BIGINT","end_ms":"BIGINT"}]' )) AS segment FROM transcripts ) SELECT ticket_id, segment.segment_id AS segment_id, segment.text AS text, source_uri, segment.start_ms AS start_ms, segment.end_ms AS end_ms, ai_embed( segment.text, provider := 'transformers', model := 'sentence-transformers/paraphrase-multilingual-MiniLM-L12-v2', dimensions := 384, on_error := 'raise', options := struct_pack(normalize := true, actor_number := 1, batch_size := 16) ) AS embedding FROM segments WHERE length(trim(segment.text)) > 0;