返回首页
🤖 AI / LLM

RAG 检索质量工程实战 2026:从"能答"到"答得准"的完整优化链路

搭出一个能跑通的 RAG Demo 只需一个下午,但让它在你自己的数据上稳定"答得准"却要难得多:切分颗粒度、召回率、重排序、查询改写、上下文组装、引用与拒答,每一环都在决定最终答案的质量。2026 年的共识是,RAG 的瓶颈早已不在模型,而在检索质量工程。本文把整条链路拆开讲透:从可测量的流水线设计,到切片策略、混合检索、重排序、多路召回、上下文去噪与防幻觉,再到离线评测与在线反馈闭环,最后给出一份可照做的落地清单。

RAG · 检索增强 · 向量检索 · 重排序 · 混合检索 · 评测 · LLM · 上下文工程 · Embedding · 幻觉
��

今日技术简讯

📰 技术简讯 · 2026-10-14

今日聚合 6 条热门技术内容(中文素材优先)。

🤖 AI / LLM

1. Character.AI 申请破产保护,迪士尼成为首顺位竞标者

  • 链接:https://www.cbsnews.com/news/character-ai-files-bankruptcy-disney-license/
  • 来源:CBS News
  • 摘要:明星 AI 应用 Character.AI 依破产法申请保护,称长期承压于法律、监管与运营成本,迪士尼作为首顺位竞标者出价收购其部分资产与技术许可。这是生成式 AI 热潮中首个走向破产出售的知名独角兽,也把"高算力成本 + 弱变现"的商业模式风险摆上台面。

2. 科大讯飞将发布星火 X2.6 与"云+端"协同方案

  • 链接:https://finance.sina.com.cn/jjxw/2026-10-14/doc-iniveqvi7782934.shtml
  • 来源:新浪财经
  • 摘要:讯飞全球 1024 开发者节将于 10 月 22 日举行,主论坛将发布讯飞星火 X2.6 以及基于全国产算力的"云+端"协同方案,目标是让更多任务在本地完成、复杂任务端云协同处理。这反映国产算力与端侧推理结合的落地路线正在加速。

🎨 前端 / Web

3. TanStack Start 1.0 正式稳定:React 全栈框架进入生产可用

  • 链接:https://tanstack.com/blog/tanstack-start-1-0
  • 来源:TanStack
  • 摘要:TanStack 宣布其全栈 React 框架 Start 1.0 达到稳定,SSR、Server Routes 与 Server Functions 等核心能力完备。这意味着 React 全栈方案在 Next.js 之外多了一个基于 Vite 的新选择,开发者可按部署形态与团队习惯做取舍。

4. Mozilla 推出 Firefox Enterprise:可自托管控制台,主打数字主权

  • 链接:https://blog.mozilla.org/en/firefox/introducing-firefox-enterprise/
  • 来源:Mozilla
  • 摘要:Mozilla 发布 Firefox Enterprise,在企业版浏览器之外提供可自托管的管理控制台,便于集中管控浏览器策略、数据流向与 AI 功能使用,面向安全合规要求高的机构。产品以独立 Gecko 引擎强调"数字主权",首批重点市场放在欧洲。

⚙️ 后端 / 架构

5. Node.js 26.11.0 发布:新增 Buffer 与 HTTP 多项 API

  • 链接:https://nodejs.org/en/blog/release/v26.11.0
  • 来源:Node.js
  • 摘要:Node.js 26.11.0(Current)发布,新增 buffer.isLatin1()、Buffer.stringLength()、HTTP 头部校验相关 API、http2 的连接窗口配置,以及 histogram.diff() 等能力。这些增量让运行时的内存处理与可观测性工具更加完善,无需等待大版本即可受益。

🚀 独立开发 / OPC

6. 19 岁独立开发者数月做到月入五位数:AI 构建 + 社交媒体分发

  • 链接:https://www.starterstory.com/stories/i-m-19-and-i-built-this-11k-month-saas
  • 来源:Starter Story
  • 摘要:Starter Story 报道,19 岁的 Vadim 此前从未发布过 App,辞职后全职以"用 AI 构建 + 社交媒体分发"的方式推进自己的 SaaS,数月内做到月入五位数并获得可观用户量。案例的价值不在年龄,而在验证了单人开发者借助 AI 大幅缩短从想法到变现周期的新节奏。

数据来源:掘金 / InfoQ 中文 / 即刻 / 少数派 / HN 采集日期:2026-10-14 (UTC+8)

��

今日深度文

RAG 检索质量工程实战 2026:从"能答"到"答得准"的完整优化链路

几乎每个团队都经历过这个阶段:第一天搭出一个 RAG Demo,问几个问题,答案看起来像模像样,于是信心满满地宣布"检索增强搞定了"。然后把它交给真实用户,问题开始暴露——用户问 A,检索却捞回了内容相近但主题不同的 B 文档;文档里明明写了答案,模型却答"资料中没有相关信息";或者更糟,模型自信地编出一段原文里根本没有的话。RAG 的难点从来不是"能不能接上向量库",而是"检索出来的东西对不对、够不够、模型有没有用好"。这篇文章要讲的,就是这条从"能答"到"答得准"的完整链路。


一、先承认一个事实:RAG 的瓶颈大多在检索,不在生成

很多团队优化 RAG 的第一反应是"换个更强的模型"。但对绝大多数问答场景,模型能力早已过剩,真正拖后腿的是送进模型的上下文质量。

一个典型的失败归因:

  用户提问 → 检索 → 上下文 → 生成 → 答案

  答案不对时,先问三个问题(按优先级):
  ① 正确的那段内容,检索的时候被捞回来了吗?(召回问题)
  ② 捞回来了,但排在很后面,被截断丢了吗?(排序问题)
  ③ 都在上下文里,模型却没用对?(组装/提示问题)

这三个问题的排查顺序不能颠倒,因为它们对应的修复成本天差地别。**召回不到,换模型永远没用;排序不对,加大 top-k 只会引入更多噪声;只有确认前两者都没问题,才轮到去调提示词和模型。**把这条纪律写进团队的排错文档,能省下大量无效实验。


二、把 RAG 变成可测量的流水线

在动手优化之前,先让整条链路"可被度量"。没有评测的优化是盲人摸象——你改了一个参数,感觉变好了,但说不清是不是运气。

RAG 流水线的六个可观测环节:

  ① 切分 Chunking   → 文档被切成什么粒度的片段
  ② 向量化 Embedding → 片段如何被编码成向量
  ③ 召回 Retrieval   → 从库里取出候选集
  ④ 重排 Rerank      → 对候选集重新打分排序
  ⑤ 组装 Assembly    → 拼接成最终送进模型的上下文
  ⑥ 生成 Generation  → 模型基于上下文作答

每一环都要能单独记录输入输出,这样出了问题才能定位到具体环节。一个最小可用的追踪结构:

from dataclasses import dataclass, field
from typing import Any

@dataclass
class RagTrace:
    """一次 RAG 请求的完整链路追踪,用于离线复盘与失败归因"""
    query: str
    rewritten_queries: list[str] = field(default_factory=list)
    retrieved: list[dict[str, Any]] = field(default_factory=list)   # 召回候选
    reranked: list[dict[str, Any]] = field(default_factory=list)    # 重排后
    context: str = ""                                               # 最终上下文
    answer: str = ""                                                # 生成答案
    cited_ids: list[str] = field(default_factory=list)              # 答案引用的片段

有了这份 trace,你才能回答"这次答错,到底是第几步出的问题"。它是后面所有评测工作的数据基础。


三、切分:RAG 里最被低估的一步

切片(chunking)的质量,直接决定检索的天花板。切得太碎,一段完整的论述被拆散,检索到的是没有上下文的碎片;切得太大,一个片段里混进多个主题,向量被"平均"成模糊的语义,什么都像又什么都不准。

切分策略的取舍:

  固定长度切分    简单、快,但会从句子中间切断,破坏语义完整性
  按结构切分      依据标题/段落/列表等文档结构,天然语义完整 ← 优先
  递归切分        先按大结构,超长再按次级结构降级,兼顾两者
  语义切分        按语义相似度突变点切分,质量高但成本与复杂度高

实操中的一条硬经验:**切分要顺着文档本来的结构走。**Markdown 的标题、PDF 的段落、代码的函数边界,这些都是现成的语义分割线。放弃它们而用固定字符数硬切,等于把作者已经帮你做好的工作丢掉。

import re

def split_by_heading(text: str, max_chars: int = 1200) -> list[str]:
    """
    按 Markdown 标题层级切分文档,超长段落再按句子降级切分
    优先保留文档原有结构,避免从句子中间硬性切断
    :param text: 原始 Markdown 文本
    :param max_chars: 单个片段的最大字符数,超出则降级切分
    :return: 片段列表
    """
    # 以二级及以上标题作为主分割点,保留标题本身作为片段标题
    blocks = re.split(r"(?m)^(?=#{2,}\s)", text)
    chunks: list[str] = []

    for block in blocks:
        block = block.strip()
        if not block:
            continue
        if len(block) <= max_chars:
            chunks.append(block)
            continue
        # 超长块按句子边界降级切分,尽量不在句中截断
        sentences = re.split(r"(?<=[。!?.!?])\s*", block)
        buf = ""
        for s in sentences:
            if len(buf) + len(s) > max_chars and buf:
                chunks.append(buf.strip())
                buf = s
            else:
                buf += s
        if buf.strip():
            chunks.append(buf.strip())

    return chunks

还有一个常常被忽略的增强:**给每个片段补上"上下文头"。**一段孤立的内容,向量里往往缺少"它属于哪篇文档、哪个章节、讲的是谁"这些信息。把标题和必要的归属信息拼到片段开头一起向量化,能显著改善召回。

def with_context_header(doc_title: str, section: str, body: str) -> str:
    """
    为片段拼接上下文头,让向量携带归属信息
    解决"片段本身没提主题,导致语义检索找不到"的问题
    :param doc_title: 所属文档标题
    :param section: 所属章节标题
    :param body: 片段正文
    :return: 带上下文的文本
    """
    return f"《{doc_title}》 · {section}\n{body}"

另外,片段之间要有重叠。 相邻片段保留一小段重叠内容,可以避免答案正好横跨两个片段的边界时,两边都只拿到半句话。


四、召回:向量检索的三种典型失效

向量检索很擅长"语义相近",但有三种场景它天然吃亏:

向量检索的失效场景:

① 精确匹配失效
   用户问特定编号、错误码、专有名词(如 "ERR_5021"),
   向量表达不了"必须字面完全一致",反而会召回语义近似的无关内容。

② 短查询失效
   查询只有两三个词时,向量信息量太少,语义漂移严重。

③ 领域词汇失效
   行业术语、内部黑话未出现在预训练语料中,向量空间里
   它们的邻居是"字面相近的常见词",而非"语义正确的概念"。

第三种的解决方式是把向量模型换到你的领域上做适配(微调或用领域 embedding),但成本不低;前两种,最直接的解法就是引入关键词检索——也就是下一节的混合检索。


五、混合检索:让向量和关键词互为补充

BM25 这类关键词检索,恰好补上向量检索的短板:它对精确词、罕见词、编号类查询极其敏感。两者结合,才能同时覆盖"字面精确"与"语义相近"两类需求。

融合方式:

  加权求和   score = α · vector_score + (1−α) · bm25_score
              简单可控,但两种分数量纲不同,需要各自归一化
  RRF 倒数排名融合  按排名而非分数融合,天然规避量纲问题 ← 更稳健

  RRF 公式:score(d) = Σ 1 / (k + rank_i(d))
  k 为平滑常数(常用 60 左右),rank_i(d) 是文档 d 在第 i 路
  检索结果中的排名。

RRF 的好处是只看排名不看分数,因此不需要为不同检索器做分数归一化——这是它比加权求和更省心的根本原因。

def reciprocal_rank_fusion(results: list[list[str]], k: int = 60) -> list[str]:
    """
    倒数排名融合(RRF):合并多路检索结果
    仅依赖排名,避免不同检索器的分数不可比问题
    :param results: 每一路检索返回的文档 ID 有序列表(按相关性降序)
    :param k: 平滑常数,越大则排名差异的影响越平缓
    :return: 融合后按相关度降序排列的文档 ID 列表
    """
    scores: dict[str, float] = {}
    for ranked in results:
        for rank, doc_id in enumerate(ranked):
            scores[doc_id] = scores.get(doc_id, 0.0) + 1.0 / (k + rank + 1)
    # 按融合分数降序返回
    return sorted(scores, key=scores.get, reverse=True)

除了混合检索,还值得加一层"元数据过滤":按时间、来源、权限、产品线等条件先缩小检索范围。把结构化的约束交给过滤器,把语义匹配交给向量,各司其职,比让向量去承担所有判断要准得多。


六、重排序:把"相关"和"最相关"区分开

初筛召回追求的是"别漏",所以会取回一大把候选;但用户真正需要的是排在最前面那几条。重排序(rerank)就是在初筛之后,用一个更精细(也更慢)的模型对候选重新打分。

为什么需要 rerank:

  双塔向量模型(bi-encoder)为了让检索够快,查询与文档是分开编码的,
  两者之间没有交互,精度受限。
  交叉编码器(cross-encoder)把"查询 + 文档"一起输入,逐对精算相关性,
  精度高但慢——所以只适合给少量候选做重排,不适合全库检索。

  分工:向量/BM25 负责"从海量到几十条"(快、全)
        rerank 负责"从几十条到最相关的几条"(准、慢)

引入重排之后,一个重要的参数变化是:初筛的 top-k 可以放得更大,最终送给模型的条数反而更小。 这样既提高了"正确内容在候选里"的概率,又减少了送进上下文的噪声。

def retrieve_and_rerank(query: str, top_k_recall: int = 50, top_n_final: int = 6):
    """
    两段式检索:先大范围召回,再精细重排
    :param query: 用户查询
    :param top_k_recall: 初筛召回条数(放宽,保证不漏)
    :param top_n_final: 重排后进入上下文的条数(收紧,保证不噪)
    :return: 最终片段列表
    """
    # ① 多路召回(向量 + 关键词),再用 RRF 融合
    cand = reciprocal_rank_fusion([
        vector_search(query, top_k=top_k_recall),
        bm25_search(query, top_k=top_k_recall),
    ])[:top_k_recall]

    # ② 交叉编码器精排,只保留最相关的少量片段
    pairs = [(query, load_chunk_text(d)) for d in cand]
    scores = cross_encoder_score(pairs)
    ranked = sorted(zip(cand, scores), key=lambda x: x[1], reverse=True)

    return [doc_id for doc_id, _ in ranked[:top_n_final]]

七、查询改写:用户不会用你检索系统喜欢的语言提问

用户的一句话查询,往往和文档的表述方式差很远。查询改写的目的,是缩小这个表达鸿沟。

几种有效的改写手段:

  ① 扩写:把口语化短查询补全成完整意图
     "那个报错咋修" → "修复 XXX 报错 / 错误原因与解决步骤"

  ② 多查询:生成同一意图的多个表述,分别检索后合并
     覆盖不同措辞下才出现的文档

  ③ 假设文档(HyDE):先让模型生成一个"假想的答案",
     用这个答案去检索,往往比原问题更接近文档的表达方式

  ④ 指代消解:多轮对话中,"它/这个"要还原成具体实体的名称
     否则检索会丢失最关键的那个关键词

其中指代消解在多轮对话场景里是必做项。用户在追问"那它的价格呢",如果直接拿这句话去检索,"它"就是一个信息量为零的词,结果必然糟糕。要先把"它"还原成上文提到的产品名。

def resolve_coreference(history: list[dict], current_query: str) -> str:
    """
    多轮对话中指代消解:把代词还原为具体实体,再用于检索
    :param history: 历史对话(含用户与助手消息)
    :param current_query: 当前用户查询
    :return: 消解后的独立查询
    """
    # 仅在检测到代词/省略主语时才调用模型改写,避免无谓开销
    if not has_pronoun(current_query):
        return current_query
    prompt = build_coref_prompt(history, current_query)
    return llm_generate(prompt).strip()

一个性价比很高的组合是:多查询 + RRF。 生成几条不同表述的查询,各自跑一遍检索,再用 RRF 融合。它比单查询更稳,且不改动底层检索器,只是"多问几种问法"。


八、上下文组装:好答案是被"摆"出来的

检索回来一堆片段,直接堆给模型是最常见的浪费。上下文组装要解决三件事:排序、去重、去噪。

组装原则:

  ① 最相关的放最前(或最前与最后,规避"中间遗忘")
     长上下文中,模型对首尾信息的利用率高于中段。
  ② 去重:相似片段合并,避免同一内容重复占位、稀释注意力。
  ③ 带来源标识:每个片段标明出处,为"引用与溯源"打基础。
  ④ 控制总量:上下文不是越多越好,噪声同样会干扰判断。

组合顺序对答案质量有实感影响,值得单独成一个可复用的函数:

def assemble_context(chunks: list[dict], max_chars: int = 6000) -> str:
    """
    组装最终上下文:排序、去重、加来源、控总量
    :param chunks: 重排后的片段列表,含 text 与 source 字段
    :param max_chars: 上下文总长度上限
    :return: 拼接好的上下文字符串
    """
    seen: set[str] = set()
    parts: list[str] = []
    total = 0

    for c in chunks:
        key = c["text"][:120]           # 用开头片段做近似去重指纹
        if key in seen:
            continue
        seen.add(key)
        block = f"[来源: {c['source']}]\n{c['text']}"
        if total + len(block) > max_chars:
            break
        parts.append(block)
        total += len(block)

    return "\n\n---\n\n".join(parts)

有了来源标识,才能要求模型"引用片段编号",也才能让用户点开溯源——这对企业场景的可信度至关重要。


九、防幻觉:让"不知道"成为一个合法答案

RAG 最危险的不是答错,而是自信地编造。防幻觉的关键,是在提示层面给模型一条明确的退路。

防幻觉的三个约束:

  ① 只依据上下文作答,不引入上下文之外的"常识"
  ② 上下文不足以回答时,明确回复"资料中未找到",而不是猜
  ③ 关键结论必须能对应到具体来源片段(可核对)
SYSTEM_PROMPT = """你是一个严格基于给定资料作答的助手。

规则:
1. 只使用【资料】中的信息作答,不得添加资料之外的任何推断。
2. 资料不足以回答问题时,直接回复:资料中未找到相关依据。
3. 每个关键结论后标注其来源片段编号,如 [1][2]。
4. 不得编造资料中未出现的数字、名称或结论。"""

与防幻觉配套的是拒答机制:当检索的最高分低于某个阈值时,先不要急着让模型答,而是直接告诉用户"没找到足够相关的资料"。宁可拒答,也不要给出一个看起来通顺却错误的答案——前者损害体验,后者损害信任,而信任一旦失去很难挽回。

def answer_with_guard(trace: RagTrace, score_threshold: float = 0.35) -> str:
    """
    带门限保护的问答:检索质量不足时直接拒答
    :param trace: 本次请求的链路追踪(含重排分数)
    :param score_threshold: 相关性门限,低于此值不生成答案
    :return: 答案或拒答提示
    """
    if not trace.reranked or trace.reranked[0]["score"] < score_threshold:
        return "资料中未找到相关依据,请换个说法或补充更多信息。"
    return generate(SYSTEM_PROMPT, trace.context, trace.query)

门限的取值要靠评测数据来定,而不是拍脑袋——这也是为什么评测必须先行。


十、评测:没有它,所有优化都是猜

RAG 的评测要分两层:离线评测保证"不退化",在线反馈保证"持续改进"。

离线评测的三个关键指标:

  召回率 Recall@k   正确片段是否出现在前 k 条里
                    → 反映"检索器找不找得到",是 RAG 的命门

  排序指标 MRR/NDCG  正确片段排得够不够靠前
                    → 反映"重排序好不好"

  答案质量           正确性、忠实度(忠实于上下文与否)、完整性
                    → 需要人工标注或用模型做评审

一个最小可用的评测集:准备一批"问题 + 标准答案 + 应命中的文档 ID",每次改动前后都跑一遍,用数字说话。特别要注意的是,评测集要用真实用户的问题,而不是你想象的问法。 开发者自造的问题往往太"标准",掩盖了真实查询的口语化、省略、错别字等特征。

def evaluate_retrieval(cases: list[dict], retriever, k: int = 6) -> dict:
    """
    离线评测检索效果:计算命中率与平均排名
    :param cases: 评测用例,含 query 与 gold_ids(正确答案所在片段 ID)
    :param retriever: 待评测的检索函数
    :param k: 截断位置
    :return: 命中率与平均倒数排名
    """
    hit, mrr_sum = 0, 0.0
    for case in cases:
        retrieved = retriever(case["query"])[:k]
        # 命中:任一标准片段出现在前 k 条
        if any(g in retrieved for g in case["gold_ids"]):
            hit += 1
            rank = min(retrieved.index(g) for g in case["gold_ids"] if g in retrieved)
            mrr_sum += 1.0 / (rank + 1)
    n = len(cases) or 1
    return {"hit_rate": hit / n, "mrr": mrr_sum / n}

在线层面,最实用的三个信号是:**用户是否点了"答案无用"、是否重新提问(说明第一次没答对)、是否直接离开。**把这三类反馈和对应的 trace 关联起来,就得到一批真实的高价值失败样本,定期纳入离线评测集,形成闭环。

评测闭环:

  线上失败样本 → 补入离线评测集 → 改参数/改流程 → 离线回归验证
       ↑                                                    ↓
       └────────────── 上线观察线上指标 ←──────────────────┘

十一、落地清单

基础可用
  □ 按文档结构切分,片段带上下文头与适度重叠
  □ 向量 + 关键词混合检索,用 RRF 融合
  □ 接入重排序,初筛放宽、终选收紧
  □ 上下文组装:排序 / 去重 / 标来源 / 控总量

质量保障
  □ 查询改写:指代消解为主,多查询 + RRF 为辅
  □ 防幻觉提示 + 低分拒答门限
  □ 全链路 trace 记录,可定位失败环节
  □ 离线评测集(真实问题)+ 召回率/MRR 回归

持续改进
  □ 收集线上"无用/重问/离开"信号
  □ 失败样本定期回灌评测集
  □ 每次改动前后跑一遍评测,用数字决策

结语:RAG 的战场在检索,胜负在评测

把这段链路走一遍,你会发现一个反复出现的规律:**RAG 的每一次进步,几乎都不是靠换模型换来的,而是靠更懂数据、更懂用户怎么提问。**切分尊重文档结构、检索同时看字面和语义、重排把候选精算一遍、上下文按注意力规律摆放、提示给模型留一条"不知道"的退路——这些动作没有一个是炫技,全是工程上的细致功夫。

而支撑这些功夫的,只有一件事:评测。没有评测,你无法知道某个参数是让答案更准还是更差;有了评测,每一次改动都是一次可验证的实验。**当"感觉好多了"变成"召回率提升了",RAG 就从玄学变成了工程。**这大概就是从"能答"走到"答得准"之间,最容易被跳过、却最不该跳过的那一步。

�� 同主题文章

🤖AI / LLM·

LLM 应用成本工程实战 2026:小模型价格战时代,把 API 账单压成零头

2026 年 10 月,旗舰模型输入价降到每百万 token 两美元、缓存读取低至一折,小模型价格再砍到上一代十分之一,模型能力快速商品化。成本不再是月底才看一眼的账单,而是写进架构里的一等决策:同样的功能,合理的路由、缓存与降级设计能让单次调用成本相差几十倍。本文系统实战 LLM 成本工程:看懂 token 定价结构、建立成本地图、三级模型路由与级联升级、Prompt 缓存断点设计、语义缓存、输入输出双端压缩、批处理异步化、降级链与预算熔断,以及独立开发者按 ROI 排序的落地清单。

LLMAI成本模型路由
🤖AI / LLM·

AI 应用评估体系完整实战 2026:Evals 驱动的 LLM 质量保障

传统软件改一行代码,单元测试会告诉你有没有改坏东西;AI 应用改一个提示词或换一个模型,输出却可能在你完全没注意的角落悄悄变差——因为没有确定性的测试能断言「这段话写得对不对」。Evals(评估)就是 AI 应用的测试体系:用精心构造的数据集与可复现的打分方法,衡量模型输出的质量,并在每次变更后捕捉回归。本文完整实战 AI 评估体系:为什么传统测试不够用、评估数据集怎么建、自动打分与人评的分工、LLM-as-a-Judge 的用法与偏差、RAG 与 Agent 的专项评估、把 Evals 接入 CI、以及生产环境的在线评估闭环。

AI 评估EvalsLLM
🤖AI / LLM·

AI Agent 上下文工程完整实战 2026:压缩、记忆与上下文窗口管理

AI Agent 的能力上限不取决于模型本身,而取决于你能给它多少有效上下文。上下文窗口是有限的、昂贵的、且模型对窗口中间部分的关注度会下降。上下文工程(Context Engineering)就是在这个有限预算内,最大化模型可用的有效信息。本文完整实战:上下文窗口的真实成本、压缩策略的四个层次、短期记忆与长期记忆的架构、RAG 与上下文的协同、上下文污染与注意力稀释、多 Agent 间的上下文传递、以及在有限预算内让 Agent 保持「清醒」的完整方法。

AI Agent上下文工程Context Engineering

🤖 AI / LLM 分类更多