ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

AI钱币鉴定实战:基于Agent与多模态大模型的辅助工具构建

2026/9/7 8:54:57 拓冰建站 浏览量
AI钱币鉴定实战:基于Agent与多模态大模型的辅助工具构建 1. 背景为什么“AI 钱币鉴定”值得做以及大模型能解决什么问题收藏圈里有一句老话钱币鉴定“三分靠眼力七分靠经验”。一枚古钱币是真品还是仿品是普通版还是稀有版品相能评到什么级别往往需要评级师翻阅大量图录、对比铸造工艺、观察包浆和磨损细节。人工鉴定成本高、周期长而且不同鉴定者对同一枚币的意见也可能不一致。随着多模态大模型的出现这件事有了新的解法。大模型除了能理解文字还能直接读取图片中的细节特征比如钱币上的文字书写风格、边缘打磨痕迹、包浆颜色分布、磨损程度、铸孔形状等。再配合 Agent 架构我们能把“鉴定”这个流程拆成多个步骤先做品种识别再做细节描述再做品相评分最后生成结构化报告。这套流程如果完全靠人工实现可能要写很多图像处理代码但用大模型来驱动落地成本会低很多。本文要分享的是一套基于 Claude Agent 思路 智谱 GLM 多模态大模型的 AI 钱币鉴定实战方案。我们会从一个命令行的钱币鉴定工具开始逐步拆解 Agent 编排逻辑、多模态调用方式、提示词设计、结构化报告生成以及生产环境落地的常见坑点。需要提前说明的是文章写作时各家大模型的接口和版本更新很快。示例中提到的模型标识、API 地址、参数格式请务必以智谱开放平台和对应服务商的最新官方文档为准核心思路可以复用。2. 技术方案与整体架构2.1 AI 钱币鉴定到底在鉴定什么先明确业务范围。AI 钱币鉴定不是要取代专业评级机构而是做“辅助鉴定”品种识别根据钱币文字、图案、年代特征判断这枚币可能属于哪个朝代、哪个版别。真伪辅助判断观察文字是否僵硬、边缘是否有人工做旧痕迹、包浆是否自然。品相评分根据磨损程度、磕碰、锈蚀、氧化、清理痕迹等给出一个参考品相等级。参考信息生成生成符合收藏描述习惯的鉴定意见例如“文字清晰、地章平整、边缘有一处磕碰”这种表述。传统方案要实现这些能力需要分别训练目标检测模型、文字识别模型、分类模型而且每个模型都需要大量标注数据。多模态大模型的优势在于一个模型就能同时完成描述、分类和推理开发周期短迭代也方便。2.2 Agent 与多模态大模型的分工文章标题中提到了两个角色Claude Agent 和智谱 GLM 大模型。在实际技术架构中它们的分工可以这样理解Agent 负责“流程控制”拆解鉴定任务、决定先调用哪个工具、汇总结果、生成报告。多模态大模型负责“感知与推理”直接读取钱币图片输出细节描述和判断依据。如果使用 Claude 官方的 Agent 能力可以借助它的工具调用机制来编排流程如果不方便接入 Anthropic 的 Agent 服务也可以自己在 Python 里实现一个轻量级 Agent 调度器把多模态模型作为“鉴定专家工具”接入。接下来我们采用第二种方式这样不依赖特定 Agent 平台的封闭接口任何大模型 API 都可以接入。2.3 架构设计图整个项目的调用链路可以画成下面这张 ASCII 图用户上传钱币图片 | v ------------------ | Agent 编排层 | 负责任务拆解、步骤编排、结果汇总 | (Claude Agent | 可选也可用自建 Python Agent | 或自建调度器) | ------------------ | v ------------------ | 多模态模型层 | 识别文字、图案、包浆、磨损等信息 | (智谱 GLM 系列) | ------------------ | v ------------------ | 知识/规则工具 | 版别对照、文字正则清洗、评分规则映射 ------------------ | v ------------------ | 结构化报告输出 | JSON Markdown 双格式 ------------------这样设计的好处是每一层都可以单独替换。今天用智谱 GLM明天想换成其他多模态模型只需要改动模型调用层Agent 编排和报告输出逻辑不用动。3. 环境准备与版本说明3.1 运行环境本文示例以 Python 3.10 环境为例。项目只依赖少量第三方库核心调用使用 HTTP 请求完成避免绑定某个厂商的专用 SDK。这样在不同平台迁移时成本最低。需要准备以下内容Python 3.10 或更高版本。一个可用的智谱开放平台账号并开通多模态模型接口权限。如果接入 Claude Agent需要准备对应平台的 API Key。如果只是体验自建 Agent 编排则只需要智谱的 Key。一个能联网的终端环境。若干钱币图片用于测试。可以用自己拍摄的钱币照片也可以从公开图库中下载清晰的钱币图片。3.2 安装依赖创建项目目录并初始化虚拟环境mkdir coin-assessor cd coin-assessor python -m venv venv source venv/bin/activate # Windows 下使用 venv\Scripts\activate安装依赖pip install requests pillow python-dotenv各库的作用如下requests发送 HTTP 请求调用大模型 API。pillow读取图片基本信息、做简单的尺寸校验和压缩。python-dotenv从 .env 文件中读取 API Key避免把密钥写死在代码里。3.3 项目结构为了让代码层次清晰示例项目采用如下结构coin-assessor/ ├── .env # 存放 API Key不提交到 Git ├── requirements.txt # 依赖清单 ├── config.py # 配置读取 ├── glm_client.py # 智谱 GLM 多模态调用封装 ├── agent.py # Agent 调度器 ├── report.py # 报告格式化与保存 ├── main.py # 命令行入口 └── samples/ └── coin1.jpg # 测试图片3.4 版本说明大模型 API 的模型标识会随平台更新而变化。本文示例中的模型标识、请求地址和参数结构采用当前主流兼容的格式来演示。你在实际操作时请以智谱开放平台文档列出的最新模型名称为准。如果接口字段有调整重点检查两个位置请求地址是否仍是 /chat/completions 这个路径。content 中图片的传递格式是 image_url 还是其他字段。4. 核心实现一步一步构建钱币鉴定工具4.1 配置模块config.py新建 config.py负责读取环境变量# config.py import os from dotenv import load_dotenv load_dotenv() ZHIPU_API_KEY os.getenv(ZHIPU_API_KEY, ) ZHIPU_API_URL os.getenv( ZHIPU_API_URL, https://open.bigmodel.cn/api/paas/v4/chat/completions ) # 模型标识请以官方文档为准这里用一个占位说明 ZHIPU_MODEL os.getenv(ZHIPU_MODEL, glm-4v-plus) CLAUDE_API_KEY os.getenv(CLAUDE_API_KEY, )在 .env 文件中配置ZHIPU_API_KEY你的智谱APIKey ZHIPU_MODELglm-4v-plus CLAUDE_API_KEY你的ClaudeAPIKey可选需要解释的是我没有把模型名写死成标题中的“glm-5.1”因为模型名称属于平台动态信息。建议你在 .env 里配置成当前可用的多模态模型标识标题场景只是展示一种能力组合实际代码要保持可运行。4.2 多模态模型调用封装glm_client.py接下来封装智谱 GLM 的调用。核心逻辑包括读取本地图片并转为 Base64。构造多模态消息内容图片和文字一起传给模型。解析模型返回的文本。# glm_client.py import base64 import requests from config import ZHIPU_API_KEY, ZHIPU_API_URL, ZHIPU_MODEL def encode_image(image_path: str) - str: 将图片文件转为 base64 字符串 with open(image_path, rb) as f: return base64.b64encode(f.read()).decode(utf-8) def chat_with_image(image_path: str, user_text: str) - str: 调用智谱 GLM 多模态模型识别图片。 请求格式与 OpenAI 兼容接口保持一致按官方文档为准。 if not ZHIPU_API_KEY: raise RuntimeError(缺少 ZHIPU_API_KEY请检查 .env 配置) image_base64 encode_image(image_path) headers { Authorization: fBearer {ZHIPU_API_KEY}, Content-Type: application/json, } payload { model: ZHIPU_MODEL, messages: [ { role: user, content: [ { type: image_url, image_url: { url: fdata:image/jpeg;base64,{image_base64} }, }, { type: text, text: user_text, }, ], } ], temperature: 0.3, } resp requests.post(ZHIPU_API_URL, jsonpayload, headersheaders, timeout60) resp.raise_for_status() data resp.json() return data[choices][0][message][content]这个函数是整个工具的基础能力。后面 Agent 的每一次鉴定操作最终都会落到这个函数上。温度参数 temperature 设置为 0.3是为了让模型输出更稳定、更客观。钱币鉴定属于需要严谨描述的任务温度太高会导致模型用词飘忽一会儿说“品相极好”一会儿说“磨损严重”。4.3 提示词设计钱币鉴定专家的关键多模态模型能不能给出靠谱的鉴定结果提示词占一半权重。下面这段提示词是整套方案的核心我把它单独提炼出来。# agent.py 中使用的提示词片段 IDENTIFY_PROMPT 你是一名经验丰富的钱币鉴定专家。请仔细观察图片中的钱币从以下几个维度给出分析 1. 品种识别判断钱币的可能年代、类型或版别说明判断依据。 2. 文字与图案描述钱币上的文字内容、书写风格、图案细节注意是否有模糊、重铸、修补痕迹。 3. 边缘与地章描述钱币边缘的形制、地章是否平整是否有磕碰、毛刺、铸造缺陷。 4. 包浆与锈色描述钱币表面的包浆或锈色分布判断是自然形成还是人工做旧。 5. 磨损与品相判断钱币的磨损程度、划痕、磕碰、氧化情况给出品相初步判断。 6. 真伪辅助判断结合以上特征给出“存疑/待进一步考证/倾向真品/倾向仿品”等辅助意见并列出关键疑点。 要求 - 请用客观、中性的描述语言。 - 对不确定的地方明确说明“无法判断”不要编造细节。 - 输出内容控制在 400 字以内。 这样设计提示词有三个目的结构化引导模型从多个维度观察图片避免只描述“这是一枚铜钱”这种笼统结论。强制模型输出“判断依据”方便人工复核。对不确定内容申明“无法判断”降低幻觉风险。4.4 Agent 编排层agent.py现在进入 Agent 编排层。这个调度器模拟了 Claude Agent 的“任务拆解—工具调用—结果汇总”过程。我们的工具相对简单所以 Agent 流程可以拆成三个阶段调用识别工具获取钱币多维度描述。调用品相评分规则把描述映射为分数。汇总结果生成结构化 JSON 报告。# agent.py import json import re from glm_client import chat_with_image IDENTIFY_PROMPT 你是一名经验丰富的钱币鉴定专家。请仔细观察图片中的钱币从以下几个维度给出分析 1. 品种识别判断钱币的可能年代、类型或版别说明判断依据。 2. 文字与图案描述钱币上的文字内容、书写风格、图案细节。 3. 边缘与地章描述边缘形制、地章平整度、磕碰与铸造缺陷。 4. 包浆与锈色描述包浆或锈色分布判断是否自然。 5. 磨损与品相判断磨损程度、划痕、磕碰、氧化情况。 6. 真伪辅助判断给出辅助意见并列出关键疑点。 要求客观中性描述不确定时明确说“无法判断”不要编造细节输出控制在400字以内。 SCORE_PROMPT 根据下面的钱币描述对品相进行评分满分100分评分维度包括 - 文字清晰度25分 - 图案细节完整度25分 - 表面磨损与磕碰25分 - 包浆与氧化状态25分 请直接输出 JSON 格式不要输出其他内容格式如下 {total_score: 85, text_score: 22, pattern_score: 20, wear_score: 21, patina_score: 22, comment: 简要说明} def _parse_score(text: str) - dict: 从模型输出中解析 JSON 分数 try: # 提取 JSON 部分 match re.search(r\{.*\}, text, re.S) if match: return json.loads(match.group()) except json.JSONDecodeError: pass return { total_score: 0, text_score: 0, pattern_score: 0, wear_score: 0, patina_score: 0, comment: 评分解析失败请查看原始输出, } class CoinAssessmentAgent: 钱币鉴定 Agent负责任务编排与结果汇总 def __init__(self, image_path: str): self.image_path image_path self.steps [] # 记录每个步骤的中间输出 def step_identify(self): 第一步调用 GLM 多模态识别 result chat_with_image(self.image_path, IDENTIFY_PROMPT) self.steps.append({step: identify, output: result}) return result def step_score(self, identify_text: str): 第二步基于识别结果做品相评分 prompt SCORE_PROMPT \n\n钱币描述如下\n identify_text result chat_with_image(self.image_path, prompt) scores _parse_score(result) self.steps.append({step: score, output: scores}) return scores def run(self): 执行完整鉴定流程 identify_result self.step_identify() scores self.step_score(identify_result) report { image_path: self.image_path, identify: identify_result, score: scores, conclusion: self._build_conclusion(identify_result, scores), } return report def _build_conclusion(self, identify_text: str, scores: dict) - str: 生成简要结论 if scores[total_score] 85: level 品相优良收藏价值较高 elif scores[total_score] 70: level 品相中等偏上有收藏价值 elif scores[total_score] 60: level 品相一般适合普通收藏 else: level 品相较弱建议谨慎评估 return f综合评分 {scores[total_score]} 分{level}。这里的 Agent 调度器虽然简单但已经具备真实 Agent 的核心特征步骤可回溯、工具可替换、结果可结构化。如果后续要接入真正的 Claude Agent 平台只需要把 GLM 调用封装成工具并定义 tool schema编排逻辑可以平移。4.5 报告格式化模块report.py模型返回的是纯文本和 JSON为了输出更友好我们再写一个报告格式化模块# report.py import json from datetime import datetime def format_report(report: dict) - str: 将报告转换为 Markdown 文本 lines [] lines.append( AI 钱币鉴定报告 ) lines.append(f图片{report[image_path]}) lines.append(f生成时间{datetime.now().strftime(%Y-%m-%d %H:%M:%S)}) lines.append() lines.append(【鉴定描述】) lines.append(report[identify]) lines.append() lines.append(【品相评分】) score report[score] lines.append(f- 文字清晰度{score[text_score]} / 25) lines.append(f- 图案完整度{score[pattern_score]} / 25) lines.append(f- 磨损与磕碰{score[wear_score]} / 25) lines.append(f- 包浆与氧化{score[patina_score]} / 25) lines.append(f- 综合评分{score[total_score]} / 100) lines.append(f- 评价{score[comment]}) lines.append() lines.append(【结论】) lines.append(report[conclusion]) return \n.join(lines) def save_report(report: dict, output_path: str report.json): 保存 JSON 报告 with open(output_path, w, encodingutf-8) as f: json.dump(report, f, ensure_asciiFalse, indent2)4.6 命令行入口main.py最后是命令行入口。用户传入图片路径程序执行完整鉴定流程并同时输出 Markdown 报告和 JSON 文件。# main.py import argparse from agent import CoinAssessmentAgent from report import format_report, save_report def main(): parser argparse.ArgumentParser(descriptionAI 钱币鉴定工具) parser.add_argument(--image, requiredTrue, help钱币图片路径) parser.add_argument(--output, defaultreport.json, helpJSON 报告输出路径) args parser.parse_args() agent CoinAssessmentAgent(args.image) report agent.run() print(format_report(report)) save_report(report, args.output) print(f\nJSON 报告已保存到 {args.output}) if __name__ __main__: main()到这里一个完整的 AI 钱币鉴定工具就写完了。整个工具还不到 300 行代码核心逻辑都集中在大模型调用和 Agent 流程编排上这也是大模型应用开发与传统软件开发最大的不同点业务主流程可以被模型推理取代。5. 运行与验证5.1 运行命令准备好一张清晰的钱币图片放到 samples 目录下然后执行python main.py --image samples/coin1.jpg --output report.json如果 API Key 配置正确程序会先调用 GLM 识别图片然后进行评分最后在终端打印报告。5.2 预期输出示例下面是一次实际运行的输出样式具体内容取决于图片和模型这里只是格式示例 AI 钱币鉴定报告 图片samples/coin1.jpg 生成时间2025-06-01 14:30:22 【鉴定描述】 这枚钱币从文字风格和形制看具有较为明显的清代钱币特征。币面文字书写较为流畅边缘轮廓清晰地章基本平整。表面包浆分布相对自然无明显人工做旧痕迹。边道可见轻微磨损币面有两处细小磕碰。综合来看倾向真品但部分细节仍需与权威图录核对。 【品相评分】 - 文字清晰度22 / 25 - 图案完整度21 / 25 - 磨损与磕碰19 / 25 - 包浆与氧化21 / 25 - 综合评分83 / 100 - 评价整体保存状态较好文字和图案细节清晰边部有轻微磨损。 【结论】 综合评分 83 分品相中等偏上有收藏价值。5.3 结果怎么验证多模态大模型的输出不能当作最终鉴定结论。建议按下面三步验证把识别出的钱币品种和权威图录、专业钱币网站交叉比对。让有经验的收藏者复核模型的描述是否准确。对于“存疑”或“倾向仿品”的结果最好送专业评级机构做实物鉴定。把 AI 当辅助工具用而不是当裁判用这是大模型应用落地的正确姿势。6. 常见问题与排查思路在实际调试过程中最容易遇到的问题集中在下面几个维度问题现象常见原因解决思路接口返回 401API Key 未配置或已过期检查 .env 文件确认 Key 无多余空格重新生成 Key接口返回模型不存在模型标识填写错误登录开放平台控制台查看当前可用的模型标识图片过大导致请求超时Base64 编码后图体积太大先用 Pillow 压缩图片限制最长边为 1024 像素识别结果内容为空图片太模糊模型无法提取特征更换清晰图片或调整拍摄光线评分 JSON 解析失败模型没有严格按 JSON 输出增强提示词约束用正则兜底提取 JSON 片段返回内容偏向编造细节提示词没约束不确定性表达在提示词中强制增加“无法判断时明确说明”频繁调用触发限流单账号 QPS 超限增加重试机制或申请更高并发额度6.1 图片压缩示例针对图片过大的问题可以写一个简单的压缩函数# image_utils.py from PIL import Image def compress_image(input_path: str, output_path: str, max_size: int 1024): 将图片压缩到指定最长边并转为 JPEG 格式 img Image.open(input_path) img.thumbnail((max_size, max_size)) if img.mode ! RGB: img img.convert(RGB) img.save(output_path, JPEG, quality85) return output_path在调用 GLM 之前先对图片做压缩既能减少传输体积也能避免部分平台对超大图片的请求限制。6.2 限流重试示例如果遇到瞬时并发超限可以在 glm_client.py 中加入简单的重试逻辑import time def request_with_retry(payload, headers, max_retries3): 带重试的请求封装 for attempt in range(max_retries): try: resp requests.post(ZHIPU_API_URL, jsonpayload, headersheaders, timeout60) if resp.status_code 429: time.sleep(2 * (attempt 1)) continue resp.raise_for_status() return resp.json() except requests.exceptions.Timeout: if attempt max_retries - 1: raise time.sleep(2 * (attempt 1)) raise RuntimeError(请求失败)注意这里只演示了重试思路生产环境还需要考虑请求幂等性和任务队列。7. 最佳实践与工程建议7.1 提示词工程是核心同样的模型提示词写法不同鉴定结果可能天差地别。实际项目中建议把提示词单独维护成配置文件或模板文件不要散落在代码里。每次调整提示词后需要准备一套标准测试图片集来回归验证避免改好一个维度却破坏了另一个维度。对于钱币鉴定这个场景提示词里一定要包含“不确定就说不确定”的要求。收藏品市场对虚假信息非常敏感模型一旦自信地编造一个版别名称用户可能因此产生经济损失。7.2 结构化输出优先生产环境不要直接解析模型的自由文本结果应该尽量让模型输出 JSON 或 Markdown 结构然后做校验。即使模型输出了非法 JSON也要有兜底逻辑而不是直接让程序崩溃。更稳妥的做法是让 Agent 先生成原始描述再让模型基于描述生成结构化数据分两步来降低输出格式不稳定的问题。本文示例中的评分阶段就是这种思路。7.3 合规与免责声明涉及钱币、收藏品鉴定一定要在应用里加一句免责说明AI 鉴定结果仅供参考不构成真伪、价值的最终判断请以专业评级机构为准。这既是合规要求也保护开发者自己。类似的思路也适用于其他辅助决策类应用比如医疗影像辅助筛查、法律文书预审等。大模型是降低人工成本的好工具但在关键决策链路上人必须留到最后。7.4 成本控制多模态模型按 token 计费图片是消耗大户。控制成本可以从几方面入手压缩图片减少视觉 token 数量。优先做一次基础识别只有基础识别置信度不足时才触发二次高清分析。把历史鉴定报告缓存起来相同图片避免重复调用。7.5 知识库扩展如果想让鉴定结果更专业可以给 Agent 挂一个钱币知识库。例如把常见钱币图录、版别特征、市场参考价格存入向量数据库Agent 在鉴定前先检索相关背景知识再调多模态模型识别图片。这样模型输出会更贴近真实收藏语境减少“外行话”。具体实现可以用常见的 RAG 架构这里不展开但“Agent 多模态模型 知识库”的大方向是明确的。8. 总结与下一步学习方向本文围绕“AI 钱币鉴定”这个场景完整搭建了一个基于 Agent 编排 多模态大模型的应用。你掌握的关键点包括用 Claude Agent 的编排思路来拆解鉴定流程。用智谱 GLM 多模态接口识别钱币图片细节。用提示词工程约束模型输出提升鉴定结果稳定性。用 JSON 结构化输出 报告格式化让工具真正可用。下一步你可以从三个方向继续深入一是把命令行工具改造成 Web 服务用 FastAPI 接收图片并返回报告二是引入 RAG 知识库让模型参考真实钱币图录三是把品相评分标准做得更细参考专业评级机构的维度来设计打分规则。模型会迭代API 会更新但“任务拆解 模型调用 结构化输出”这套应用范式不会变。拿一个自己熟悉的领域用这套范式做一个小工具是理解大模型应用开发最有效的方式。如果本文对你有帮助可以收藏备用。实际搭建时遇到问题欢迎在评论区交流你的报错信息和调试过程。