这次我们来看一个很有意思的组合项目:AI 钱币鉴定。它的核心不是某个单独的模型,而是把 Claude Agent 的任务编排能力,和智谱 GLM-5.1 大模型的视觉理解能力接在一起,组成一条“钱币图片 → 特征识别 → 知识比对 → 结构化鉴定报告”的链路。用户只需要上传一张钱币照片,就能得到这枚钱币的币种、年份、版别、品相特征、真伪判断依据,以及一个保守的行情参考区间。
这个项目最值得关注的点有四个:第一,Claude Agent 负责拆解问题和调度工具,适合做多轮鉴定对话;第二,智谱 GLM-5.1 负责看图和提取细节,能处理钱币上的文字、纹饰、磨损、包浆等信息;第三,整个链路可以封装成 API,也能做成批量目录扫描;第四,资源门槛灵活,如果全部走云端 API,本地不需要独立显卡,如果想把视觉模型本地化,则按模型参数量准备 GPU。下面我会带大家把架构、环境、代码、接口、批量任务和排错整个走一遍,顺便聊聊 AI 鉴定在真实收藏场景里能用在哪、不能用在哪。
如果你是钱币收藏爱好者、二手文玩交易的运营人员,或者单纯想研究“Agent + 多模态大模型”怎么落地到垂直行业,这篇文章可以直接收藏。
1. 核心能力速览
| 能力项 | 说明 |
|---|---|
| 项目类型 | AI 钱币鉴定 Agent,多模型协作应用 |
| 模型构成 | Claude Agent(任务编排与推理)+ 智谱 GLM-5.1(图像视觉识别) |
| 主要功能 | 钱币币种识别、年份判断、版别比对、品相描述、真伪依据分析、行情参考 |
| 推荐硬件 | 纯 API 模式:普通开发机即可;本地视觉模型模式:需按模型参数量配置 GPU |
| 显存占用 | API 模式本机基本不占显存;本地部署需以实际模型版本和 nvidia-smi 实测为准 |
| 支持平台 | Windows / Linux / macOS,Python 3.10+ |
| 启动方式 | Python 脚本启动,可封装 FastAPI 服务 |
| 是否支持 API | 支持,可自行封装 REST 接口 |
| 是否支持批量任务 | 支持,目录扫描 + 并发处理 + CSV 导出 |
| 适合场景 | 收藏爱好者辅助鉴别、文玩商家批量初审、拍卖行预筛选、AI 多模态应用教学 |
需要说明的是,显存占用、API 模型名称、响应格式这些参数会受到具体模型版本和平台接口影响,本文会给出可替换的配置项,实际部署时以官方文档为准。
2. 适用场景与使用边界
2.1 这个项目适合谁
第一种用户是钱币收藏爱好者。很多人手里有几十枚老银元、铜钱,但是自己看不准年份和版别,送去评级机构又费时间。AI 鉴定可以先把特征、疑点整理出来,帮助用户决定要不要送评。第二种用户是文玩商家,他们经常要面对大量图片,靠人眼一张张看效率太低,批量鉴定脚本可以把初筛工作自动化。第三种用户是开发者,想研究“Agent + 视觉大模型”怎么落地,这个项目是一个很好的模板,任务拆解、工具调用、知识库检索、API 封装全都涉及。
2.2 使用边界与合规提醒
AI 钱币鉴定有非常明确的边界,不能当权威结论用。第一,AI 只能根据图像特征给出概率判断,无法测量重量、直径、材质密度,而这些恰恰是区分真伪的重要指标。第二,评级公司给出的品相分数、装盒结论,需要人工结合实物和评级标准执行,AI 不能替代。第三,如果涉及高价交易、文物定级、法律纠纷,必须以专业鉴定机构和法定鉴定结论为准。第四,人物肖像类钱币、文物类藏品的图片用于研究学习没问题,但商用前要确认版权和合规授权。
我建议在系统提示词和输出报告中都加上“结果仅供参考,不构成交易依据”的说明,并且不要承诺“保真”。这是行业应用的底线,也是避免纠纷的必要设计。
3. AI 钱币鉴定项目架构与工作流
3.1 两个模型怎么分工
很多新手会把“多模型应用”理解成简单拼接,实际上这里的分工逻辑比较清楚。Claude Agent 承担的是“大脑”角色,它要做三件事:分析用户问题、决定调用哪个工具、把工具返回的特征整理成鉴定报告。智谱 GLM-5.1 承担的是“眼睛”角色,它接收钱币图片,输出视觉特征,比如钱币正面的文字内容、背面的纹饰布局、边缘磨损程度、包浆状态,以及是否有明显的高仿特征。
之所以要拆成两个模型,是因为 Agent 场景对推理和工具调用的稳定性要求高,而钱币鉴定对细粒度视觉理解要求高。让同一个模型既做编排又做图像识别不是不行,但职责分开以后,系统提示词可以更聚焦,后续想换成其他视觉模型,比如把 GLM-5.1 换成其他多模态模型,只需要改一个工具函数,不需要改 Agent 主流程。
3.2 整体工作流
整个鉴定流程可以拆成六个阶段:
- 用户输入钱币图片和问题,比如“这枚银元是哪个年份的,有没有版别价值”。
- 本地对图片做预处理,压缩分辨率、控制文件体积、转成 base64。
- Claude Agent 收到请求后,判断是否需要调用视觉工具。
- Agent 调用智谱 GLM-5.1,传入图片和针对性的提问,获取视觉特征。
- Agent 再调用钱币知识库工具,把视觉特征和已收录的版别资料做比对。
- Agent 综合所有信息,输出一份结构化鉴定报告。
这套流程的可扩展性很强。如果以后收集了足够多的真伪对比图,还可以增加一个“特征比对工具”,让 Agent 在回答前先检索参考图库。如果接入了国内主流评级公司的公开评分规则,也可以把品相评分做成独立工具。
3.3 为什么值得这么组合
从成本角度看,纯 API 模式不用买显卡,部署门槛很低,适合个人玩家先跑通流程。从准确率角度看,视觉模型直接看整张图,比传统图像处理算法要稳,至少能给出一个比“瞎猜”靠谱得多的特征列表。从工程角度看,Claude Agent 的原生工具调用格式比较成熟,开发调试体验好,智谱的接口又是 OpenAI 兼容风格,国内外开发者都容易上手。
这个组合也适合做横向扩展。今天鉴定钱币,明天换一套提示词和知识库,就可以鉴定邮票、古玉、老家具,架构本身不需要改。
4. 环境准备与前置条件
4.1 硬件与系统
先说结论:如果走云端 API,本机只需要能运行 Python 的开发环境,Windows、Linux、macOS 都可以,不需要独立显卡。如果你想把智谱 GLM-5.1 本地化部署,用 Ollama 或其他推理框架加载,那就需要准备 GPU,具体参数量对应多少显存,需要以实际部署版本为准,不能拍脑袋。
磁盘方面,代码和依赖很小,几百 MB 足够。但如果要本地部署大模型,模型文件本身可能占几十 GB,建议预留充足空间。另外,API 模式对网络要求比较高,上传大图时会消耗流量,建议在稳定的网络环境下运行。
4.2 Python 环境与依赖
建议使用 Python 3.10 以上版本,创建独立的虚拟环境,避免和系统环境冲突。需要安装的核心依赖包括:Anthropic 官方 SDK、OpenAI 兼容 SDK、FastAPI、uvicorn、Pillow、requests。你可以把依赖写入 requirements.txt:
anthropic>=0.40.0 openai>=1.40.0 fastapi>=0.115.0 uvicorn>=0.30.0 python-multipart>=0.0.9 Pillow>=10.0.0 requests>=2.32.0安装命令:
pip install -r requirements.txt如果你的网络环境安装慢,可以切换为国内镜像源,这一步按常规操作处理即可。
4.3 API Key 与模型配置
项目需要两个 API Key:一个是 Anthropic 的 Key,用于调用 Claude 模型;另一个是智谱开放平台的 Key,用于调用 GLM-5.1。两个 Key 建议通过环境变量配置,不要硬编码在代码里,更不要提交到 GitHub。
# Linux / macOS export ANTHROPIC_API_KEY="你的AnthropicKey" export ZHIPU_API_KEY="你的智谱Key" export ZHIPU_BASE_URL="https://open.bigmodel.cn/api/paas/v4" export GLM_MODEL="glm-5.1" export CLAUDE_MODEL="你的Claude模型名"# Windows PowerShell $env:ANTHROPIC_API_KEY="你的AnthropicKey" $env:ZHIPU_API_KEY="你的智谱Key"注意,GLM_MODEL 这个值在不同平台、不同时间可用的模型名不一定相同,实际填写时以智谱开放平台模型广场显示的可用模型名为准。Claude 模型名也一样,从 Anthropic 控制台或官方文档确认后再填。
4.4 目录结构
建议按下面的结构管理项目文件,后续批量处理时会更清晰:
coin_appraiser/ ├── appraisers/ │ ├── __init__.py │ ├── agent.py # Claude Agent 主流程 │ ├── vision.py # 智谱 GLM-5.1 视觉工具 │ └── knowledge.py # 钱币知识库工具 ├── api.py # FastAPI 接口 ├── batch.py # 批量扫描脚本 ├── requirements.txt ├── samples/ # 测试图片 └── outputs/ # 鉴定结果5. 搭建 AI 钱币鉴定 Agent
5.1 图像预处理
钱币图片如果太大,直接传给 API 既慢又容易出现超时,所以先做压缩。下面这个函数会把最长边压缩到 1200 像素以内,并统一编码为 JPEG,把图片体积控制在合理范围:
# vision.py import os from PIL import Image def preprocess_image(src_path: str, dst_path: str = "temp_coin.jpg", max_side: int = 1200, quality: int = 85) -> str: img = Image.open(src_path) w, h = img.size scale = max_side / max(w, h) if scale < 1: img = img.resize((int(w * scale), int(h * scale)), Image.LANCZOS) if img.mode != "RGB": img = img.convert("RGB") img.save(dst_path, "JPEG", quality=quality) return dst_path这里有几个参数可以按需调整:max_side 控制分辨率,quality 控制压缩质量。对钱币这种细节较多的物体,不建议压得太狠,一般 quality 85 到 90 比较合适。
5.2 定义 GLM 视觉识别工具
智谱的接口风格是 OpenAI 兼容格式,图片以 base64 形式传递。下面封装了一个视觉调用函数,专门给 Claude Agent 当工具用:
# vision.py import base64 import os from openai import OpenAI client_glm = OpenAI( api_key=os.getenv("ZHIPU_API_KEY", "YOUR_ZHIPU_API_KEY"), base_url=os.getenv("ZHIPU_BASE_URL", "https://open.bigmodel.cn/api/paas/v4"), ) GLM_MODEL = os.getenv("GLM_MODEL", "glm-5.1") def glm_vision_analyze(image_path: str, question: str) -> str: if not os.path.exists(image_path): return "图片文件不存在,请检查路径" with open(image_path, "rb") as f: image_b64 = base64.b64encode(f.read()).decode("utf-8") ext = os.path.splitext(image_path)[-1].lower().lstrip(".") mime = {"jpg": "image/jpeg", "jpeg": "image/jpeg", "png": "image/png", "webp": "image/webp"}.get(ext, "image/jpeg") response = client_glm.chat.completions.create( model=GLM_MODEL, messages=[ { "role": "user", "content": [ {"type": "image_url", "image_url": {"url": f"data:{mime};base64,{image_b64}"}}, {"type": "text", "text": question} ] } ], temperature=0.2, ) return response.choices[0].message.content实际使用前,请以智谱开放平台最新文档为准确认消息格式和模型名。
5.3 定义钱币知识库工具
光有视觉识别还不够,Agent 还需要钱币常识来对照特征。下面用一个简单的 JSON 结构模拟知识库,实际项目中可以换成 Elasticsearch、Milvus 或任何向量数据库:
# knowledge.py import json KNOWLEDGE_BASE = { "袁世凯像壹圆": { "别名": "袁大头", "常见年份": "民国三年、八年、九年、十年", "简单特征": "正面袁世凯侧面像,背面嘉禾图案", "鉴别注意点": "不同年份在正面文字和背面嘉禾布局上有差异;高仿币常见压力不足、边齿生硬、包浆不自然" }, "孙中山像开国纪念币": { "别名": "孙小头", "常见年份": "民国开国纪念币", "简单特征": "正面孙中山侧面像,背面麦穗图案", "鉴别注意点": "注意英文拼写、齿边细节、包浆均匀度" } } def lookup_knowledge(keyword: str) -> str: for name, info in KNOWLEDGE_BASE.items(): if keyword in name or name in keyword: return json.dumps(info, ensure_ascii=False) return "知识库中未找到对应条目,请结合视觉特征和历史常识谨慎判断"这个知识库是演示级别,真正的生产环境需要由钱币领域的专业人士参与整理,并且要持续补充新的版别资料。
5.4 Claude Agent 主循环
接下来是核心部分。Claude Agent 通过 tool use 机制调用上面的工具,完成“看图 → 检索 → 汇总”的循环:
# agent.py import os from anthropic import Anthropic from vision import glm_vision_analyze, preprocess_image from knowledge import lookup_knowledge client_claude = Anthropic( api_key=os.getenv("ANTHROPIC_API_KEY", "YOUR_ANTHROPIC_API_KEY") ) CLAUDE_MODEL = os.getenv("CLAUDE_MODEL", "YOUR_CLAUDE_MODEL") SYSTEM_PROMPT = """你是一名钱币鉴定助手。你的任务是根据用户提供的钱币图片,输出鉴定报告。 报告必须包括:币种、年份、版别、品相特征、真伪判断依据、参考行情区间。 注意事项: 1. 默认调用 glm_vision_analyze 工具分析图片。 2. 可以得到关键词后调用 lookup_knowledge 工具检索知识库。 3. 所有判断用“根据图片特征推测”表述,不能承诺 100% 准确。 4. 如果图片不清晰,明确告诉用户需要重新拍摄。 5. 最终结果用 JSON 输出,字段包括 coin_type, year, version, condition, authenticity, price_range, evidence。""" tools = [ { "name": "glm_vision_analyze", "description": "调用智谱 GLM-5.1 视觉大模型识别钱币图像,返回钱币文字、纹饰、磨损、包浆等特征", "input_schema": { "type": "object", "properties": { "image_path": {"type": "string", "description": "钱币图像文件路径"}, "question": {"type": "string", "description": "需要视觉模型分析的问题"} }, "required": ["image_path", "question"] } }, { "name": "lookup_knowledge", "description": "在钱币知识库中检索版别、真伪特征、行情参考等资料", "input_schema": { "type": "object", "properties": { "keyword": {"type": "string", "description": "检索关键词"} }, "required": ["keyword"] } } ] def run_agent(image_path: str, question: str, max_rounds: int = 5) -> str: processed = preprocess_image(image_path) messages = [ {"role": "user", "content": f"请鉴定这张钱币图片:{processed}\n用户问题:{question}"} ] for _ in range(max_rounds): response = client_claude.messages.create( model=CLAUDE_MODEL, max_tokens=4096, system=SYSTEM_PROMPT, tools=tools, messages=messages, ) tool_results = [] final_texts = [] for block in response.content: if block.type == "tool_use": if block.name == "glm_vision_analyze": result = glm_vision_analyze(**block.input) elif block.name == "lookup_knowledge": result = lookup_knowledge(**block.input) else: result = "未知工具调用" tool_results.append({ "type": "tool_result", "tool_use_id": block.id, "content": result }) elif block.type == "text": final_texts.append(block.text) if not tool_results: return "\n".join(final_texts) or "Agent 未返回有效内容" messages.append({"role": "assistant", "content": response.content}) messages.append({"role": "user", "content": tool_results}) return "Agent 执行轮数超过上限,请检查输入图片或工具调用链"这个主循环的逻辑是:把用户问题发给 Claude,Claude 判断要不要调用工具;如果调用了工具,就把工具的返回结果回传给 Claude,让它在下一轮继续推理;如果 Claude 认为信息已经足够,就直接输出最终报告。max_rounds 限制了轮数上限,防止死循环。
6. 功能测试与效果验证
6.1 测试用例设计
搭建完 Agent,先不要急着上业务,建议用一组固定测试图来验证。以下是推荐的测试矩阵:
| 测试编号 | 测试内容 | 输入素材 | 预期行为 |
|---|---|---|---|
| T1 | 单张高清钱币正面图 | 清晰、光线均匀的银元正面照片 | 正确输出币种、年份、版别和特征描述 |
| T2 | 正反面双图 | 同一枚钱币的正面和背面照片 | 结合双面特征输出完整报告 |
| T3 | 多枚钱币合影 | 一张图里有两枚以上钱币 | 提示图片包含多枚钱币,建议单枚拍摄 |
| T4 | 模糊图/反光图 | 分辨率低或表面反光严重 | 明确提示图片质量不足并说明原因 |
| T5 | 知识问答 | 输入“袁大头有哪些常见年份” | 调用知识库返回客观常识 |
| T6 | 非钱币图片 | 普通物品照片 | 识别出不是钱币,拒绝强行鉴定 |
这组测试的意义在于确认 Agent 不是一个“什么图都硬答”的系统,而是知道自己的能力边界。
6.2 单张高清图鉴定测试
测试前准备一张清晰的银元照片,放在 samples 目录。然后执行:
result = run_agent("samples/silver_dollar_front.jpg", "请判断这枚钱币的币种、年份和版别,并说明依据。") print(result)成功的标准有三个:第一,JSON 字段完整;第二,币种判断与图片内容高度一致;第三,证据描述里能体现“边齿、包浆、字口”这些具体特征,而不是只输出一句“像是一枚老银币”。如果 Agent 描述得太空泛,说明提示词需要更严格,可以在 system prompt 里强制要求视觉模型先列出 5 到 10 个观察到的细节。
6.3 双面图与多币图测试
实际拍摄时,很多用户会一次性上传正反面两张图。我们可以在预处理阶段把两张图拼接成一张,或者让 Agent 依次分析两个文件。拼接方式更简单:
from PIL import Image def merge_two_images(front_path: str, back_path: str, dst_path: str = "merged.jpg"): im1 = Image.open(front_path) im2 = Image.open(back_path) new_img = Image.new("RGB", (im1.width + im2.width, max(im1.height, im2.height)), "white") new_img.paste(im1, (0, 0)) new_img.paste(im2, (im1.width, 0)) new_img.save(dst_path, "JPEG", quality=90) return dst_path多币合影则要注意:如果视觉模型反馈“图片中有多枚钱币”,最好的处理方式是提示用户重新单枚拍摄,因为自动裁剪检测会增加错误概率。除非你已经接入了专门的目标检测模型,否则不要把多币图直接丢给视觉模型做逐枚鉴定。
6.4 模糊图与反光图测试
模糊图是 AI 鉴定的典型失败场景。测试时可以用手机拍一张失焦的照片,或者故意压低光照。预期行为是 Agent 输出“图片不够清晰,无法可靠判断”,而不是强行给出一个答案。如果 Agent 在模糊图上依然给出很高的置信度,必须在系统提示词里加入限制:当图片质量不足时,输出 JSON 的 confidence 字段要低于 0.3,并且 evidence 字段必须写明缺陷。
反光也是钱币拍照的大问题,特别是银元表面的包浆在强光下会完全丢失细节。建议在拍摄规范里要求:自然光、不要开闪光灯、背景用纯色。
6.5 知识问答测试
除了图片鉴定,Agent 还可以当钱币知识助手用。比如用户问:“袁大头三年和八年的区别是什么?”如果知识库里有对应资料,Agent 应该能检索出来。这个测试不需要图片,直接跑 Agent 并观察是否调用了 lookup_knowledge 工具。如果回答全是从模型记忆里直接生成的,也没有关系,但生产环境中最好让明显的数据型问题走知识库,这样答案可控、可更新。
7. 接口 API 与批量任务
7.1 用 FastAPI 封装鉴定接口
Agent 跑通以后,下一步就是封装成服务,方便前端页面或其他系统调用。下面的代码用 FastAPI 实现一个上传接口:
# api.py import os import shutil import tempfile from fastapi import FastAPI, UploadFile, File, Form from agent import run_agent from vision import preprocess_image app = FastAPI() @app.post("/appraise") async def appraise( file: UploadFile = File(...), question: str = Form("请全面鉴定这枚钱币") ): suffix = os.path.splitext(file.filename or "")[-1] or ".jpg" with tempfile.NamedTemporaryFile(suffix=suffix, delete=False) as tmp: shutil.copyfileobj(file.file, tmp) tmp_path = tmp.name try: processed = preprocess_image(tmp_path, "temp_coin.jpg") result = run_agent(processed, question) return {"code": 0, "message": "ok", "data": result} except Exception as exc: return {"code": 1, "message": str(exc), "data": None} finally: os.unlink(tmp_path)启动服务:
uvicorn api:app --host 127.0.0.1 --port 8000启动后,用 curl 测试接口:
curl -X POST "http://127.0.0.1:8000/appraise" \ -F "file=@./samples/silver_dollar_front.jpg" \ -F "question=请判断这枚钱币的主要年份和版别"返回结果是一个 JSON 对象,里面的 data 字段是 Agent 生成的鉴定报告。在生产环境中,建议对返回结构增加统一校验,避免前端拿到非 JSON 文本。
7.2 批量目录扫描
批量任务适合商家处理大量图片。一个简单的批量脚本如下:
# batch.py import csv import concurrent.futures from pathlib import Path from agent import run_agent def process_one(image_path: str) -> dict: try: report = run_agent( image_path, "请判断币种、年份、版别、品相和真伪依据,并用 JSON 输出" ) return {"image": image_path, "ok": True, "error": "", "result": report} except Exception as exc: return {"image": image_path, "ok": False, "error": str(exc), "result": ""} def batch_appraise(input_dir: str, output_csv: str, max_workers: int = 4): patterns = ["*.jpg", "*.jpeg", "*.png", "*.webp"] images = [] for p in patterns: images.extend([str(fp) for fp in Path(input_dir).glob(p)]) with concurrent.futures.ThreadPoolExecutor(max_workers=max_workers) as pool: results = list(pool.map(process_one, images)) with open(output_csv, "w", newline="", encoding="utf-8-sig") as f: writer = csv.DictWriter(f, fieldnames=["image", "ok", "error", "result"]) writer.writeheader() writer.writerows(results) print(f"处理完成:{len(results)} 张图片,成功 {sum(1 for r in results if r['ok'])} 张") if __name__ == "__main__": batch_appraise("samples", "outputs/result.csv")执行:
python batch.py这里用了 utf-8-sig 编码,主要是方便 Excel 直接打开 CSV,避免中文乱码。
7.3 批量任务的并发控制与失败重试
批量任务最常遇到的问题就是 API 限流。ThreadPoolExecutor 的 max_workers 不要一开始就设成 16,建议从 2 到 4 开始,逐步加压。如果发现大量 429 或超时,要先检查 API Key 对应的并发配额。另一个常用手段是给 run_agent 外部加一个重试包装器,遇到网络超时和限流时指数退避重试:
import time def run_with_retry(image_path: str, question: str, retries: int = 3): for attempt in range(retries): try: return run_agent(image_path, question) except Exception as exc: if attempt == retries - 1: raise time.sleep(2 ** attempt)失败记录不要直接丢弃,可以把 error 信息写到单独的错误日志文件,等一轮任务跑完后再统一处理。
8. 资源占用与性能观察
8.1 云端 API 模式
如果 Claude 和智谱 GLM-5.1 都走云端 API,本机资源占用非常低,CPU 只用来做图片压缩和 JSON 解析,显存占用趋近于 0。这种情况下,性能瓶颈主要在网络请求耗时和 API 并发额度。建议在开发机上跑几千张图完全没有压力,只要控制好并发就行。
8.2 本地部署模式
如果你想本地部署视觉模型,需要安装推理框架并下载权重。部署后可以用 nvidia-smi 观察显存占用:
nvidia-smi重点看每个进程占用的显存、GPU 利用率、温度。如果出现 OOM,优先降低 batch size、开启量化、缩小图像分辨率。具体能跑到什么规模,取决于显卡型号和模型参数量,这里不给出固定数字,因为不同部署方案差异很大。
8.3 图像预处理对成本和性能的影响
图像大小直接影响 API 计费和响应速度。base64 编码会让图片体积增加约 33%,一张 3MB 的 JPG 转成 base64 后大约 4MB,上传慢而且容易触发请求体限制。所以预处理参数很关键:一般把最长边控制在 1024 到 1280 像素,quality 控制在 85 左右,单张图片体积控制在 1MB 以内。识别精度和文件大小需要做一个平衡,不要一味追求无损。
8.4 请求耗时的观察点
建议在 run_agent 外部记录每次请求的开始时间和结束时间,统计平均耗时。影响耗时的主要因素有三个:图片大小、Agent 工具调用轮数、上游 API 响应速度。工具调用轮数越少,延迟越低。所以系统提示词里要明确告诉 Agent:视觉工具最多调用一次,知识库工具可以根据需要多次调用,不要反复做无意义的二次看图。
9. 常见问题与排查方法
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
| API 返回 401 鉴权失败 | API Key 未设置、过期或填错 | 检查环境变量和日志中的请求头 | 重新生成 Key,确认环境变量生效 |
| 请求频繁返回 429 | 并发超限或额度不足 | 到平台控制台查看用量和配额 | 降低 max_workers,增加退避重试 |
| 请求超时 | 图片过大或网络不稳定 | 查看图片大小和请求耗时 | 压缩图片,调大 http timeout |
| Agent 返回内容不是 JSON | 提示词约束不够或模型输出不稳定 | 打印原始返回内容 | 增强 system prompt 并增加后处理解析 |
| 图片模糊导致识别失败 | 拍摄条件差或压缩过度 | 打开图片目测清晰度 | 重新拍摄,调整 quality 参数 |
| 本地模型 OOM | 显卡显存不足 | nvidia-smi 查看显存占用 | 减小并发,使用量化参数,换更小模型 |
| CSV 中文乱码 | 编码格式不兼容 | 检查文件编码 | 用 utf-8-sig 编码保存 |
| 批量任务卡住 | 某张图片请求无限等待 | 查看进程和日志 | 设置超时时间,添加失败重试机制 |
| Agent 死循环调用工具 | 工具调用链没有收敛 | 观察日志中的 tool_use 轮数 | 调低 max_rounds,优化提示词 |
遇到问题的时候,先看日志,再看原始返回,不要直接改代码。很多 Agent 应用的 bug 不是代码逻辑错,而是模型返回的数据结构和预期不一致。
10. 最佳实践与使用建议
10.1 制定图片采集规范
AI 鉴定准确率受图片质量影响极大。建议在实际项目里给用户一份拍摄规范:钱币平放在纯色背景上,镜头与币面垂直,光线均匀;银元需要正反两面各拍一张,最好有边齿特写;不要用闪光灯,避免包浆反光。如果做批量业务,还可以在预处理阶段自动检测模糊度和亮度,自动剔除不合格图片,减少无效请求。
10.2 把知识库当成独立资产
大模型的知识有截止日期,而且无法覆盖冷门版别。真正能沉淀下来的资产是知识库。每做一批鉴定,就把专家确认过的新版别特征、市场价格区间沉淀到知识库中,持续迭代。用户画像不同的项目里,知识库也应该不同:面向收藏家的知识库偏重版别体系,面向商家的知识库偏重流通品相和价格区间。
10.3 建立小样本评估集
不要靠感觉判断“模型变聪明了”。建议准备一个 50 到 100 张的小样本测试集,每张图片都有人工标注的币种、年份、版别标签。每次修改提示词、更换模型版本、更新知识库之后,都跑一遍测试集,计算准确率和失败率。这样你就能知道改动到底是变好还是变坏。
10.4 输出可追溯的鉴定报告
生产环境里,用户不会只满足于一句结论。报告最好包含三个部分:结论摘要、特征依据、保留声明。特征依据里要写清楚“AI 观察到哪些细节”,比如“正面文字压力略显不足,边齿有连续性差异,包浆分布较均匀”。保留声明要明确写“本结果仅基于图像特征,建议结合实物和官方评级复核”。这种报告即使判断失误,用户也更容易理解原因。
11. 总结与下一步
这个项目最值得尝试的点在于,它把一个很垂直的行业需求拆解成了“Agent 编排 + 多模态视觉 + 知识库检索”的标准技术方案。你不需要自己从零训练模型,而是用 Claude Agent 把现有模型组织成一条服务链路。最先应该验证的功能是单张清晰钱币图片的完整鉴定链路,先把流程跑通,再考虑做 API 和批量任务。最容易踩的坑有两个:一个是图片体积没控制好导致请求超时,另一个是 Agent 回答格式不稳定,需要靠提示词加解析兜底来收敛。
如果你对这套方案感兴趣,建议下一步从三个方向扩展:第一,把演示级知识库换成正式版版别数据库,最好结合专业图录;第二,引入评测集,用不少于 100 张已标注钱币图做准确率跟踪;第三,把鉴定接口接到小程序或 Web 前端,让用户能直接上传图片拿报告。等这些跑通之后,这套 Agent 架构完全可以复用到邮票、古家具、玉器等更多品类的辅助识别上。