转载自公众号:敢敢AUTOHUB
1. 问题背景:当前“自进化智能体”为什么还不够自进化
大语言模型智能体通常被描述为能够自主规划、调用工具、执行任务的系统,但在多数研究和产品实现中,所谓“自进化”仍然依赖人类预先给定的任务、流程与奖励。智能体先接收一个目标,再按照人类设计好的浏览、搜索、反思、打分、更新链路执行;如果没有任务,没有奖励函数,也没有外部评判器,它往往不会主动探索环境,更谈不上在任务到来之前形成可复用的认知结构。这篇论文试图回答一个更底层的问题:智能体能否像人进入新城市、打开新软件一样,在没有明确任务时也主动建立一张“环境地图”,并在后续任务中利用这张地图提高效率与成功率。
论文地址:https://arxiv.org/abs/2604.18131
代码地址:https://github.com/Bklight999/world-knowledge
论文把现有自进化范式分成三类。
第一类是经验驱动进化,智能体通过人工构造的任务和奖励积累轨迹,再把这些经验写入提示词、记忆库、工具库或模型参数;
第二类是对抗式进化,由挑战者生成更难任务,由求解器在对抗中变强;第三类则是作者提出的元学习驱动进化,也就是让智能体学习一种“如何探索环境并压缩知识”的能力。前两类虽然能提升表现,但都没有摆脱外部任务与流程设计,智能体仍然是在做练习题;
第三类的目标更接近原生自进化:在推理阶段不需要人工任务、不需要外部奖励,也不需要固定工作流,而是主动探索未知环境并生成 World Knowledge。
2. 概念与项目对象
2.1 World Knowledge 的含义
项目 README 对 World Knowledge 的定义很直接:它是某个具体环境实例的紧凑结构化表示。在这个仓库里,它通常保存为 Markdown 文件,历史脚本中也会叫 notebook 或 guidebook,这些名字指的是同一类对象。
World Knowledge (K): a compact, structured representation of a specific environment instance.
它不是通用百科,也不是模型参数中的隐式知识。它更像某个网站的环境地图:记录页面类别、URL 前缀、关键事实、导航入口,以及后续任务可能优先访问的位置。
2.2 代码中的术语对应
阅读仓库时,可以先把论文术语和代码术语统一起来。这样再看 questions/、output_note/、problem_generation_with_notebook.py、test_accuracy.py 时,文件之间的关系会清楚很多。
| 论文术语 | 仓库里的常见名字 | 含义 |
|---|---|---|
| World Knowledge | notebook / guidebook | 针对某个环境生成的结构化 Markdown 知识 |
| Native Evolution Phase | Notebook Generation | 先探索网站并生成 World Knowledge |
| Knowledge-Enhanced Execution Phase | CK-pro Test | 带着 World Knowledge 做下游网页任务 |
| Reward / Success | Judge / Accuracy | 用下游任务成功率评价知识是否有用 |
World Knowledge 的价值不在于文档写得多完整,而在于能否帮助 Agent 更快、更准地完成后续任务。比如“ACL 2024 官网包含会议信息”价值有限;写清注册、日程、打印服务、签证页面分别负责什么,才真正能降低探索成本。
2.3 真实输入样例
仓库已经带了会议网站的聚类文件,例如 world-knowledge/data/conference/2024_aclweb_org_clusters.txt。这个文件不是原始 URL 清单,而是经过预处理的网站骨架。
Total: 2 clusters, 31 URLs [SHOW_ALL (< 250 URLs)] | per-cluster sizes: [17, 14]
============================================================
[Prefix] <https://2024.aclweb.org> (17/17 URLs)
<https://2024.aclweb.org> [in:31 out:19 score:37]
<https://2024.aclweb.org/participants> [in:31 out:15 score:36]
<https://2024.aclweb.org/calls/main_conference_papers> [in:31 out:14 score:35]
<https://2024.aclweb.org/faq> [in:31 out:12 score:35]
<https://2024.aclweb.org/sponsors> [in:31 out:10 score:34]
<https://2024.aclweb.org/organization> [in:31 out:10 score:34]
<https://2024.aclweb.org/registration> [in:31 out:9 score:34]
其中 in 表示站内入链数,out 表示站内出链数,score 是页面重要性分数。模型不是从首页盲目点击,而是先拿到按 URL 前缀组织、带结构分数的页面列表。
3. 工程链路与关键实现
3.1 总体流程
README 给出的流程可以压缩为四个阶段:先抓取和聚类网站 URL,再生成 World Knowledge;随后把它拼进下游任务;最后运行 CK-pro Agent,并用 LLM judge 和步数统计评估效果。
Target website URLs
-> URL crawl / clustering
-> World Knowledge prompt generation
-> World Knowledge generation
-> Test set construction
-> CK-pro inference
-> LLM-based judging
-> Accuracy / efficiency analysis
对应到仓库文件,可以按下面这张表阅读。这里的 test_efficency.py 是项目原文件名,虽然拼写不是常见的 efficiency,但文章中保留项目实际名称,避免读者找不到文件。
| 阶段 | 关键文件 | 作用 |
|---|---|---|
| URL 爬取 | preprocess/crawl_urls.py |
从种子站点抓同域页面 |
| URL 聚类 | preprocess/cluster_urls.py |
按路径前缀聚类并计算 in/out/score |
| Prompt 生成 | notebook_prompt.py / notebook_prompt_short.py |
把 cluster 文件转成 Guidebook 构建任务 |
| 知识生成 | System.ckv3.ck_main.main |
调网页 Agent 读取真实页面并写 Markdown |
| 任务构造 | problem_generation_with_notebook.py |
把 WebWalker 问题和 notebook 拼成测试输入 |
| 评测统计 | test_accuracy.py、test_efficency.py、calculate_effectiveness.py |
计算准确率和平均步数 |
3.2 URL 爬取与聚类
preprocess/crawl_urls.py 从种子 URL 出发抓同域 HTML 页面。它采用 BFS 方式发现链接,目标是建立当前网站内部页面集合,而不是抓取互联网外部链接。
def crawl_urls(base_url, max_count=MAX_PAGES_PER_URL, max_workers=MAX_WORKERS):
"""BFS crawl to discover same-domain URLs."""
base_url = base_url.rstrip("/")
parsed_base = urlparse(base_url)
base_domain = parsed_base.netloc
脚本只把同域名 URL 放回队列。这样可以避免赞助商官网、社交媒体、地图服务等外部链接污染当前环境知识。
if urlparse(clean_url).netloc == base_domain:
with lock:
if clean_url not in seen_urls:
seen_urls.add(clean_url)
url_queue.put(clean_url)
preprocess/cluster_urls.py 会读取爬虫产出的 URL,过滤 PDF,抓取页面链接关系,再统计站内入链和出链。页面重要性分数来自项目真实代码:
def _importance_score(in_count, out_count):
return in_count + 0.3 * out_count
入链多的页面通常是重要入口,出链多的页面往往是导航页或聚合页。脚本会按这个分数对页面排序,并在大站点中过滤低价值 URL。
ranked = sorted(
members,
key=lambda u: _importance_score(*link_counts.get(u, (0, 0))),
reverse=True
)
小站点会展示全部 URL,大站点会过滤和截断。代码里的阈值是:
SMALL_SITE_THRESHOLD = 250
3.3 Guidebook Prompt 与生成
notebook_prompt_short.py 是理解 World Knowledge 生成约束的关键文件。它要求 Agent 先解析 cluster 文件,再制定 token 分配计划,逐个类别调用网页工具,最后检查总长度。
1. Call parse_cluster_stats() to read the file header and get the total number of URLs and categories.
2. Create a token allocation plan.
3. Process categories one by one.
4. After all categories are processed, check the total length with count_guidebook_tokens().
模板还明确要求每个页面摘要必须来自真实 web_agent() 调用,不能编造内容;每条页面记录必须包含完整 URL;只包含同域页面;用自己的话总结,不能复制网页原文。
Every page summary must come from a real web_agent() call.
Never fabricate or guess content.
Every scraped page entry must include its full URL.
Only include pages from the website's own domain.
每个类别的输出格式也在模板中规定。它要求包含类别名称、URL 前缀、类别摘要和已抓取页面列表,便于人检查,也便于后续 Agent 根据 URL 回到真实页面验证。
#### Category: [Name]
- **URL Prefix:** [prefix URL]
- **Category Summary:** [what this category covers]
**Scraped Pages:**
- **[Page Title]** (<https://full.url/path>): [summary of key info]
- ...
生成 prompt 后,流水线调用 CK-pro 主程序生成 notebook。下面这段来自 data_pipeline_train.sh 的 Phase 1。
NO_NULL_STDIN=1 python3 -u -m System.ckv3.ck_main.main \
--updates "${MY_MAIN_ARGS_GEN}" \
--input "${BASE_DIR}/questions/notebook_prompt/${url_name_test}_${TOKEN_STR}_${id}.jsonl" \
--output "${note_dir}/notebook_${id}.jsonl"
脚本默认使用 NOTE_IDS=(1 2 6)。其中 id=6 是特殊路径,data_pipeline_train.sh 会跳过生成,problem_generation_with_notebook.py 中也把它作为 without notebook 测试路径处理。
if args.notebook_id != "6": # 6 为 without notebook 测试,不做 notebook 质检,直接跑 CK-pro
with open(f'./questions/{domain}_final_guidebook_{args.token_limit}_{args.notebook_id}.md', 'r') as f:
notebook = f.read()
4. 下游使用、评测与复现
4.1 任务构造与执行
下游问题主要来自 world-knowledge/data/WebWalker.jsonl 和 world-knowledge/data/WebVoyager.jsonl。WebWalker 样例包含问题、标准答案、根 URL、来源页面、黄金路径、难度和任务类型。
{"question": "What time is Geoffrey Hinton's keynote on 'Two Paths to Intelligence' scheduled during ACL 2023, and what follows immediately after that session on the same day?", "answer": "Geoffrey Hinton's keynote is scheduled from 9:30 to 10:30 AM on July 10th, immediately followed by a coffee break.", "root_url": "<https://2023.aclweb.org/>", "info": {"domain": "conference", "source_website": ["<https://2023.aclweb.org/program/>", "<https://2023.aclweb.org/program/keynotes/>"], "golden_path": ["root->Conference Schedule", "root->Keynotes"], "type": "multi_source", "difficulty_level": "easy", "lang": ""}}
problem_generation_with_notebook.py 会筛出和当前网站 URL 匹配的问题。如果启用 notebook,它会把 World Knowledge 拼进任务提示词,让 Agent 先判断能否直接回答,再选择相关子页面,最后才回到主页重新探索。
1. Answer Directly (Rare)
2. Explore Sub-pages (Most Common)
3. Explore Main Page from Scratch (Fallback)
下游任务执行同样通过 System.ckv3.ck_main.main 完成。这次输入不是 Guidebook 生成任务,而是带目标问题和可选 notebook 的测试任务。
python3 -u -m System.ckv3.ck_main.main \
--updates "${MY_MAIN_ARGS_TEST}" \
--input "$INPUT_FILE" \
--output "$OUTPUT_FILE"
测试阶段参数更稳定,data_pipeline_train.sh 设置了低温度,并限制最大步骤数。World Knowledge 如果有效,就应该在有限步数内帮助 Agent 更快定位相关页面。
TEST_KWARGS='{"temperature": 0.0, "top_p": 0.95, "max_tokens": 8192}'
4.2 评测脚本
答案评测脚本是 test_accuracy.py。它读取 output_ans/{domain_name}/ans_{notebook_id}.jsonl,取出预测答案、标准答案和执行步数,再调用 OpenAI 兼容 API 做 LLM judge。
answer_and_gt_file = f"./output_ans/{args.domain_name}/ans_{args.notebook_id}.jsonl"
评判提示词来自项目真实代码。它要求 judge 判断预测答案是否完全满足标准答案,若问题包含多个子问题,则必须全部答对才算正确。
def generate_text_template(question, predict, gt, tokenizer=None):
system_prompt = "You are a professional LLM judge."
user_prompt = f"""Please judge whether the answer is fully consistent with the ground truth.
The question is: {question}
The answer is: {predict}
The ground truth is: {gt}
If the question contains multiple sub-questions or multiple required components, the answer must correctly address ALL of them to be considered consistent.
Output 1 if the answer is completely consistent with the ground truth; otherwise output 0.
Please output only the number without any other words.
"""
这里有一个维护细节:test_accuracy.py 中判断 guidebook 文本时使用了 guidbook 拼写,可能是历史遗留写法。它不一定阻塞所有流程,但后续整理代码时应该检查。
if 'guidbook' not in data['task']:
准确率由 calculate_effectiveness.py 统计,效率由 test_efficency.py 统计。后者不仅计算主 Agent 步数,也把子 Agent 步数加进去。
def _count_steps_including_subagent(data):
"""Count total steps including sub-agent steps."""
main_steps = data['session']['steps']
total = len(main_steps)
for step in main_steps:
action = step.get('action', {})
ob = action.get('observation', [])
if isinstance(ob, dict) and 'session' in ob and 'steps' in ob['session']:
total += len(ob['session']['steps'])
return total
4.3 运行入口与依赖
README 给出了三个主要入口脚本。它们分别对应完整流水线、只生成 World Knowledge、以及已有 World Knowledge 时只执行测试和评测。
| 脚本 | 作用 |
|---|---|
data_pipeline_train.sh |
完整流水线:生成 World Knowledge、构造测试、执行任务、判分、分析 |
data_pipeline_train_gen_only.sh |
只生成 World Knowledge 和测试数据 |
data_pipeline_train_test_only.sh |
已有 World Knowledge 时,只执行测试和评测 |
常用完整流水线命令如下:
MODE=domain bash data_pipeline_train.sh 5
MODE=domain 会扫描 world-knowledge/data/${domain}/*_clusters.txt。当前脚本默认 domain="conference",因此会读取 ACL 2023、ACL 2024 和 The Web Conference 2024 的 cluster 文件。
这个项目不是轻量级单脚本 demo。它需要 Python 3.12、Node.js、Playwright 或 Browserless、OpenAI 兼容接口、vLLM 兼容推理端点,以及脚本中的本地路径和环境变量。
export PYTHONPATH=/path/to/cognitive_kernel_GAIA/
export PLAYWRIGHT_BACKEND=browserless
export BROWSERLESS_TARGET_HOST="production-sfo.browserless.io"
export BROWSERLESS_TOKEN="your_browserless_token"
vLLM 端口默认是 VLLM_PORTS=(8080 8081 8082 8083),浏览器服务端口池默认检查 3001 到 3032。复现前要先确认模型服务、浏览器服务、数据文件和输出目录。
5. 方法特点与结论
5.1 训练思想
论文并不是完全抛弃奖励,而是把奖励主要放在训练阶段。系统会生成候选 World Knowledge,再把候选知识放入下游任务中测试,根据任务成功率判断它是否真的有帮助。
R_evolve(K) = Success(T_E | K) - Success(T_E | empty)
这里 K 是 World Knowledge,T_E 是同一环境下的下游任务集合。如果带知识的成功率高于空知识,说明这份知识对任务执行有实际价值。
World Knowledge 也不等同于普通 RAG。RAG 通常在用户提出问题后检索相关片段,而 World Knowledge 是在任务之前对整个环境进行结构化建模,记录页面类别、URL 前缀、页面职责和导航入口。
5.2 实验观察
论文结果显示,低质量知识可能没有帮助,甚至会降低表现。以 Qwen3-30B-A3B 为例,Prompt-Only(Base) 在 WebWalker 上低于 Without,说明简单提示模型生成摘要并不可靠。
| Setting | WebWalker Avg. | WebVoyager Avg. |
|---|---|---|
| Without | 22.04 | 41.08 |
| Prompt-Only(Base) | 19.50 | 40.76 |
| Ours(SFT) | 38.17 | 51.50 |
| Ours(RFT) | 40.91 | 57.44 |
真正有效的是经过 SFT 和 RFT 后的生成策略。模型不只是学会“多写一点网页总结”,而是学会选择页面、控制长度、保留事实线索,并让这些知识服务后续任务。
World Knowledge 还具有跨模型迁移价值。它不是某个模型内部的隐藏状态,而是一份外部可读、可审计、可复用的环境表示,可以供不同执行模型共享。
5.3 边界与阅读顺序
World Knowledge 依赖环境相对稳定。如果网站经常改版,或者价格、库存、政策、日程实时变化,离线生成的知识就可能过期。下游执行阶段仍然需要访问原网页验证关键事实。
生成成本也是一个限制。大站点需要爬取、聚类、浏览、摘要、压缩和评测。如果某个环境只访问一次,预先生成 World Knowledge 未必比直接执行任务更经济。
如果要熟悉这个仓库,可以先读 README.md 和 data/conference/2024_aclweb_org_clusters.txt,再看 crawl_urls.py、cluster_urls.py、notebook_prompt_short.py、problem_generation_with_notebook.py,最后看流水线和评测脚本。
5.4 总结
World Knowledge 的核心作用,是把 Web Agent 的工作起点从“收到任务后再探索”提前到“任务到来前先建模环境”。这能减少重复探索,并让后续任务更像在已有地图上定位。
结合仓库看,它是一条具体工程链路:爬 URL、做聚类、生成 prompt、调用网页 Agent 写 Markdown、拼接测试任务、执行浏览器任务、用 LLM judge 判分、统计准确率和步数。
对应用开发者而言,它最直接的启发是:对于复杂但会重复访问的环境,不要把所有能力都压在单次对话和模型参数上。先构建一份可审计、可更新、可压缩的外部环境知识,再让 Agent 基于它行动,往往更稳定,也更经济。
147