描述
我在使用评审功能时发现后端并没有按照名为 evaluation 的评审提示词中要求的输入格式构建评审输入,而是仅把被评审的章节文本(选中版本或最新版本)直接发送给 LLM。结果导致不同模型表现不一致:有的模型(如 Gemini 2.5 Pro)会在格式不符时仍然“硬生成”评审结果并可能出现对不存在内容的评审;有的模型(如 GPT-5.2)会明确提示缺少上下文并返回不完整或错误的评审决策。
问题定位
问题代码位于 backend/app/api/routers/writer.py,大致位置在大约 888 行到 908 行(evaluate_chapter 函数中)。当前逻辑是直接把 version_to_evaluate.content 作为 LLM 的用户输入:
|
# 如果没有选中版本,使用最新版本进行评审 |
|
version_to_evaluate = chapter.selected_version |
|
if not version_to_evaluate: |
|
# 获取该章节的所有版本,选择最新的一个 |
|
from sqlalchemy.orm import selectinload |
|
stmt_versions = ( |
|
select(Chapter) |
|
.options(selectinload(Chapter.versions)) |
|
.where( |
|
Chapter.project_id == project_id, |
|
Chapter.chapter_number == request.chapter_number, |
|
) |
|
) |
|
result_versions = await session.execute(stmt_versions) |
|
chapter_with_versions = result_versions.scalars().first() |
|
|
|
if not chapter_with_versions or not chapter_with_versions.versions: |
|
raise HTTPException(status_code=400, detail="该章节还没有生成任何版本,无法进行评审") |
|
|
|
# 使用最新的版本(列表中的最后一个) |
|
version_to_evaluate = chapter_with_versions.versions[-1] |
- 期望输入:按照 evaluation 提示词的要求,传入一个 JSON 结构,包含小说蓝图(world blueprint)、前序章节及其摘要、以及待评审章节内容等上下文信息,以便 LLM 基于完整上下文进行评审。
- 实际输入:仅传入待评审章节的内容字符串(version_to_evaluate.content)。
复现步骤
- 使用项目生成若干章节并生成多个版本(或编辑章节)。
- 在某个章节点击 AI 评审。
- 在模型为 Gemini-2.5-Pro 时,观察返回评审结果有时会“凭空”生成与实际版本不相关的评审(模型忽略格式)。
- 在模型为 GPT-5.2 时,观察返回会指出缺少蓝图/前序摘要等上下文并将评审标为失败或返回不完整建议。
实际行为(示例)
描述
我在使用评审功能时发现后端并没有按照名为
evaluation的评审提示词中要求的输入格式构建评审输入,而是仅把被评审的章节文本(选中版本或最新版本)直接发送给 LLM。结果导致不同模型表现不一致:有的模型(如 Gemini 2.5 Pro)会在格式不符时仍然“硬生成”评审结果并可能出现对不存在内容的评审;有的模型(如 GPT-5.2)会明确提示缺少上下文并返回不完整或错误的评审决策。问题定位
问题代码位于 backend/app/api/routers/writer.py,大致位置在大约 888 行到 908 行(evaluate_chapter 函数中)。当前逻辑是直接把 version_to_evaluate.content 作为 LLM 的用户输入:
arboris-novel/backend/app/api/routers/writer.py
Lines 888 to 908 in dd80c69
复现步骤
实际行为(示例)
Gemini(宽容于输入格式):会生成看起来完整但可能不基于实际小说蓝图和前序章节的评审,甚至选择错误的版本为“最佳”并给出不一致的理由。
gemini2.5_v1.txt
gemini2.5_v2.txt
GPT(严格格式或语义检查):会明确提示缺少上下文(如蓝图或前序章节摘要),并可能直接返回“选择版本 1,但缺少其他内容”的结果或失败信息。
gpt5.2.txt