18 KiB
GEO Agent Article Optimizer MVP Design
Goal
Build a lightweight internal web tool for optimizing pasted GEO-related articles while preventing the issues observed in GEO生成文章改动点(0422).docx: industry drift, image-text mismatch, third-party voice in official articles, platform mismatch, incomplete company names, title/body grammar issues, hallucinated claims, inconsistent claims, context-insensitive sensitive-word handling, and useless content.
The first version validates the content quality loop before investing in batching, permissions, publishing integrations, or complex document parsing.
MVP Scope
The MVP is a local web application:
- User pastes title, body, image descriptions or image links, and selects the target platform.
- System extracts a candidate fact card.
- User confirms or edits the fact card.
- Confirmed fact card is saved as a reusable local brand template.
- System generates three optimization candidates under fact-card constraints:
标准GEO版,去AI味版, and综合增强版. - System runs quality gates for each candidate.
- Failed checks trigger targeted rewriting for up to two rounds inside each candidate path.
- System scores each candidate for GEO quality and AI-flavor/style quality.
- User compares all candidates side by side, with
综合增强版highlighted as the recommended default. - User downloads Markdown, Word, and QA artifacts for the selected candidate or the full comparison.
Explicitly Out Of Scope
- Account permissions.
- Multi-user collaboration.
- Publishing platform APIs.
- Batch queues.
- Direct
.docxupload parsing. - Complex Word template layout.
- Automatic use of unconfirmed facts.
User Flow
flowchart TD
A["Input Article"] --> B["Auto Analyze"]
B --> C["Confirm Fact Card"]
C --> D["Generate Three Candidates"]
D --> E1["标准GEO版 QA"]
D --> E2["去AI味版 QA"]
D --> E3["综合增强版 QA"]
E1 --> F["Compare Results"]
E2 --> F
E3 --> F
F --> G["Select Candidate"]
G --> H["Download Markdown / Word / QA"]
Page Areas
Article Input
Fields:
- Title.
- Body.
- Image description or image link.
- Target platform: official site, media article, comparison review, recommendation list.
- User instructions.
The first version accepts pasted text instead of .docx upload to avoid early complexity around Word layout parsing.
Fact Card Confirmation
The system extracts candidate facts, but they are not treated as truth until the user confirms them.
Fields:
- Company full name.
- Company short names.
- Brand names.
- Product names.
- Target industry.
- Target audience.
- Experience years.
- Core claims.
- Forbidden claims.
- Image topics.
- Uncertain items.
The user must resolve uncertain items before optimization starts.
Candidate Comparison
Display:
- Candidate label:
标准GEO版,去AI味版, or综合增强版. - Method summary that explains what this candidate optimized for.
- Optimized title.
- Summary.
- Optimized body.
- QA status and failed/warned rule count.
- GEO score.
- AI-flavor/style score.
- Timing.
- Changed sections.
The UI should mark content that needs user confirmation and should make
综合增强版 visually identifiable as the recommended default without hiding the
other two candidates.
Quality Report
Display each gate as pass, warn, or fail, with evidence, reason, suggested fix, and target rewrite module.
Export
Downloads:
- Selected candidate:
optimized.md,optimized.docx,qa_report.json. - Full comparison:
variant_comparison.json. - If all candidate files are exported together, use stable Chinese labels in the
metadata and ASCII-safe file names on disk, such as
standard-geo.md,anti-ai-flavor.md, andintegrated-enhanced.md.
Internal Agent Nodes
The product is delivered as a simple web app, but the internals are split into explicit workflow nodes.
flowchart LR
A["InputNormalizer"] --> B["FactExtractor"]
B --> C["UserConfirmedFactCard"]
C --> D["OptimizationVariantPlanner"]
D --> E1["标准GEO版 ArticleOptimizer"]
D --> E2["去AI味版 ArticleOptimizer"]
D --> E3["综合增强版 ArticleOptimizer"]
E1 --> F1["QualityInspector + StyleScorer"]
E2 --> F2["QualityInspector + StyleScorer"]
E3 --> F3["QualityInspector + StyleScorer"]
F1 -->|fail| G1["TargetedRewriter"]
F2 -->|fail| G2["TargetedRewriter"]
F3 -->|fail| G3["TargetedRewriter"]
G1 --> F1
G2 --> F2
G3 --> F3
F1 --> H["VariantComparator"]
F2 --> H
F3 --> H
H --> I["Exporter"]
LLM Provider Integration
Workflow nodes use a local LLM client abstraction instead of calling a vendor API directly. The first implementation uses DeepSeek by default, while keeping the provider boundary open for later OpenAI-compatible providers.
Environment variables:
LLM_PROVIDER=deepseek
DEEPSEEK_API_KEY=
DEEPSEEK_BASE_URL=https://api.deepseek.com
DEEPSEEK_MODEL=deepseek-v4-pro
DEEPSEEK_THINKING=disabled
Rules:
src/lib/llm/client.tsexposesgenerateText,generateJson<T>,generateValidatedJson,isLlmConfigured, andgetLlmProviderStatus.LLM_PROVIDERdefaults todeepseekwhen unset.- DeepSeek is accessed through the OpenAI-compatible SDK with
baseURLset tohttps://api.deepseek.com. generateJson<T>must use JSON output mode and prompts that explicitly require valid JSON only.- Thinking mode is disabled by default for deterministic article rewrites and structured QA output.
- Missing credentials and provider failures surface as explicit API errors; the workflow must not silently fall back when the user expects live LLM behavior.
- Provider errors are normalized inside the LLM client before they reach workflow nodes or API routes.
InputNormalizer
Purpose: normalize page input into clean structured data.
Input:
- Title.
- Body.
- Image descriptions or links.
- Target platform.
- User instructions.
Output:
article_draftimage_assetspublish_context
This node does not optimize content.
FactExtractor
Purpose: extract candidate facts from the source article.
Output:
company_full_namecompany_short_namebrand_namesproduct_namestarget_industrytarget_audienceexperience_yearscore_claimsforbidden_claimsimage_topicsuncertain_items
Low-confidence facts must go into uncertain_items.
UserConfirmedFactCard
Purpose: provide hard constraints for all downstream nodes.
Rules:
- No downstream node may invent numbers, qualifications, clients, cases, or experience years outside the confirmed fact card.
- Company and product names must follow the fact card.
- Industry and audience must not drift from the fact card.
- Sensitive words must be handled by context, not removed mechanically.
ArticleOptimizer
Purpose: improve title, summary, body, structure, and image suggestions under fact-card constraints.
Allowed:
- Improve fluency.
- Fix grammar.
- Adjust structure.
- Improve platform fit.
- Remove useless content.
- Improve transitions.
Forbidden:
- Invent claims.
- Change company or product names.
- Change industry.
- Add exaggerated marketing promises.
OptimizationVariantPlanner
Purpose: create a fixed set of candidate methods for one confirmed fact card.
The first comparison version always creates exactly three candidates:
| Variant Key | Label | Method |
|---|---|---|
standard_geo |
标准GEO版 |
Current GEO rewrite behavior: fact-card fidelity, platform fit, clear structure, and QA repair. |
anti_ai_flavor |
去AI味版 |
GEO rewrite plus localized Stop Slop rules to remove AI-flavored prose patterns. |
integrated_enhanced |
综合增强版 |
Balances GEO density, factual trust, platform fit, readability, and AI-flavor reduction. |
Candidate generation may run sequentially in the first implementation to avoid provider rate-limit problems and to keep progress events understandable. The API response still returns the three candidates together for side-by-side comparison.
Stop Slop / AI-Flavor Rules
The hardikpandya/stop-slop repository is an MIT-licensed writing skill rather
than an installable runtime dependency. The original rules are mostly English
writing rules, so the product should not copy them blindly into Chinese article
optimization.
The first implementation uses localized guidance derived from the rule intent:
- Remove template openers and filler transitions, such as generic "本文将", "值得注意的是", "从某种意义上", and repeated "通过...实现..." chains.
- Replace empty business language with concrete claims already present in the fact card.
- Avoid formulaic contrast paragraphs that first list what something is not and then reveal what it is.
- Avoid slogan-like short fragments that sound like pull quotes instead of article prose.
- Prefer active, specific Chinese sentences with clear actors when the source facts identify an actor.
- Vary paragraph length and sentence rhythm without using theatrical emphasis.
If substantial text from the upstream Stop Slop files is copied into this repository, add the MIT license notice to the committed artifact. A distilled Chinese rule set written for this product can live in source without vendoring the upstream repository.
QualityInspector
Purpose: convert the document's issue list into executable quality gates.
Each check returns:
status:pass,warn, orfail.evidence: source or optimized text snippet.reason: why the check passed or failed.suggested_fix: how to fix it.target_agent: rewrite target when failed.
TargetedRewriter
Purpose: fix only failed checks.
Examples:
- Rewrite only the title for title quality failures.
- Adjust only the affected paragraph for body quality failures.
- Normalize company names for fact consistency failures.
- Delete or mark unsupported claims for hallucination risk.
- Warn instead of rewriting when image-text confidence is low.
StyleScorer
Purpose: score each candidate for AI-flavor risk and naturalness without turning style concerns into hard QA failures.
The first version returns a 0-50 score with five 0-10 dimensions:
| Dimension | Question |
|---|---|
directness |
Does the article state concrete points instead of announcing them? |
rhythm |
Do sentence and paragraph lengths vary naturally? |
specificity |
Are claims concrete and tied to the fact card? |
trust |
Does the prose avoid exaggerated intimacy, sweeping claims, and unsupported certainty? |
density |
Can obvious filler be removed without losing meaning? |
Scores below 35 should show a visible warning on the candidate card. They should not block export.
GeoScore
Purpose: reuse the existing GEO article performance rubric to score each candidate for fact integrity, platform fit, search intent fit, answer density, trust signal quality, and readability.
The score is computed from the candidate article plus its QA report. It is a comparison aid for the three candidates, not a publishing guarantee.
VariantComparator
Purpose: assemble the candidate list for the API response and frontend.
Each candidate result includes:
variant_keyvariant_labelmethod_summaryarticleqa_reportgeo_scorestyle_scorerewrite_roundstimingis_recommended
integrated_enhanced is recommended by default unless it has a hard QA failure
and another candidate does not.
Quality Gates
| Rule ID | Issue Prevented | First Version Behavior |
|---|---|---|
industry_alignment |
Industry drift | Compare article against fact-card industry and audience. |
image_text_match |
Image-text mismatch | Compare image descriptions/topics with nearby article sections. |
voice_consistency |
Third-party voice in official articles | Enforce platform-specific tone. |
platform_fit |
Wrong article type for platform | Compare style and structure against target platform. |
company_name_integrity |
Incomplete company name | Compare against confirmed company full name and allowed short names. |
title_quality |
Title grammar issues | Detect awkward, keyword-stuffed, or semantically broken titles. |
body_quality |
Body grammar issues | Detect long sentences, unclear references, and broken logic. |
hallucination_risk |
Fabricated or misleading claims | Reject claims not traceable to the confirmed fact card. |
claim_consistency |
Inconsistent years/products/services | Scan and normalize repeated factual claims. |
context_sensitive_terms |
Blind sensitive-word deletion | Warn when wording needs context-aware handling. |
Hard Fail
- Incomplete or inconsistent company name.
- New numbers, qualifications, customer cases, or other claims outside the fact card.
- Clear industry drift.
- Severe title grammar failure.
- Conflicting experience years, product names, or service names.
Warn
- Low-confidence image-text match.
- Uncertain sensitive-word context.
- Weak platform fit.
- Overly promotional or low-density paragraphs.
Auto Fix
- Body grammar.
- Useless content.
- Third-party voice when platform is official site.
Data Model
The first version uses local SQLite plus an export folder.
The first implementation can reuse the existing optimized_articles and
qa_reports tables by saving each candidate as a normal article revision with
variant metadata inside the JSON payload. The matching QA report is saved
against that revision. A separate comparison-run table is out of scope until the
product needs historical side-by-side comparison beyond the immediate job
result.
data/
app.db
exports/
job_xxx/
optimized.md
optimized.docx
qa_report.json
variant_comparison.json
standard-geo.md
anti-ai-flavor.md
integrated-enhanced.md
brand_template
Reusable confirmed brand facts.
{
"id": "brand_xxx",
"brand_name": "Brand",
"company_full_name": "Company Ltd.",
"company_short_names": ["Company"],
"product_names": ["Product"],
"target_industries": ["GEO optimization"],
"target_audience": ["Marketing teams"],
"verified_claims": ["More than ten years of industry experience"],
"forbidden_claims": ["Do not claim industry first without proof"],
"tone_rules": {
"official_site": "brand first-person or official voice",
"media": "objective third-party voice"
},
"updated_at": "2026-06-16T10:00:00+08:00"
}
article_job
One optimization task.
{
"id": "job_xxx",
"brand_template_id": "brand_xxx",
"source_title": "Original title",
"source_body": "Original body",
"image_inputs": [
{
"type": "description",
"content": "Product dashboard screenshot"
}
],
"publish_platform": "official_site",
"status": "qa_failed",
"created_at": "2026-06-16T10:05:00+08:00"
}
fact_card
Confirmed facts for one job.
{
"job_id": "job_xxx",
"source": "auto_extract_then_user_confirmed",
"company_full_name": "Company Ltd.",
"product_names": ["Product"],
"target_industry": "GEO optimization",
"publish_intent": "official article",
"locked_claims": ["More than ten years of industry experience"],
"uncertain_items": [],
"confirmed_by_user": true
}
optimized_article
One revision of optimized content.
{
"job_id": "job_xxx",
"revision": 2,
"variant_key": "integrated_enhanced",
"variant_label": "综合增强版",
"method_summary": "同时优化GEO信息密度、事实可信度、平台适配和表达自然度。",
"title": "Optimized title",
"summary": "Optimized summary",
"body_markdown": "Optimized body in Markdown",
"image_suggestions": [
{
"source": "image_1",
"suggestion": "Use product dashboard screenshot; avoid unrelated people photos"
}
],
"changed_sections": ["title", "first paragraph"],
"geo_score": {
"total": 8.1,
"rationale": "事实一致性与答案密度较好,平台适配仍需复核。"
},
"style_score": {
"total": 42,
"dimensions": {
"directness": 8,
"rhythm": 8,
"specificity": 9,
"trust": 8,
"density": 9
},
"warnings": []
}
}
qa_report
Quality checks for one revision.
{
"job_id": "job_xxx",
"revision": 2,
"overall_status": "warn",
"checks": [
{
"rule_id": "hallucination_risk",
"status": "pass",
"evidence": "No new unsupported factual claims found",
"reason": "All factual claims are traceable to the confirmed fact card",
"target_agent": null
}
]
}
Error Handling
Fact Extraction
Optimization is disabled until the user resolves uncertain facts.
Examples:
- Only a company short name is found.
- Multiple product names appear.
- Multiple experience-year claims appear.
- Target industry is unclear.
- Image description is missing.
QA Failure
Hard failures do not block export in the current product direction. The app must preserve export files and show visible warnings so the user can review the candidate manually.
Failed checks trigger targeted rewrite for up to two rounds inside each candidate. After two failed rounds, the app stops rewriting that candidate and shows manual review fields.
Acceptance Criteria
The MVP is complete when:
- User can paste title, body, image descriptions, and target platform.
- System can extract a fact card and require user confirmation.
- Confirmed fact card can be saved and reused as a local brand template.
- System can generate an optimized article without changing confirmed facts.
- System can generate exactly three labeled candidates:
标准GEO版,去AI味版, and综合增强版. - System can generate a structured QA report for the 10 quality gates for each candidate.
- System can score and compare the three candidates for AI-flavor/style quality.
- QA failures and low style scores remain visible but do not remove export links.
- User can download Markdown, a basic Word document, QA JSON, and a comparison JSON artifact.
Minimum Test Samples
Prepare at least five sample articles:
- Industry drift sample.
- Incorrect or incomplete company name sample.
- Title grammar sample.
- Conflicting experience-year sample.
- Image-text mismatch sample.
These samples cover the most important risks from the source document and keep the first validation loop focused.