为什么要求更好的输出会错过真正的问题

发布: (2026年1月12日 GMT+8 12:30)
9 分钟阅读
原文: Dev.to

抱歉,我需要您提供要翻译的具体文本内容(除保留的来源链接外),才能为您完成翻译。请把文章的正文粘贴在这里,我会按照要求保留格式并翻译成简体中文。

调试 Ideogram V3 – 不一致的建筑渲染

Problem
昨天我花了四个小时弄清楚为什么 Ideogram V3 不断生成不一致的建筑渲染。白皮书承诺 “改进的空间连贯性”, 但我的输出看起来像是由一个委员会设计的。

Context
我正在构建一个管道,为电商平台生成室内设计的多种变体。白皮书展示了光照完美的建筑空间的精美示例。

Prompt (from the whitepaper)

"Modern minimalist living room, floor-to-ceiling windows, 
natural light, Scandinavian furniture, architectural photography"

Observations

GenerationResult
1‑3完美
4家具漂浮在地面上
5窗户位置改变
10七种不同的房间布局

相同的种子、相同的参数、相同的模型版本。
问题不在于随机性——而在于我把每一次生成都当作独立的过程。白皮书中的示例之所以有效,是因为它们是单独、精心构造的提示。我在进行迭代实验时 没有保持状态

修复方案 – 带记忆的提示上下文

class PromptContext:
    def __init__(self, base_intent):
        self.base_intent = base_intent
        self.style_locks = {}

    def generate_with_memory(self, variation):
        locked = " ".join([f"{k}: {v}" for k, v in self.style_locks.items()])
        return f"{self.base_intent}. {locked}. {variation}"
context = PromptContext("Modern minimalist living room")
context.style_locks["windows"] = "floor-to-ceiling on north wall"
context.style_locks["floor"]   = "light oak hardwood"

成本: ≈ 每次请求多约40%的令牌。
收益: 可用输出从约60%提升至约95%。

白皮书展示的是能力,而非工作流程。当你能够在多个 AI 模型上测试相同的提示时,文档与实际之间的差异就可以量化,而不是令人沮丧。

包装概念 – “高端却平易近人”

简要 – 日本极简主义遇上 1970 年代美国乐观主义。

第一次尝试

{
    "prompt": "Premium beverage packaging, minimalist, warm nostalgic colors, sophisticated",
    "cfg_scale": 7.5,
    "sampler": "DPM++ 2M Karras"
}

结果: 通用的健康品牌美学 – 技术上完美,却在策略上毫无价值。

参数扫描

cfg_scale观察
5.0失去品牌身份
7.5安全、平均的美感
10.0出现了有趣的张力
12.0过度烹调,但仍坚持

解决方案 – 描述极端

prompt_a = """1970s American optimism, warm oranges,
             rounded typography, sunburst graphics"""

prompt_b = """Japanese minimalism, white space,
             geometric precision"""

分别在 cfg_scale=11.0 下生成,然后合成具体元素。

SD3.5 Medium 优化为“没有破损”,目标模糊。给它矛盾的细节和更高的 CFG,你会得到有趣的失败可供利用。三张不可用的图像加上一张精彩的图像,胜过十张平庸的图像。

权衡: ≈ 3× 生成时间,但节省的修订时间让它值得。

模型回归测试 – 时事通讯摘要

场景 – 一个三个月前的流水线生成了每周的时事通讯摘要。

  • v1.2(之前):480 个 token,口语化。
  • v1.3(之后):310 个 token,正式化。

发布说明:“改进了效率和连贯性。” 未提及温度重新缩放。

差异脚本

def model_regression_test(old_model, new_model, test_prompts):
    results = []
    for prompt in test_prompts:
        old_response = generate(old_model, prompt, temp=0.7)
        new_response = generate(new_model, prompt, temp=0.7)

        diff = {
            "length_delta": len(new_response) - len(old_response),
            "formality_delta": analyze_formality(new_response) -
                               analyze_formality(old_response)
        }

        if abs(diff["length_delta"]) > 100:
            print(f"WARNING: Length shift")
        results.append(diff)
    return results

根本原因 – 温度缩放发生了变化:v1.3 中的 temp=0.7 表现得像 v1.2 中的 temp=0.4

修复 – 在生产环境中固定模型版本,并在升级前运行回归测试。

# requirements.txt
nano-banana-pro==1.2.8  # Regression test before upgrade

“改进”往往意味着“不同”。将模型更新视为数据库迁移。并行测试 Nano Banana PRO New 与旧版可以揭示发布说明中隐藏的内容。

Source:

实验日志记录 – 法律免责声明生成

工作流程(上个月)

  1. 在 ChatGPT 中起草提示
  2. 在 Jupyter Notebook 中测试
  3. 在 Notion 中检查结果
  4. 在 Slack 中讨论
  5. 更新 Google 文档
  6. 重新运行 Notebook
  7. 忘记第 1 步的决定

在生成法律免责声明的不同变体时,每个类别都需要特定的监管语言。相同的提示在 ChatGPT 与 Notebook 中产生了不同的结果,因为模型版本不同——花了 30 分钟调试才意识到版本不匹配。

日志系统

import sqlite3, json
from datetime import datetime

class ExperimentLog:
    def __init__(self):
        self.conn = sqlite3.connect("experiments.db")
        self.setup_db()

    def setup_db(self):
        self.conn.execute("""
            CREATE TABLE IF NOT EXISTS experiments (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                timestamp TEXT,
                model TEXT,
                prompt TEXT,
                parameters TEXT,
                output TEXT,
                success INTEGER,
                notes TEXT
            )
        """)
        self.conn.commit()

    def log(self, model, prompt, params, output, success, notes=""):
        self.conn.execute("""
            INSERT INTO experiments 
            (timestamp, model, prompt, parameters, output, success, notes)
            VALUES (?, ?, ?, ?, ?, ?, ?)
        """, (datetime.now().isoformat(),
              model,
              prompt,
              json.dumps(params),
              output[:500],
              int(success),
              notes))
        self.conn.commit()

    def get_successful_prompts(self, model):
        return self.conn.execute("""
            SELECT prompt, parameters FROM experiments 
            WHERE model = ? AND success = 1
            ORDER BY timestamp DESC
        """, (model,)).fetchall()

现在我可以搜索 “上周的法律免责声明”,并检索到确切的参数、模型版本和输出——无需重新发现。

要点

  • Stateful prompting(例如 PromptContext)大幅提升一致性。
  • 极端、矛盾的规范 加上更高的 CFG 可以显现有用的“失败”。
  • 版本固定与回归测试 可防止模型的静默变化(温度、令牌限制等)。
  • 集中式实验日志 防止工具和团队成员之间的知识流失。

上下文切换不仅是生产力的税负——它会将意图碎片化为散布在各工具中的微小决策。一个有纪律的工作流(状态化提示、版本控制、日志记录)可以把 AI 实验从猜谜游戏转变为可重复的工程过程。

Summary

Leena 分享了一套使用语言模型从 PDF 中提取技术需求的工作流。该方法实现了原本需要耗费大量时间的手动过程的自动化。

The Problem

  • 向 ChatGPT 询问特定章节(例如 “第 7 节的数据保留要求是什么?”)时,往往得到 摘要的摘要,而不是准确的规范文本。
  • 手动阅读并提问可能需要数小时。

The Workflow

def chunk_document(pdf_path, chunk_size=4000):
    """Split a PDF into overlapping text chunks."""
    reader = pypdf.PdfReader(pdf_path)
    chunks = []

    for i, page in enumerate(reader.pages):
        text = page.extract_text()
        words = text.split()

        # Overlap of 200 tokens to preserve context across chunks
        for start in range(0, len(words), chunk_size - 200):
            chunks.append({
                "page": i + 1,
                "text": " ".join(words[start:start + chunk_size])
            })
    return chunks
def extract_requirements(pdf_path):
    """Call the LLM on each chunk and collect requirement objects."""
    chunks = chunk_document(pdf_path)
    requirements = []

    for chunk in chunks:
        prompt = f"""Extract technical requirements from:
        Page {chunk['page']}: {chunk['text']}

        Return JSON: {{"requirements": [{{"type": "retention", 
        "spec": "7 years", "section": "7.3.2"}}]}}"""
        
        result = call_llm_api(prompt)          # ← your LLM wrapper
        requirements.extend(result.get("requirements", []))

    return requirements

Sample output

[
  {
    "type": "retention",
    "spec": "7 years for financial records",
    "section": "7.3.2",
    "page": 45
  },
  {
    "type": "retention",
    "spec": "3 years for operational logs",
    "section": "7.3.2",
    "page": 45
  }
]

Trade‑offs

AspectBenefitCost/Consideration
Processing timeReduces manual effort from ~3 h → ~20 minMore CPU/LLM API calls (higher latency)
API expenseFaster insight extractionIncreased token usage → higher cost
AccuracyDirectly pulls spec textDepends on LLM’s parsing reliability

Lessons Learned

  1. Version everything – keep prompts under Git alongside code.
  2. Log early – avoid weeks of lost work by tracking experiments from day 1.
  3. Test edge cases – not just the happy path; PDFs vary wildly in layout.
  4. Treat model updates like schema migrations – automate diff checks between LLM versions.

Call to Action

If you’ve faced similar workflow bottlenecks, feel free to comment or share your own approach.

— Leena

Back to Blog

相关文章

阅读更多 »

你好,我是新人。

嗨!我又回到 STEM 的领域了。我也喜欢学习能源系统、科学、技术、工程和数学。其中一个项目是…