Add DeepSeek QQwrite brief workflow

This commit is contained in:
qyh15 2026-05-27 22:44:17 +08:00
parent ec1f706d39
commit dd93e33b12
5 changed files with 184 additions and 11 deletions

View File

@ -16,8 +16,8 @@ It can also route through the user's Zotero/Obsidian literature-note workflow:
extract keywords from the manuscript topic or draft, use QQnote-generated extract keywords from the manuscript topic or draft, use QQnote-generated
Zotero child notes or paper tables as literature inputs, ask DeepSeek to screen Zotero child notes or paper tables as literature inputs, ask DeepSeek to screen
those candidate notes into strongly related and weakly related papers under those candidate notes into strongly related and weakly related papers under
QQsci's rules, then use those papers to improve positioning, introduction QQsci's rules, ask DeepSeek to draft a structured QQwrite brief from the
logic, comparison, novelty framing, and citations. screened papers, then have QQsci check the brief before passing it to QQwrite.
## Core stance ## Core stance
@ -46,6 +46,7 @@ logic, comparison, novelty framing, and citations.
| [references/comparative-review-audit.md](references/comparative-review-audit.md) | User wants a Nature-response-like pre-review based on comparison with strongly related papers, including missing experiments, format, figures, spelling, and terminology consistency | | [references/comparative-review-audit.md](references/comparative-review-audit.md) | User wants a Nature-response-like pre-review based on comparison with strongly related papers, including missing experiments, format, figures, spelling, and terminology consistency |
| [references/submission-package-audit.md](references/submission-package-audit.md) | User provides or mentions a submission package with manuscript, Supporting Information, highlights, cover letter, figures, SI figures, TOC, graphical abstract, or related Word/PPT files | | [references/submission-package-audit.md](references/submission-package-audit.md) | User provides or mentions a submission package with manuscript, Supporting Information, highlights, cover letter, figures, SI figures, TOC, graphical abstract, or related Word/PPT files |
| [references/literature-routing.md](references/literature-routing.md) | User wants Zotero/Obsidian/DeepSeek note search, strong/weak related-paper screening, keyword extraction, or literature-grounded rewriting | | [references/literature-routing.md](references/literature-routing.md) | User wants Zotero/Obsidian/DeepSeek note search, strong/weak related-paper screening, keyword extraction, or literature-grounded rewriting |
| [references/qqwrite-brief.md](references/qqwrite-brief.md) | DeepSeek screening results need to be converted into a QQwrite writing brief or checked before QQwrite consumes them |
| [references/word-citation-comments.md](references/word-citation-comments.md) | User wants citation insertion guidance in Word, reference placement, DOI-only comments, or annotated `.docx` citation suggestions | | [references/word-citation-comments.md](references/word-citation-comments.md) | User wants citation insertion guidance in Word, reference placement, DOI-only comments, or annotated `.docx` citation suggestions |
| [references/zotero-obsidian-subskill.md](references/zotero-obsidian-subskill.md) | User asks QQsci to obtain or refresh literature-note inputs through QQnote, including Zotero child-note summaries or paper comparison tables | | [references/zotero-obsidian-subskill.md](references/zotero-obsidian-subskill.md) | User asks QQsci to obtain or refresh literature-note inputs through QQnote, including Zotero child-note summaries or paper comparison tables |
| [references/configuration.md](references/configuration.md) | You need DeepSeek, Zotero, Obsidian, QQnote inheritance, config precedence, secret handling, or wrapper-script usage | | [references/configuration.md](references/configuration.md) | You need DeepSeek, Zotero, Obsidian, QQnote inheritance, config precedence, secret handling, or wrapper-script usage |
@ -133,14 +134,19 @@ DeepSeek/AwesomeGPT Zotero notes generated by QQnote or equivalent sources.
- `weakly related`: same direction, adjacent material family, same - `weakly related`: same direction, adjacent material family, same
characterization logic, similar device architecture, or useful writing characterization logic, similar device architecture, or useful writing
pattern. pattern.
5. Use strongly related papers for novelty, gap, introduction, benchmark, and 5. Ask DeepSeek to generate a `qqwrite_brief` from the screened papers when the
next step is QQwrite drafting or template-driven `.docx` generation. Open
`references/qqwrite-brief.md` for the schema and checks.
6. QQsci checks the brief for required fields, DOI preservation, obvious
overclaims, weak-paper misuse, and missing author evidence before handoff.
7. Use strongly related papers for novelty, gap, introduction, benchmark, and
citation placement. citation placement.
6. Use weakly related papers for broader field framing, mechanism language, 8. Use weakly related papers for broader field framing, mechanism language,
section architecture, and cautious comparison. section architecture, and cautious comparison.
7. For Word manuscript citation suggestions, open 9. For Word manuscript citation suggestions, open
`references/word-citation-comments.md` and add native Word comments that `references/word-citation-comments.md` and add native Word comments that
contain DOI strings only. contain DOI strings only.
8. Return a source map before or with the manuscript revision. Never cite a 10. Return a source map before or with the manuscript revision. Never cite a
paper only because the title seems similar. paper only because the title seems similar.
## Comparative pre-review workflow ## Comparative pre-review workflow

View File

@ -127,8 +127,9 @@ QQsci and then QQwrite:
} }
``` ```
If the output will feed QQwrite, QQsci should convert the screened papers into a If the output will feed QQwrite, ask DeepSeek to generate the `qqwrite_brief`
`qqwrite_brief`-style section plan rather than passing raw notes directly. draft from the screened papers, then let QQsci validate and clean the brief
before QQwrite consumes it. See `qqwrite-brief.md`.
## Strong vs weak relation rules ## Strong vs weak relation rules

122
references/qqwrite-brief.md Normal file
View File

@ -0,0 +1,122 @@
# QQwrite Brief
Use this file when DeepSeek screening results need to become an input package
for QQwrite.
## Ownership
DeepSeek may generate the `qqwrite_brief` draft from:
- the manuscript profile
- author evidence and figure notes
- QQnote/Zotero/Obsidian note candidates
- DeepSeek-screened strong/weak related papers
- target journal and template choice
QQsci owns:
- the brief schema
- the prompt that asks DeepSeek to generate the brief
- schema validation
- obvious overclaim and DOI-preservation checks
- handoff to QQwrite
QQwrite consumes the brief. QQwrite should not re-screen literature or decide
which papers are strong/weak.
## Required Schema
Ask DeepSeek to return JSON whenever possible:
```json
{
"target_journal": "",
"article_type": "",
"recommended_word_template": "afm/article-template.docx",
"material_system": "",
"application": "",
"central_claim": "",
"novelty_gap": "",
"design_principle": "",
"key_author_evidence": [
{
"evidence": "",
"source": "manuscript / figure / SI / author note",
"supports": ""
}
],
"strong_related_papers": [
{
"doi": "",
"title": "",
"usable_for": [],
"must_cite_near": [],
"reason": ""
}
],
"weak_related_papers": [
{
"doi": "",
"title": "",
"usable_for": [],
"reason": ""
}
],
"section_plan": {
"Title": [],
"Abstract": [],
"Introduction": [],
"Results and Discussion": [],
"Conclusion": [],
"Experimental Section": []
},
"claim_reference_map": [
{
"claim": "",
"author_evidence": "",
"supporting_dois": [],
"writing_location": "",
"status": "supported / needs author evidence / citation only / do not claim"
}
],
"must_not_overclaim": [],
"missing_inputs": [],
"qqwrite_instructions": []
}
```
## DeepSeek Prompt
Give DeepSeek the screened-paper JSON and ask:
```text
Using the screened strong/weak related papers and the author-provided manuscript
evidence, generate a QQwrite writing brief.
Rules:
1. Do not invent experimental results, mechanisms, references, DOI values, or
figure numbers.
2. Strong papers may define novelty, direct comparison, benchmark, and citation
placement.
3. Weak papers may support field framing, mechanism language, or writing
structure, but must not be treated as direct benchmark papers.
4. Every major claim must include author evidence, supporting DOI, or a clear
status explaining that it still needs evidence.
5. Preserve DOI strings exactly as provided.
6. Return JSON only, following the QQwrite brief schema.
```
## QQsci Check Before Handoff
Before passing the brief to QQwrite, check:
- required top-level fields are present
- `central_claim` is backed by author evidence
- every DOI came from the screened output or user input
- weak papers are not used as direct benchmark unless justified
- `must_not_overclaim` and `missing_inputs` are not empty when evidence is
incomplete
- `recommended_word_template` points to a QQwrite-owned template
If the brief fails checks, mark the issue in `missing_inputs` or ask DeepSeek to
repair only the failed fields. Do not let QQwrite consume a malformed brief.

View File

@ -32,7 +32,10 @@ Recommended handoff:
1. QQsci extracts claims, evidence, related papers, target-journal positioning, 1. QQsci extracts claims, evidence, related papers, target-journal positioning,
and package risks. and package risks.
2. QQwrite uses the selected template and QQsci's structured outputs to draft or 2. DeepSeek generates a `qqwrite_brief` draft from screened papers and author
format the manuscript. evidence.
3. QQsci audits the resulting package again against figures, SI, and strong 3. QQsci validates the brief and passes it to QQwrite.
4. QQwrite uses the selected template and checked brief to draft or format the
manuscript.
5. QQsci audits the resulting package again against figures, SI, and strong
related papers. related papers.

View File

@ -94,6 +94,46 @@ Output JSON keys:
""" """
def build_brief_prompt(profile: dict[str, object]) -> str:
return f"""After screening the literature notes, generate a QQwrite writing brief for this materials-science manuscript.
Manuscript profile:
- Material/system terms: {', '.join(profile.get('exact_or_chemical_terms', [])) or 'xxx'}
- Material family: {', '.join(profile.get('material_family_hints', [])) or 'xxx'}
- Device/application: {', '.join(profile.get('device_application_hints', [])) or 'xxx'}
- Target journal or tier: {profile.get('target_journal') or 'xxx'}
- Extra author notes: {profile.get('extra_notes') or 'xxx'}
Use the screened strongly_related_papers and weakly_related_papers as input.
Rules:
1. Do not invent experimental results, mechanisms, references, DOI values, or figure numbers.
2. Strong papers may define novelty, direct comparison, benchmark, and citation placement.
3. Weak papers may support field framing, mechanism language, or writing structure, but must not be treated as direct benchmark papers.
4. Every major claim must include author evidence, supporting DOI, or a clear status explaining that it still needs evidence.
5. Preserve DOI strings exactly as provided.
6. Return JSON only.
Output JSON keys:
- target_journal
- article_type
- recommended_word_template
- material_system
- application
- central_claim
- novelty_gap
- design_principle
- key_author_evidence
- strong_related_papers
- weak_related_papers
- section_plan
- claim_reference_map
- must_not_overclaim
- missing_inputs
- qqwrite_instructions
"""
def main() -> int: def main() -> int:
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
parser.add_argument("--draft", required=True, help="UTF-8 text or markdown draft path") parser.add_argument("--draft", required=True, help="UTF-8 text or markdown draft path")
@ -108,6 +148,7 @@ def main() -> int:
profile["target_journal"] = args.target_journal profile["target_journal"] = args.target_journal
profile["extra_notes"] = args.extra_notes profile["extra_notes"] = args.extra_notes
profile["screening_prompt"] = build_prompt(profile) profile["screening_prompt"] = build_prompt(profile)
profile["brief_prompt"] = build_brief_prompt(profile)
data = json.dumps(profile, ensure_ascii=False, indent=2) data = json.dumps(profile, ensure_ascii=False, indent=2)
if args.json_out: if args.json_out: