
1. 评论甄别智能体到底解决什么问题电商后台每天涌进来几千条评论运营同学一条条翻翻到第 200 条眼睛就花了。真正有价值的差评比如“红烧肉咸得发苦配的米饭还是夹生的”被淹没在“好评”“还行”“物流快”这类无信息量的短评里。评论甄别智能体要做的事情很具体给一条评论文本判断它是否包含可参考的信息并输出结构化的判定结果。这个智能体适合谁适合正在做 AI 应用工程化、想跑通第一个可运行智能体闭环的开发者。它不需要你从零手写复杂逻辑但需要你能看懂 AI 生成的代码、能判断对错、能在出问题时指挥它改。核心检索词就三个AI 智能体、Claude Code、comment_agent.py。整条链路是 Python 脚本调用大模型 API用 TaoToken 统一 Key 和 API 通道接入避免在多个模型供应商之间来回切换配置。最小可运行闭环包含四个部分一份 Prompt 模板定义判定标准一个 Python 脚本封装调用逻辑一套统一的错误返回结构保证不崩溃一次真实评论样本的验证动作确认输出符合预期。跑通之后你会得到一个能直接复用的 comment_agent.py后续换 Prompt 就能改行为不用动代码。我试过把这套骨架直接搬到商品问答、工单分类场景改的只是 Prompt 和字段名脚本结构基本不动。这就是工程化的价值一次搭好多处复用。2. 前置准备用 TaoToken 统一 Key 和 API 通道在写代码之前先把 API 通道理顺。很多同学卡在第一步Anthropic 官方 Key 申请流程长、额度管理麻烦换模型又要重新配一套环境变量。TaoToken 的思路是提供一个统一的 API 入口一个 Key 走通模型对话、编码计划、控制台管理。你需要做三件事第一注册并拿到 API Key。访问官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 完成注册然后进控制台 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 创建 Key。Key 只在创建时完整显示一次复制保存好。第二确认 API 基地址。TaoToken 的 API 入口是 https://taotoken.net/api注意这个地址不带 UTM 参数直接用于代码里的 base_url 配置。第三把 Key 写进 .env 文件不要硬编码在脚本里。项目根目录建一个 .env# .env TAOTOKEN_API_KEYsk-你的实际Key TAOTOKEN_BASE_URLhttps://taotoken.net/api同时建 .gitignore把 .env 排除掉# .gitignore .env __pycache__/ *.pyc依赖安装两条命令搞定pip install anthropic python-dotenv这里有个容易踩的坑anthropic 库默认会去连官方地址如果你不显式传 base_url请求会走错通道导致鉴权失败。所以初始化客户端时必须带上 base_url 参数下一节的代码里会体现。如果你更习惯用 Claude Code 这类编码工具来生成和调试脚本TaoToken 的 Coding Plan 页面 https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 有对应的接入说明长期做 Agent 开发的话可以关注。模型对话能力可以在 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 先手动验证一下通道是否通。3. 可复制配置config.toml 与 comment_agent.py3.1 config.toml 统一管理参数把模型名、超时、截断长度这些可变参数抽到配置文件改行为不用动代码# config.toml [api] base_url https://taotoken.net/api model claude-sonnet-4-20250514 timeout 30 max_retries 2 [agent] max_input_chars 2000 temperature 0.0 prompt_file prompt_template.txt读取配置用 Python 3.11 自带的 tomllib不用额外装包import tomllib def load_config(path: str config.toml) - dict: with open(path, rb) as f: return tomllib.load(f)3.2 prompt_template.txt 判定标准Prompt 决定智能体的行为边界。这份模板定义了四个判定维度和严格的 JSON 输出格式你是一个专业的用户评论质量审核员擅长从海量评论中甄别出真正有参考价值的评论。 任务判断给定评论是否有效依据以下四个维度综合判断 1. 具体性是否包含具体的人、事、物、场景描述 2. 可验证性描述是否可被其他用户验证或复现 3. 相关性内容是否与商品/服务本身相关 4. 信息密度是否提供了超出常识的有效信息 输出格式必须严格输出以下 JSON不包含任何其他文字、引导语或 Markdown 代码块标记 { valid: true 或 false, reason: 判定理由中文不超过80字, details: { specificity: true 或 false, verifiability: true 或 false, relevance: true 或 false, information_density: true 或 false } } 边界规则 - 空输入、纯空格valid 为 falsereason 为输入为空 - 纯表情、纯符号、纯数字valid 为 falsereason 为无有效文本内容 - 非中文内容valid 为 falsereason 为非中文内容暂不支持 - 仅有情绪表达无事实如太难吃了垃圾valid 为 falsereason 为仅有情绪表达无具体事实3.3 comment_agent.py 核心脚本脚本的关键设计是所有错误路径返回与正常输出结构一致的字典valid 为 falsedetails 四个维度全 false。这样调用方永远拿到统一结构不用写一堆 if 判断。评论甄别智能体输入评论文本输出结构化判定结果。 import os import re import json import tomllib from typing import Any from dotenv import load_dotenv from anthropic import Anthropic load_dotenv() def load_config(path: str config.toml) - dict: with open(path, rb) as f: return tomllib.load(f) CONFIG load_config() CLIENT Anthropic( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlos.getenv(TAOTOKEN_BASE_URL, CONFIG[api][base_url]), ) def _error_result(reason: str) - dict: 构造统一结构的错误返回。 return { valid: False, reason: reason, details: { specificity: False, verifiability: False, relevance: False, information_density: False, }, } def _load_prompt() - str: with open(CONFIG[agent][prompt_file], r, encodingutf-8) as f: return f.read() def _parse_output(text: str) - dict: 解析模型输出先尝试直接 json.loads失败则正则提取花括号内容。 try: return json.loads(text) except json.JSONDecodeError: match re.search(r\{.*\}, text, re.DOTALL) if match: try: return json.loads(match.group()) except json.JSONDecodeError: pass return _error_result(模型输出解析失败) def analyze_comment(comment_text: str, model: str | None None) - dict: 分析单条评论返回结构化判定结果。 Args: comment_text: 待分析的评论文本。 model: 可选覆盖配置中的模型名。 Returns: 包含 valid、reason、details 的字典。 if comment_text is None: return _error_result(输入为空) if not isinstance(comment_text, str): return _error_result(输入类型错误需为字符串) if not comment_text.strip(): return _error_result(输入为空) max_chars CONFIG[agent][max_input_chars] truncated False if len(comment_text) max_chars: comment_text comment_text[:max_chars] truncated True try: resp CLIENT.messages.create( modelmodel or CONFIG[api][model], max_tokens512, temperatureCONFIG[agent][temperature], system_load_prompt(), messages[{role: user, content: comment_text}], ) raw resp.content[0].text result _parse_output(raw) if truncated: result[reason] result.get(reason, ) 评论过长已截断 return result except Exception as e: return _error_result(fAPI调用异常{type(e).__name__}) if __name__ __main__: samples [ , , 还行吧, 红烧肉软烂入味肥而不腻配的米饭粒粒分明分量足两个人吃刚好就是上菜等了25分钟。, 太难吃了垃圾, ] for i, s in enumerate(samples, 1): print(f--- 测试 {i} ---) print(f输入: {s[:30]!r}) print(f结果: {json.dumps(analyze_comment(s), ensure_asciiFalse)})注意 _error_result 这个辅助函数它保证了空输入、类型错误、解析失败、API 异常四条路径返回的结构完全一致。这是工程化里最容易被忽略但最影响下游调用的细节。4. 验证请求与成功结果4.1 先验证 API 通道在跑完整脚本前先用最小请求确认 TaoToken 通道是通的from anthropic import Anthropic import os from dotenv import load_dotenv load_dotenv() client Anthropic( api_keyos.getenv(TAOTOKEN_API_KEY), base_urlhttps://taotoken.net/api, ) resp client.messages.create( modelclaude-sonnet-4-20250514, max_tokens64, messages[{role: user, content: 回复两个字通了}], ) print(resp.content[0].text)如果这里报鉴权错误先检查 Key 是否复制完整、base_url 是否写对。通道通了再跑主脚本。4.2 运行 comment_agent.pypython comment_agent.py预期输出实际 reason 措辞可能略有差异--- 测试 1 --- 输入: 结果: {valid: false, reason: 输入为空, details: {specificity: false, verifiability: false, relevance: false, information_density: false}} --- 测试 2 --- 输入: 结果: {valid: false, reason: 输入为空, details: {...}} --- 测试 3 --- 输入: 还行吧 结果: {valid: false, reason: 缺少具体描述信息密度不足, details: {...}} --- 测试 4 --- 输入: 红烧肉软烂入味肥而不腻... 结果: {valid: true, reason: 包含具体菜品描述和口感细节, details: {specificity: true, verifiability: true, relevance: true, information_density: true}} --- 测试 5 --- 输入: 太难吃了垃圾 结果: {valid: false, reason: 仅有情绪表达无具体事实, details: {...}}4.3 真实样本验证动作拿一条真实评论做端到端验证观察四个维度是否被正确拆解from comment_agent import analyze_comment sample 买了三天屏幕右上角出现一条竖线重启没用联系客服说要寄回检测来回运费谁出没说清楚。 result analyze_comment(sample) print(result)预期 valid 为 truespecificity 和 verifiability 为 true因为描述了具体故障现象和时间线。如果 details 里 relevance 被判 false说明 Prompt 对“相关性”的定义需要收紧——这类偏差先记录不要立刻改等积累一批样本再统一调。验证成功的标准很简单脚本不崩溃、输出是合法 JSON、空输入被拦截且没调用 API、详细评论被判有效、情绪发泄被判无效。做到这四点最小闭环就跑通了。5. 本篇常见错排查5.1 鉴权失败 401最常见的原因是 base_url 没传或传错。anthropic 库不传 base_url 会走官方地址你的 TaoToken Key 在那边不认。检查初始化代码里 base_url 是否为 https://taotoken.net/api。另一个原因是 .env 没被加载确认 load_dotenv() 在读取环境变量之前调用。5.2 模型输出带引导语导致解析失败有时候模型会返回“好的以下是判定结果{...}”。脚本里的正则回退能兜住大部分情况但如果引导语里也含花括号就会误匹配。解决办法是在 Prompt 里强调“不包含任何其他文字、引导语或 Markdown 代码块标记”并在 _parse_output 里优先匹配最后一个完整 JSON 对象。5.3 空输入仍然调用了 API检查 analyze_comment 里的三个前置判断顺序None 检查、类型检查、strip 后空检查。如果漏了 isinstance 检查传入数字会走到 API 调用报错。可以在空输入分支加一行 print 确认没走网络请求。5.4 超长评论截断后 reason 没提示截断逻辑里 truncated 标志位要在解析成功后才拼接提示。如果模型返回解析失败走了 _error_result截断提示就丢了。这是可接受的因为错误结果的 reason 已经说明了失败原因。5.5 异常处理返回 NoneAI 生成的代码有时会在 except 块里写 return None 或只 print。这会导致调用方拿到 None 后崩溃。必须改成返回 _error_result(...)保持结构一致。发现这种情况直接改代码或者让 Claude Code 重新生成异常处理段。5.6 依赖版本冲突anthropic 库版本更新较快旧版本的 messages.create 参数名可能不同。如果报 TypeError 说参数不认识先 pip show anthropic 看版本必要时 pip install -U anthropic 升级。python-dotenv 一般不会有问题。6. 下一步把 Key 和通道固定下来跑通这个闭环之后你手里有了一个能复用的骨架config.toml 管参数prompt_template.txt 管行为comment_agent.py 管逻辑TaoToken 统一 Key 管通道。后续换场景只需要改 Prompt 和字段名脚本结构不动。如果你要长期做编码类 Agent 开发建议把 API Key 和接入文档放在手边API Keys 管理页 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 用来创建和轮换 Key接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 有各语言的调用示例。想先在网页上手动验证模型输出格式可以用模型对话 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 快速试。长期跑 Agent 任务、需要稳定额度的看 Coding Plan https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite。一个实用技巧把 config.toml 里的 temperature 设成 0.0 做判定类任务输出更稳定做创意类任务再调到 0.7 以上。这个参数改一行就能生效不用动脚本。