Files
liqiang b119135836
Build latest book artifacts / build (push) Canceled after 0s
dependency resolution / resolve (3.11) (push) Canceled after 0s
dependency resolution / resolve (3.13) (push) Canceled after 0s
deploy-pages / build (push) Canceled after 0s
deploy-pages / deploy (push) Canceled after 0s
i18n consistency check / check (push) Canceled after 0s
provider adoption tests / test (chapter2/context-compression) (push) Canceled after 0s
provider adoption tests / test (chapter2/prompt-injection) (push) Canceled after 0s
provider adoption tests / test (chapter2/system-hint) (push) Canceled after 0s
provider adoption tests / test (chapter3/log-sanitization) (push) Canceled after 0s
web-search-agent tests / test (push) Canceled after 0s
web-search-agent tests / agentbook (push) Canceled after 0s
ai-agent-book 精选快照(<2MB 代码与文档,来自 github.com/bojieli/ai-agent-book)
2026-08-20 13:12:50 +00:00

150 lines
8.4 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
from __future__ import annotations
import hashlib
import json
from pathlib import Path
ROOT = Path(__file__).resolve().parent
DATA = ROOT / "data"
VERSIONS = ["v2", "v2.1", "v3", "v4-beta", "2026.08", "release-候选"]
ACTIONS = ["先运行测试", "先备份数据", "检查权限", "重新读取文件", "核对验收条件", "查看变更记录"]
STATUSES = ["ok", "ready", "pending", "degraded", "accepted", "retry"]
WORDS = ["当前状态", "请求编号", "缓存策略", "错误原因", "目标路径", "发布说明"]
LITERALS = ["DELETE", "PATCH", "ROLLBACK", "dry_run", "API_KEY", "status"]
ENGLISH = [
"Please restart the service before retrying.",
"The file was not changed.",
"Run the migration only once.",
"This value must remain unchanged.",
"Do not remove the assertion.",
]
ARTICLE_TYPES = [
"新闻报道", "API 参考", "故障复盘", "发布说明", "操作手册",
"FAQ", "设计文档", "教程", "变更公告", "安全通告",
]
TEMPLATES = {
"zh": (
"请把下面的中文段落按项目文档规范修订,只输出修订后的文本。\n\n他说:\"今天发布 {version}\",随后补充:\"{action}\"。",
"他说:“今天发布 {version}”,随后补充:“{action}”。",
),
"mixed": (
"请修订下面的混合技术说明,只输出结果。\n\n调用 `{method}()` 后,服务返回 {{\"status\": \"{status}\"}}。说明文字中写着:\"{action}\"。",
"调用 `{method}()` 后,服务返回 {{\"status\": \"{status}\"}}。说明文字中写着:“{action}”。",
),
"english": (
"请修订下面的文章,只输出结果。\n\n原文引用如下:\"{english}\" 这段英文必须保持原样。",
"原文引用如下:\"{english}\" 这段英文必须保持原样。",
),
"python": (
"请修订下面的 Markdown 文档,只输出结果。\n\n```python\n# 中文注释:显示 \"{word}\"\nname = \"{literal}\"\nprint(name)\n```\n代码不能被改坏。",
"```python\n# 中文注释:显示 “{word}\nname = \"{literal}\"\nprint(name)\n```\n代码不能被改坏。",
),
"javascript": (
"请修订下面的 JavaScript 示例,只输出结果。\n\n```javascript\n// 中文注释:显示 \"{word}\"\nconst name = \"{literal}\";\nconsole.log(name);\n```\n代码不能被改坏。",
"```javascript\n// 中文注释:显示 “{word}\nconst name = \"{literal}\";\nconsole.log(name);\n```\n代码不能被改坏。",
),
"java": (
"请修订下面的 Java 示例,只输出结果。\n\n```java\n// 中文注释:显示 \"{word}\"\nString name = \"{literal}\";\nSystem.out.println(name);\n```\n代码不能被改坏。",
"```java\n// 中文注释:显示 “{word}\nString name = \"{literal}\";\nSystem.out.println(name);\n```\n代码不能被改坏。",
),
"go": (
"请修订下面的 Go 示例,只输出结果。\n\n```go\n// 中文注释:显示 \"{word}\"\nname := \"{literal}\"\nfmt.Println(name)\n```\n代码不能被改坏。",
"```go\n// 中文注释:显示 “{word}\nname := \"{literal}\"\nfmt.Println(name)\n```\n代码不能被改坏。",
),
"rust": (
"请修订下面的 Rust 示例,只输出结果。\n\n```rust\n// 中文注释:显示 \"{word}\"\nlet name = \"{literal}\";\nprintln!(\"{{}}\", name);\n```\n代码不能被改坏。",
"```rust\n// 中文注释:显示 “{word}\nlet name = \"{literal}\";\nprintln!(\"{{}}\", name);\n```\n代码不能被改坏。",
),
"sql": (
"请修订下面的 SQL 示例,只输出结果。\n\n```sql\n-- 中文注释:显示 \"{word}\"\nSELECT \"{literal}\" AS status;\n```\n代码不能被改坏。",
"```sql\n-- 中文注释:显示 “{word}\nSELECT \"{literal}\" AS status;\n```\n代码不能被改坏。",
),
"shell": (
"请修订下面的 Shell 示例,只输出结果。\n\n```bash\n# 中文注释:显示 \"{word}\"\nname=\"{literal}\"\nprintf '%s\\n' \"$name\"\n```\n代码不能被改坏。",
"```bash\n# 中文注释:显示 “{word}\nname=\"{literal}\"\nprintf '%s\\n' \"$name\"\n```\n代码不能被改坏。",
),
"yaml": (
"请修订下面的 YAML 配置,只输出结果。\n\n```yaml\n# 中文注释:显示 \"{word}\"\nname: \"{literal}\"\n```\n代码不能被改坏。",
"```yaml\n# 中文注释:显示 “{word}\nname: \"{literal}\"\n```\n代码不能被改坏。",
),
"markdown": (
"请修订下面的 Markdown 教程,只输出结果。\n\n说明文字写着:\"{action}\";命令 `run-{method}` 必须保持。",
"说明文字写着:“{action}”;命令 `run-{method}` 必须保持。",
),
"nested": (
"请修订下面的中文段落,只输出结果。\n\n她说:\"他说“{action}”,然后才修改。\"",
"她说:“他说‘{action}’,然后才修改。”",
),
"comment": (
"请修订下面的说明,只输出结果。\n\n代码注释里的自然语言引用是:\"{action}\"Python 字符串 `{quote_literal}` 的语法必须保持。",
"代码注释里的自然语言引用是:“{action}”;Python 字符串 `{quote_literal}` 的语法必须保持。",
),
"quote": (
"请修订下面的中文报道,只输出结果。\n\n报告引用用户原话:\"{action}\"。英文原句 \"{english}\" 也要原样保留。",
"报告引用用户原话:“{action}”。英文原句 \"{english}\" 也要原样保留。",
),
"json": (
"请修订下面的接口文档,只输出结果。\n\n中文说明:\"{word}必须存在\"。请求体示例:{{\"message\": \"{status}\"}}。",
"中文说明:“{word}必须存在”。请求体示例:{{\"message\": \"{status}\"}}。",
),
}
KINDS = list(TEMPLATES)
CODE_LANGUAGES = {
"python": "Python", "javascript": "JavaScript", "java": "Java",
"go": "Go", "rust": "Rust", "sql": "SQL", "shell": "Shell",
"yaml": "YAML", "markdown": "Markdown",
}
CODE_KINDS = set(CODE_LANGUAGES) | {"comment"}
SCOPE_RULE = (
"作用域规则:只把代码注释中的中文自然语言直引号改成中文弯引号;"
"字符串/字符字面量、格式化占位符、标识符、JSON 和 SQL 语法中的 ASCII 引号必须逐字保留。"
"示例:# 中文注释:显示 \"状态\" → # 中文注释:显示“状态”;name = \"status\" 不变。"
)
def make(split: str, n: int):
rows = []
split_offset = {"train": 0, "eval": 17, "boundary": 31}[split]
for i in range(n):
kind = KINDS[(i + split_offset) % len(KINDS)]
values = {
"version": VERSIONS[(i + split_offset) % len(VERSIONS)],
"action": ACTIONS[(i * 3 + split_offset) % len(ACTIONS)],
"status": STATUSES[(i * 5 + split_offset) % len(STATUSES)],
"word": WORDS[(i * 7 + split_offset) % len(WORDS)],
"literal": LITERALS[(i * 11 + split_offset) % len(LITERALS)],
"quote_literal": LITERALS[(i * 13 + split_offset) % len(LITERALS)],
"english": ENGLISH[(i * 2 + split_offset) % len(ENGLISH)],
"method": ["reset", "validate", "rebuild", "deploy", "rollback", "inspect"][(i + split_offset) % 6],
}
prompt, target = (x.format(**values) for x in TEMPLATES[kind])
if kind in CODE_KINDS:
prompt = SCOPE_RULE + "\n\n" + prompt
article_type = ARTICLE_TYPES[(i * 5 + split_offset) % len(ARTICLE_TYPES)]
language = CODE_LANGUAGES.get(kind, "中文/英文自然语言")
suffix = f"(案例编号 {split}-{i:03d};体裁={article_type};语言={language};请保持事实和代码不变。)"
rows.append({"id": f"{split}-{i:04d}", "kind": kind, "article_type": article_type,
"language": language, "prompt": prompt + "\n" + suffix,
"target": target + "\n" + suffix})
return rows
def write(name: str, rows):
path = DATA / name
path.parent.mkdir(parents=True, exist_ok=True)
path.write_text("\n".join(json.dumps(r, ensure_ascii=False) for r in rows) + "\n", encoding="utf-8")
return hashlib.sha256(path.read_bytes()).hexdigest()
if __name__ == "__main__":
DATA.mkdir(exist_ok=True)
hashes = {
"train": write("train.jsonl", make("train", 1024)),
"eval": write("eval.jsonl", make("eval", 256)),
"boundary": write("boundary.jsonl", make("boundary", 256)),
}
print(json.dumps(hashes, indent=2))