# 文件功能说明 本文档详细解释项目中每个 Python 脚本的功能、输入输出和使用方式。 --- ## 1. collect_jrxml.py — JRXML 文件收集脚本 **功能**: 从指定的 JasperReports 模板库目录递归收集所有 `.jrxml` 文件,复制到项目的 `jrxml_source` 目录。 **输入**: - 源目录: `C:\Users\zy187\JaspersoftWorkspace\JasperReportsSamples`(可修改) **输出**: - `jrxml_source/` 目录,包含所有收集到的 JRXML 文件 **使用方式**: ```bash python collect_jrxml.py ``` **核心逻辑**: - 使用 `os.walk()` 递归遍历源目录 - 筛选 `.jrxml` 后缀文件 - 自动处理文件名冲突(添加数字后缀) - 使用 `shutil.copy2()` 保留文件元数据 --- ## 2. jrxml_chunker.py — JRXML 语义分块核心引擎 **功能**: 将单个 JRXML 文件按语义结构拆分为多个 chunk,每个 chunk 包含人类可读描述、原始 XML 和元数据。 **输入**: - 单个 JRXML 文件路径 **输出**: - `JRXMLChunk` 对象列表,每个包含: - `chunk_id`: 唯一标识 - `chunk_type`: 分块类型(如 `query`, `field`, `band_title` 等) - `human_description`: 人类可读的结构化描述 - `raw_xml`: 原始 XML 片段 - `context`: 上下文信息(所属报表名称) - `metadata`: 元数据字典 **核心类**: - `JRXMLChunk`: 单个 chunk 的数据结构 - `JRXMLSemanticChunker`: 主分块器,支持多种数据源类型(SQL、HQL、XPath、JSON、CSV 等) **分块策略**: - 按 XML 元素类型分类(field、parameter、variable、band、chart 等) - 提取数据源配置和查询语句 - 保留元素间的层级关系 - 为每个 chunk 生成结构化的人类可读描述 **使用方式**: ```bash # 处理单个文件 python jrxml_chunker.py report.jrxml # 处理整个目录 python jrxml_chunker.py ./jrxml_source/ ``` --- ## 3. jrxml_banch_chunker.py — 批量分块入口脚本 **功能**: 批量处理目录下所有 JRXML 文件,生成统计报告和分类输出。 **输入**: - JRXML 文件目录(默认: `jrxml_source`) **输出**: - `jrxml_chunker_output/all_chunks.json`: 所有 chunks 合并文件 - `jrxml_chunker_output/processing_stats.json`: 处理统计(成功/失败数、耗时、chunk 类型分布) - `jrxml_chunker_output/per_file/`: 按原文件分类的独立 chunk 文件 **核心函数**: - `batch_chunk_with_report()`: 批量处理目录 - `chunk_single_file_with_report()`: 处理单个文件 **使用方式**: ```bash # 使用默认输入目录 python jrxml_banch_chunker.py # 指定输入目录 python jrxml_banch_chunker.py ./jrxml_source # 指定输出目录 python jrxml_banch_chunker.py ./jrxml_source --output ./my_output ``` --- ## 4. down_embedding_model.py — 嵌入模型下载脚本 **功能**: 从 HuggingFace Hub 下载 Qwen3-Embedding-4B 嵌入模型到本地。 **输入**: - HuggingFace 模型仓库: `Qwen/Qwen3-Embedding-4B` **输出**: - `models/Qwen3-Embedding-4B/` 目录,包含完整的模型文件 **特性**: - 使用国内镜像加速下载(`hf-mirror.com`) - 支持断点续传 - 自动安装依赖 **使用方式**: ```bash python down_embedding_model.py ``` --- ## 5. embed_chunks.py — Chunk 向量化脚本 **功能**: 使用嵌入模型将分块后的文本转换为向量表示,支持 GPU 加速和 FP16 半精度。 **输入**: - `jrxml_chunker_output/all_chunks.json`(默认) **输出**: - `embeddings/embeddings.npy`: 向量矩阵(float32) - `embeddings/chunk_id_map.json`: chunk ID 映射 - `embeddings/chunk_type_map.json`: chunk 类型映射 - `embeddings/chunks.json`: 原始 chunks 副本 - `embeddings/embeddings.pkl`: 完整数据 pickle **核心函数**: - `build_text_for_embedding()`: 将 chunk 转换为适合向量化的文本(拼接类型、描述、XML、元数据) - `main()`: 主流程(加载→编码→保存→质量检查) **特性**: - 自动检测 CUDA/CPU - 默认启用 FP16 半精度(节省约 50% 显存) - 支持 HuggingFace Hub 在线模型 - 向量归一化 + NaN 检测 **使用方式**: ```bash # 使用默认设置 python embed_chunks.py # 指定模型和 batch size python embed_chunks.py --model_path "sentence-transformers/all-MiniLM-L6-v2" --batch_size 64 # 使用本地 Qwen3 模型 python embed_chunks.py --batch_size 2 # 禁用 FP16 python embed_chunks.py --no_fp16 --batch_size 1 ``` --- ## 6. import_to_chroma.py — 向量导入 Chroma 数据库 **功能**: 将已生成的向量和 chunks 导入 Chroma 持久化向量数据库。 **输入**: - `embeddings/embeddings.npy`: 向量矩阵 - `embeddings/chunks.json`: chunks 数据 **输出**: - `chroma_db/`: Chroma 持久化数据库目录 - 集合名称: `jrxml_chunks`(默认) **核心逻辑**: - 加载向量和 chunks - 初始化 Chroma PersistentClient - 创建集合(余弦相似度) - 分批导入(每批 1000 条) - 提取元数据(chunk_type、report_name、band_name 等) - 快速验证查询 **使用方式**: ```bash # 使用默认设置 python import_to_chroma.py # 指定路径 python import_to_chroma.py --embeddings_dir ./embeddings --chroma_path ./chroma_db ``` --- ## 7. query_chroma.py — 语义搜索查询工具 **功能**: 通过自然语言查询 Chroma 数据库,检索相关的 JRXML chunk。 **输入**: - 用户自然语言查询 - 可选的元数据过滤条件 **输出**: - 相似度排序的检索结果(含 chunk 类型、报表名称、区域、内容摘要) **核心类**: - `JRXMLSearcher`: 搜索器,封装模型加载、向量编码和 Chroma 查询 **核心方法**: - `search()`: 基础语义搜索 - `search_with_threshold()`: 带相似度阈值的搜索 - `format_result()`: 格式化输出结果 **两种模式**: 1. **命令行单次查询**: `python query_chroma.py "查询内容"` 2. **交互模式**: `python query_chroma.py`(支持连续查询和内联命令) **交互模式命令**: ``` filter:<类型> 按 chunk_type 过滤(如 filter:query) t:<阈值> 设置相似度阈值 0~1(如 t:0.5) k:<数量> 设置返回结果数(如 k:10) ``` **使用方式**: ```bash # 交互模式 python query_chroma.py # 单次查询 python query_chroma.py "如何修改报表标题" # 按类型过滤 python query_chroma.py "SQL怎么写" --filter_field query # 设置阈值和返回数量 python query_chroma.py "报表参数" --threshold 0.5 --n_results 10 ``` --- ## 数据流全景 ``` ┌─────────────────┐ │ JasperReports │ C:\Users\...\JasperReportsSamples │ 模板库 │ └────────┬────────┘ │ collect_jrxml.py ▼ ┌─────────────────┐ │ jrxml_source/ │ 收集的 JRXML 文件 └────────┬────────┘ │ jrxml_banch_chunker.py (调用 jrxml_chunker.py) ▼ ┌──────────────────────┐ │ jrxml_chunker_output/│ all_chunks.json + per_file/ └────────┬─────────────┘ │ embed_chunks.py (使用 Qwen3-Embedding-4B) ▼ ┌─────────────────┐ │ embeddings/ │ embeddings.npy + chunks.json └────────┬────────┘ │ import_to_chroma.py ▼ ┌─────────────────┐ │ chroma_db/ │ Chroma 向量数据库 └────────┬────────┘ │ query_chroma.py ▼ ┌─────────────────┐ │ 用户查询 │ 自然语言 → 相关 JRXML chunks └─────────────────┘ ``` ## 依赖关系 ``` query_chroma.py ──────► chromadb, sentence_transformers, torch import_to_chroma.py ──► chromadb, numpy embed_chunks.py ──────► sentence_transformers, torch, numpy down_embedding_model.py ► huggingface_hub jrxml_banch_chunker.py ─► jrxml_chunker.py jrxml_chunker.py ─────► xml.etree.ElementTree (标准库) collect_jrxml.py ─────► 标准库 (os, shutil) ```