277 lines
11 KiB
Markdown
277 lines
11 KiB
Markdown
# PlantAI-rag
|
|||
|
|
|
||
|
|
PlantAI-rag is a local working copy of the gene-family literature RAG and
|
||
|
|
knowledge extraction system. The current maintained extraction entrypoint is
|
||
|
|
`src.rag.extractors.v16_1_2.V16Extractor`.
|
||
|
|
|
||
|
|
This repository is being prepared for a future open-source cleanup. It is not
|
||
|
|
ready to publish as-is.
|
||
|
|
|
||
|
|
## Current Status
|
||
|
|
|
||
|
|
- Source project remains read-only and is configured by `PLANTAI_SOURCE_ROOT`.
|
||
|
|
- This working copy should be used as the project root for cleanup work.
|
||
|
|
- Large data, papers, and model assets are kept outside Git and referenced by
|
||
|
|
`.env` or local symlinks.
|
||
|
|
- Current conda environment names are intentionally unchanged: `gfpy312` and
|
||
|
|
`minerupy312`.
|
||
|
|
- Real API keys, passwords, and private local paths must stay in `.env`, never
|
||
|
|
in tracked files.
|
||
|
|
|
||
|
|
## Validated Baseline
|
||
|
|
|
||
|
|
Final cleanup acceptance validation was run on 2026-06-25 with a real
|
||
|
|
Tartary buckwheat SPL paper:
|
||
|
|
|
||
|
|
- Input PDF: `${PLANTAI_SOURCE_ROOT}/uploads/64bbee67_Ft_SPL_2019_BMC.pdf`
|
||
|
|
- Title: `Genome-wide identification of the SPL gene family in Tartary Buckwheat`
|
||
|
|
- PMID: `31340871`
|
||
|
|
- DOI: `10.1186/s12870-019-1916-6`
|
||
|
|
- PlantAI-rag output: `/tmp/plantai_rag_realrun_ftspl`
|
||
|
|
- Source-project comparison output: `/tmp/source_gfmas_realrun_ftspl`
|
||
|
|
|
||
|
|
PlantAI-rag validation command:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
env \
|
||
|
|
MINERU_CMD="${MINERU_CMD:?set MINERU_CMD to the local MinerU executable}" \
|
||
|
|
PLANTAI_SOURCE_ROOT=/path/to/source-gene-family-mas-v2 \
|
||
|
|
"${GF_PYTHON:-python}" \
|
||
|
|
tools/validate_v16_baseline.py \
|
||
|
|
--pdf "${PLANTAI_SOURCE_ROOT}/uploads/64bbee67_Ft_SPL_2019_BMC.pdf" \
|
||
|
|
--pmid 31340871 \
|
||
|
|
--doi 10.1186/s12870-019-1916-6 \
|
||
|
|
--output-dir /tmp/plantai_rag_realrun_ftspl \
|
||
|
|
--cpu-mineru \
|
||
|
|
--no-llm \
|
||
|
|
--no-vlm \
|
||
|
|
--no-pc-data
|
||
|
|
```
|
||
|
|
|
||
|
|
Observed PlantAI-rag result:
|
||
|
|
|
||
|
|
- Validation status: `VALIDATION_PASSED`
|
||
|
|
- V16.1.2 extracted 11 sections, 286 entities, 180 relations, and 24 relation units.
|
||
|
|
- Retained relations had 0 missing source, 0 missing target, and 0 missing evidence.
|
||
|
|
- Relation types: `has_property` 72, `localizes_to` 48, `has_gene_id` 31, `contains_domain` 29.
|
||
|
|
- Output layer: `main_kg` 180 relations.
|
||
|
|
- Output artifacts included `result.json`, `validation_summary.json`, MinerU block JSONL files,
|
||
|
|
relation-unit coverage, repair audit, semantic-review audit, claim-scope audit,
|
||
|
|
supplementary-download audit, and supplementary column-mapping audit.
|
||
|
|
|
||
|
|
Source-project comparison used the same PDF content and same V16.1.2 runner with LLM off.
|
||
|
|
The first direct source run wrote MinerU intermediates beside the source PDF and failed before
|
||
|
|
result generation because the source runner/parser did not honor `--output-dir` for MinerU
|
||
|
|
intermediates and then refused text fallback. The isolated source-project comparison was rerun
|
||
|
|
with the PDF copied to `/tmp/plantai_source_compare_input` and
|
||
|
|
`V16_ALLOW_MINERU_TEXT_FALLBACK=1`; it completed with 143 entities, 180 relations, 0 relation
|
||
|
|
units, and the same four relation-type counts as PlantAI-rag. This means the maintained
|
||
|
|
PlantAI-rag runner preserves the supplementary-table relation output and improves the main-text
|
||
|
|
relation-unit path under the tested MinerU CPU configuration.
|
||
|
|
|
||
|
|
The latest strict local baseline used the Pecan SPL paper `pecan_SPL_2021.pdf`
|
||
|
|
with the MinerU CPU pipeline, DeepSeek V4 relation extraction, required
|
||
|
|
PlantConnectome data, and the V16.1.2 extractor chain.
|
||
|
|
|
||
|
|
Observed result:
|
||
|
|
|
||
|
|
- V16.1.2 extracted 11 sections, 712 entities, 751 relations, and 33 chunks.
|
||
|
|
- LLM relation extraction produced 642 candidate relations and 635 relations
|
||
|
|
before the evidence gate.
|
||
|
|
- All retained relations had non-empty source, target, and evidence fields.
|
||
|
|
- PC data loaded: 43,561 aliases, 17,618 gene aliases, 788 relationship
|
||
|
|
patterns, and 3,636 entity-dictionary sample entries.
|
||
|
|
- VLM was not enabled in this run.
|
||
|
|
- The strict run had 43 LLM requests and 2 request-timeout failures; the
|
||
|
|
extractor continued and passed final validation.
|
||
|
|
- GPU/API MinerU attempts failed because available GPU memory was exhausted;
|
||
|
|
CPU pipeline is the verified fallback path.
|
||
|
|
|
||
|
|
A follow-up three-paper strict regression from
|
||
|
|
`data/input/v16_batch10_20260625` also passed with required PC data enabled:
|
||
|
|
`plantsci_2020` (393 entities, 322 relations), `aob_mcz153` (646 entities,
|
||
|
|
590 relations), and `bmc_s12870_2020` (631 entities, 619 relations). These
|
||
|
|
runs wrote outputs under `/tmp` and did not copy, clean, deduplicate, or modify
|
||
|
|
source data.
|
||
|
|
A strict PC-data validation was also rerun with the four PlantConnectome JSON
|
||
|
|
files supplied from a local historical source-project PC directory via
|
||
|
|
`--pc-data-root`. It passed with `PC_DATA_ROOT` available, 43,561 aliases,
|
||
|
|
17,618 gene aliases, 788 relationship patterns, 3,636 entity-dictionary sample
|
||
|
|
entries, 286 entities, 180 relations, and 24 chunks. The PC data remained
|
||
|
|
external and was not copied into this repository.
|
||
|
|
|
||
|
|
|
||
|
|
## Local Configuration
|
||
|
|
|
||
|
|
Create a private `.env` from the template:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
cp .env.example .env
|
||
|
|
```
|
||
|
|
|
||
|
|
Fill only local values in `.env`, especially:
|
||
|
|
|
||
|
|
- `PC_DATA_ROOT`
|
||
|
|
- `PLANTAI_SPLIT_DATA_ROOT`
|
||
|
|
- `PLANTAI_SOURCE_ROOT`
|
||
|
|
- `BBAV5_ROOT`
|
||
|
|
- `PLANTAI_CONDA_ROOT`
|
||
|
|
- `PLANTAI_CONDA_PROFILE`
|
||
|
|
- `MINERU_CMD`
|
||
|
|
- `DEEPSEEK_API_KEY`
|
||
|
|
- `DASHSCOPE_API_KEY`
|
||
|
|
- `NEO4J_PASSWORD`
|
||
|
|
|
||
|
|
For low-memory MinerU validation, use:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
V15_MINERU_BACKEND=pipeline
|
||
|
|
V15_MINERU_METHOD=txt
|
||
|
|
V15_MINERU_FORMULA=0
|
||
|
|
V15_MINERU_TABLE=0
|
||
|
|
CUDA_VISIBLE_DEVICES=
|
||
|
|
```
|
||
|
|
|
||
|
|
## Local Git Policy
|
||
|
|
|
||
|
|
The first Git baseline is local only:
|
||
|
|
|
||
|
|
- Do not add a remote.
|
||
|
|
- Do not push.
|
||
|
|
- Do not track `.env`, experiments, raw papers, large datasets, model weights,
|
||
|
|
CodeGraph indexes, or historical one-off scripts.
|
||
|
|
|
||
|
|
Historical files remain on disk for reference, but they are excluded from the
|
||
|
|
first tracked baseline until reviewed.
|
||
|
|
|
||
|
|
## Baseline Validation
|
||
|
|
|
||
|
|
Use the maintained validation wrapper before and after cleanup changes:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
${GF_PYTHON:-python} tools/validate_v16_baseline.py \
|
||
|
|
--pdf "${PLANTAI_TEST_PDF:?set PLANTAI_TEST_PDF to a real local PDF}" \
|
||
|
|
--pmid 34966577 \
|
||
|
|
--output-dir experiments/phase2_v16_baseline_pecan \
|
||
|
|
--cpu-mineru \
|
||
|
|
--no-llm \
|
||
|
|
--no-vlm
|
||
|
|
```
|
||
|
|
|
||
|
|
This command writes `result.json` and `validation_summary.json` under the
|
||
|
|
chosen output directory. It verifies that sections, entities, relations, and
|
||
|
|
chunks are non-empty and that every retained relation has source, target, and
|
||
|
|
evidence.
|
||
|
|
The summary also records optional supplementary table reader capabilities:
|
||
|
|
`pandas` for CSV/TSV, `openpyxl` for `.xlsx`, `xlrd` for `.xls`, and
|
||
|
|
`python-docx` for DOCX tables. Missing readers do not rewrite data, but they
|
||
|
|
explain why downloaded supplementary tables may be skipped.
|
||
|
|
|
||
|
|
For strict LLM relation validation, configure `DEEPSEEK_API_KEY` in private
|
||
|
|
`.env` and run with `--with-llm --no-vlm`. Add `--with-llm-definitions` only
|
||
|
|
when the validation target explicitly includes per-entity generated definitions.
|
||
|
|
The wrapper fails before launching MinerU when a required API key or required
|
||
|
|
external PC data root is missing.
|
||
|
|
|
||
|
|
External PC and split-data roots are treated as read-only inputs. The validation
|
||
|
|
wrapper can report both locations, but it does not copy, deduplicate, merge,
|
||
|
|
clean, or rewrite either dataset. Use `--pc-data-root` and `--split-data-root`
|
||
|
|
to override local `.env` values for one run. Add `--require-pc-data` only when
|
||
|
|
the four required PlantConnectome JSON files must be present and loaded.
|
||
|
|
|
||
|
|
External resources are cataloged in `config/external_resources_manifest.json`.
|
||
|
|
That manifest is intentionally limited to env key names, usage categories, and
|
||
|
|
read-only repository policy. It must not contain real local paths, API keys,
|
||
|
|
passwords, or host-specific defaults; put those values only in private `.env`.
|
||
|
|
|
||
|
|
## Supported Runtime Surface
|
||
|
|
|
||
|
|
The current supported cleanup surface is deliberately narrow. The canonical
|
||
|
|
classification is stored in `config/runtime_surface_manifest.json` and loaded by
|
||
|
|
`tools/runtime_surface.py`, so audit tools and migration checks use the same
|
||
|
|
runtime file list.
|
||
|
|
|
||
|
|
- `src.rag.extractors.v16_1_2.V16Extractor`
|
||
|
|
- `src.rag.extractors.v16_1_2.paper_metadata_enricher_v16_1_2`
|
||
|
|
- `src.rag.unified`
|
||
|
|
- `scripts/run_v16_1_2_one_paper.py`
|
||
|
|
- `scripts/run_v16_batch10_20260625.py`
|
||
|
|
- `scripts/backfill_v16_paper_metadata.py`
|
||
|
|
- `tools/validate_v16_baseline.py`
|
||
|
|
- `tools/audit_functional_surface_parity.py`
|
||
|
|
- `tools/audit_migration_requirements.py`
|
||
|
|
- `tools/audit_open_source_readiness.py`
|
||
|
|
- `tools/runtime_surface.py`
|
||
|
|
- `config/external_resources_manifest.json`
|
||
|
|
- `config/runtime_surface_manifest.json`
|
||
|
|
- `src/rag/project_config.py`
|
||
|
|
- `.env.example`
|
||
|
|
|
||
|
|
Old extractor versions, historical scripts, archived experiments, and report
|
||
|
|
files remain in the working tree as reference material. They are not treated as
|
||
|
|
public API until they are reviewed and explicitly promoted.
|
||
|
|
|
||
|
|
## Maintained API Entrypoint
|
||
|
|
|
||
|
|
Use the narrow maintained API app during cleanup:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
${GF_PYTHON:-python} -m uvicorn api.app:app --host 127.0.0.1 --port 7900
|
||
|
|
```
|
||
|
|
|
||
|
|
This app exposes `/health` and the reviewed KG routes under `/api/v1`. The older
|
||
|
|
`api/main.py` imports many historical routers and remains on disk for parity, but
|
||
|
|
it is not part of the first supported open-source runtime surface.
|
||
|
|
|
||
|
|
## Open-Source Readiness Audit
|
||
|
|
|
||
|
|
Default `pytest` collection is intentionally limited to the maintained
|
||
|
|
contract, audit, methodology, and V16.1.2 baseline tests. Historical exploratory
|
||
|
|
scripts under `tests/` and `tests/archive/` are retained on disk, but many of
|
||
|
|
them require private papers, retired paths, or live services and are not part of
|
||
|
|
the default open-source gate.
|
||
|
|
|
||
|
|
Run the read-only migration and open-source audits before cleanup commits:
|
||
|
|
|
||
|
|
```bash
|
||
|
|
${GF_PYTHON:-python} tools/audit_functional_surface_parity.py
|
||
|
|
${GF_PYTHON:-python} tools/audit_migration_requirements.py
|
||
|
|
${GF_PYTHON:-python} tools/audit_open_source_readiness.py
|
||
|
|
```
|
||
|
|
|
||
|
|
The functional parity and migration audits require the original source checkout
|
||
|
|
to be configured through private `.env` as `PLANTAI_SOURCE_ROOT`, or passed for a
|
||
|
|
single run with `--source-root`. The repository no longer hard-codes a source
|
||
|
|
project path.
|
||
|
|
|
||
|
|
The functional parity audit compares source and target code/config surfaces. It
|
||
|
|
excludes data, papers, model assets, cache, and experiment outputs, and it only
|
||
|
|
reports missing or extra files; it never copies, deletes, or rewrites files.
|
||
|
|
|
||
|
|
The migration audit checks that the source project remains separate, Git stays
|
||
|
|
local-only, required runtime files are tracked, required env keys are present,
|
||
|
|
and raw data/papers/model weights/experiment outputs are not part of the tracked
|
||
|
|
baseline.
|
||
|
|
|
||
|
|
The audit scans tracked text files for personal absolute paths, credential-like
|
||
|
|
assignments, and dangerous credential defaults. It reports historical findings
|
||
|
|
separately from the current runtime surface and does not edit files or data.
|
||
|
|
|
||
|
|
## Open Cleanup Work
|
||
|
|
|
||
|
|
Cleanup scope is now frozen for this local baseline. Do not continue broad
|
||
|
|
legacy-script or archive cleanup during this phase. Future changes should be
|
||
|
|
limited to issues that affect the maintained runtime surface, make audits fail,
|
||
|
|
or make the real V16/MinerU validation fail.
|
||
|
|
|
||
|
|
Remaining pre-publication items are deliberately narrow:
|
||
|
|
|
||
|
|
- Keep `PC_DATA_ROOT` and `PLANTAI_SPLIT_DATA_ROOT` as two independent
|
||
|
|
external inputs. The strict PC-data validation has passed with a local
|
||
|
|
external PC root; do not deduplicate, merge, rewrite, or vendor these
|
||
|
|
datasets during the code-cleanup phase.
|
||
|
|
- Re-run VLM validation only after local `DASHSCOPE_API_KEY` is configured.
|
||
|
|
- Before any public release, decide whether historical legacy scripts should be
|
||
|
|
removed, archived outside the public repository, or explicitly promoted into
|
||
|
|
the maintained runtime surface.
|