基于Claude Agent与GLM多模态识别构建AI钱币鉴定助手实践指南
2026/9/7 4:40:46 网站建设 项目流程

各位读者好。钱币收藏圈一直有个老问题:一枚光绪元宝或者袁大头放到网上,不同人看边齿、看包浆、看字口,往往能得出完全相反的结论。人工鉴定依赖的是长期经验,经验又很难复制到系统里。大模型出现之后,这类“看图 + 知识推理”的任务有了新的落地方式,也就是把多模态识别和 Agent 工具编排结合起来,做一个 AI 钱币鉴定助手。

今天这篇文章从一个可运行的工程视角出发,完整拆解一个 AI 钱币鉴定 Agent 的实现过程。整体技术组合是:Claude Agent 负责任务规划、工具调用与最终报告生成,智谱 GLM 大模型负责钱币图片的多模态特征识别。通过这个项目,你可以掌握 Agent 工具调用循环的基本写法,也能学会如何把商用大模型 API 组合成真实可用的业务应用。

无论你是刚接触大模型应用开发,还是已经写过一些 API 调用脚本,这篇文章都会给你一套能直接照搬的思路和代码骨架。

1. 背景:为什么大模型可以参与钱币鉴定

1.1 钱币鉴定的本质是什么

钱币鉴定不是简单地看“花纹清不清楚”,而是一个典型的“视觉特征提取 + 领域知识推理”任务。

专业鉴定师拿到一枚钱币,通常会做这样几件事:

  1. 看文字与图案的压制效果,也就是字口是否挺拔、图案是否立体。
  2. 看边齿形态,机制币的边齿有直齿、橄榄齿、鹰洋齿等不同种类,仿品往往做不出自然磨损。
  3. 看包浆的层次感,真币包浆是长期氧化形成的,层次自然;假币包浆常浮于表面。
  4. 对比已知版别,不同省份、不同年份、不同造币厂生产的同一面值钱币,细节差别很大。
  5. 综合判断历史痕迹,比如磕碰、划痕、流通磨损是否符合年代特征。

这些判断步骤如果写成代码,过去几乎不可能。因为 “自然磨损” 和 “假币做旧” 之间没有固定公式,传统图像处理只能提取边缘、颜色、纹理等低层特征,很难做语义级别的判断。而多模态大模型正好擅长把图像内容“翻译”成文本描述,并且具备一定的版别知识,可以作为辅助鉴定工具。

1.2 从单次问答到 Agent 协作

如果我们只是把一张钱币图片发给一个大模型,让它直接判断真伪,会遇到两个问题。

第一是“幻觉”问题。模型可能没看清图中文字,却给出非常笃定的结论。第二是“一次调用”能力有限,模型只能基于自己的内部知识回答,无法分步思考,也无法在回答过程中调用外部工具去补充信息。

Agent 的思想是:大模型不再只做“输入一句话、输出一句话”的问答机器,而是成为一个“规划者”。它可以拆解任务、决定下一步调用什么工具、读取工具返回结果,再决定是否需要继续行动,最后生成结论。

在 AI 钱币鉴定场景下,这个思路非常合适。Claude Agent 可以扮演鉴定专家的“大脑”,先规划需要观察哪些特征,然后调用一个“钱币图片识别工具”,这个工具内部交给智谱 GLM 视觉大模型去完成多模态识别。拿到识别结果后,Claude Agent 再结合钱币学知识输出完整报告。

1.3 为什么选择 Claude Agent + 智谱 GLM 的组合

选择这个组合,更多是出于职责分工的考虑:

  • Claude Agent 在工具调用和复杂指令遵循方面表现得比较稳定,适合承担 Agent 的规划、循环控制、报告聚合任务。
  • 智谱 GLM 是多模态大模型,国内可以直接通过开放平台 API 调用,延迟相对可控,适合承担图片识别任务。
  • 把“视觉识别”和“推理规划”分开,还能灵活替换模型:如果某个视觉模型效果不好,只需要改一个工具函数,不需要动 Agent 主流程。

当然,这并不是唯一方案。你也可以用其他支持视觉的大模型替换智谱 GLM,用其他支持工具调用的模型替换 Claude。本文的重点是把整个架构和代码流程讲清楚,你按需替换即可。

2. 系统架构与核心流程

2.1 整体架构设计

AI 钱币鉴定 Agent 的整体架构可以拆成四层:

用户输入(钱币图片 + 鉴定问题) | v +-----------------------+ | Claude Agent 规划层 | | - 理解用户需求 | | - 解析要调用什么工具 | | - 汇总工具结果 | +-----------------------+ | v +-----------------------+ | 工具调度层 | | - tool_use 解析 | | - 工具循环执行 | +-----------------------+ | v +-----------------------+ | 智谱 GLM 视觉识别层 | | - 图片预处理 | | - 多模态特征提取 | | - 结构文本描述 | +-----------------------+ | v +-----------------------+ | 最终鉴定报告 | | - 基本信息 | | - 特征观察 | | - 存疑点 | | - 参考结论 | +-----------------------+

从用户视角来看,整个调用过程像一个黑盒,用户输入图片路径和问题,最终收到一份结构化鉴定报告。从开发者视角来看,核心要掌握三个点:Agent 工具注册、工具调用循环、多模态图片编码。

2.2 Agent 工具调用循环的 4 个步骤

目前主流大模型 Agent 的工具调用一般都遵循以下循环:

  1. 将用户问题发送给模型,同时在请求中声明可用的工具列表。
  2. 模型分析问题后返回一个或多个工具调用请求,而不是普通文本。
  3. 开发者解析工具调用,在本地真正执行对应函数,拿到结果。
  4. 把工具执行结果返回给模型,模型继续生成结论,或者发起下一次工具调用。

这个循环会一直进行,直到模型认为不再需要调用工具,直接返回最终答案。为了防止程序无限循环,我们要设置最大迭代次数。

2.3 为什么图片识别要单独做成工具

如果你用过视觉大模型,可能会觉得奇怪:Claude 本身也支持图片输入,为什么还要绕一圈,把图片交给智谱 GLM 识别?

这里的关键是分工和替换成本。

实际项目中,钱币图片可能来自用户上传、扫描件、拍卖网站截图等不同渠道,图片质量参差不齐。如果把这些图片直接全部交给 Claude,会占用大量多模态 token,而且一旦图片质量差,Claude 需要反复重试。

更好的方式是单独做一个“图片分析工具”,内部统一完成图片压缩、格式转换、Base64 编码,再调用智谱 GLM 视觉模型输出结构化描述。这样做的好处是:

  • 图片预处理逻辑与 Agent 主流程解耦。
  • 可以针对钱币场景定制更详细的识别 prompt。
  • 后续想换成其他视觉模型时,不需要改 Agent 调度逻辑。

所以本文的代码里,Claude Agent 并不会直接“看见”图片,它只能看到一个工具返回的文字识别结果。这种设计看起来多了一层,其实是更工程化的做法。

3. 环境准备与 API 配置

3.1 基础环境说明

本文代码使用 Python 编写,需要准备以下环境:

  • Python 3.10 或更高版本。
  • 一个智谱开放平台账号,用于获取智谱 GLM API Key。
  • 一个 Anthropic 账号,用于获取 Claude API Key。
  • 本地命令行工具和任意 IDE,本文示例使用 VS Code。

版本需要根据你的项目实际情况调整,本文示例以常见环境为例,重点演示配置思路。如果你使用的是 Python 3.9 或更低版本,代码中的str | None类型注解需要改成Optional[str]

3.2 创建项目目录与虚拟环境

首先创建一个项目目录,并进入目录:

mkdir ai-coin-appraiser cd ai-coin-appraiser

然后创建 Python 虚拟环境并激活:

python -m venv venv

Windows 下激活命令是:

venv\Scripts\activate

macOS 或 Linux 下激活命令是:

source venv/bin/activate

3.3 安装依赖

项目需要以下几个 Python 包:

anthropic zhipuai Pillow python-dotenv

将这些依赖写入requirements.txt

anthropic>=0.40.0 zhipuai>=2.1.0 Pillow>=10.0.0 python-dotenv>=1.0.0

然后安装:

pip install -r requirements.txt

说明一下每个包的作用:

  • anthropic:Claude API 官方 SDK,用于调用 Claude Agent。
  • zhipuai:智谱开放平台 SDK,用于调用 GLM 视觉模型。
  • Pillow:Python 图像处理库,用于压缩和转换钱币图片。
  • python-dotenv:用于读取.env环境变量文件,避免把密钥写死在代码里。

3.4 配置 API Key

在项目根目录创建.env文件:

ZHIPU_API_KEY=你的智谱APIKey ANTHROPIC_API_KEY=你的ClaudeAPIKey

需要注意的是,API Key 属于敏感信息,不要把.env文件提交到 Git 仓库。建议同时在项目根目录创建.gitignore,加入以下内容:

venv/ .env __pycache__/ *.pyc tmp_coin.jpg

申请 API Key 的具体入口以对应开放平台控制台为准,申请后建议开启调用权限限制,只给需要调用的接口授权。

3.5 项目文件结构

整个项目结构如下:

ai-coin-appraiser/ ├── .env ├── .gitignore ├── requirements.txt ├── main.py ├── agent/ │ ├── __init__.py │ ├── claude_planner.py │ ├── glm_vision.py │ └── tools.py └── images/ └── sample_coin.jpg

agent包存放 Agent 相关模块,images目录存放待鉴定的钱币图片。本文后面的代码均以此项目结构为准。

4. 核心代码实现

4.1 实现智谱 GLM 视觉识别模块

首先创建agent/glm_vision.py,这个文件负责调用智谱 GLM 视觉模型,输入是一张图片的本地路径,输出是模型对图片内容的文本描述。

# 文件路径:agent/glm_vision.py import base64 import os from PIL import Image from zhipuai import ZhipuAI class GlmVision: """基于智谱 GLM 视觉模型的钱币图片识别器。""" def __init__(self, api_key: str | None = None): self.client = ZhipuAI( api_key=api_key or os.getenv("ZHIPU_API_KEY") ) def preprocess_image(self, image_path: str, max_size: int = 1024) -> str: """ 对图片进行缩放、格式转换,并返回 Base64 字符串。 之所以先压缩图片,是因为大模型视觉接口对图片尺寸和大小有限制, 过大的原图会导致请求失败或增加不必要的 token 消耗。 """ with Image.open(image_path) as img: img.thumbnail((max_size, max_size)) img = img.convert("RGB") tmp_path = "tmp_coin.jpg" img.save(tmp_path, "JPEG", quality=85) with open(tmp_path, "rb") as f: return base64.b64encode(f.read()).decode() def analyze_coin(self, image_path: str, prompt: str) -> str: """ 将图片和提示词一起发送给 GLM 视觉模型。 注意:model 参数中的模型名以开放平台控制台实际可用的名称为准, 不同版本或不同账号可能看到不同的模型列表。 """ image_base64 = self.preprocess_image(image_path) response = self.client.chat.completions.create( model="glm-4v-plus", messages=[ { "role": "user", "content": [ {"type": "text", "text": prompt}, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{image_base64}" }, }, ], } ], temperature=0.2, ) return response.choices[0].message.content

这个类做的事情很清晰:

  • preprocess_image把图片统一压到最长边不超过 1024 像素,并转成 JPEG 格式,最后编码成 Base64 字符串。
  • analyze_coin把提示词和图片发送给视觉模型,temperature设置为 0.2,让输出更稳定保守,减少随机发挥。
  • 返回模型生成的文本内容。

有一点要强调:视觉模型接口的具体请求格式会随着官方 SDK 升级而变化,这里的代码作为一个参考写法。如果你运行时发现模型名或消息格式报错,优先去开放平台文档或 SDK 源码里核对。

4.2 封装图片分析工具

为了让 Claude Agent 能够调用图片识别功能,我们需要把GlmVision封装成一个工具函数。

创建agent/tools.py

# 文件路径:agent/tools.py from .glm_vision import GlmVision # 在模块级别初始化视觉识别器,避免每次调用都重新建立连接 vision = GlmVision() # 针对钱币鉴定场景的专用提示词 COIN_ANALYSIS_PROMPT = """ 你是钱币鉴定助手。请仔细观察图片中的钱币,从以下维度输出信息: 1. 钱币面额与币种:例如“光绪元宝库平七钱二分”或“中华民国三年壹圆”。 2. 钱币文字与图案内容:正反面文字、龙纹、嘉禾纹、人像等。 3. 材质与包浆特征:颜色、包浆分布、是否有人工作旧痕迹。 4. 铸造工艺特征:边齿形态、文字压力感、图案立体感。 5. 瑕疵或异常点:划痕、磕碰、修补痕迹、铸缺、沙眼等。 请严格基于图片中能看到的信息回答,不要编造细节。 如果你对某个特征不确定,请直接写“无法确定”。 """ def analyze_coin_image(image_path: str, question: str = "") -> str: """ 供 Claude Agent 调用的工具函数。 参数: image_path: 钱币图片的本地路径。 question: 用户希望重点观察的鉴定问题。 返回: 智谱 GLM 视觉模型对图片的文本描述。 """ prompt = COIN_ANALYSIS_PROMPT if question: prompt += f"\n用户重点关注的问题:{question}" return vision.analyze_coin(image_path, prompt)

把提示词单独拿出来,是因为钱币鉴定的观察维度其实很固定。你可以在不改变工具函数结构的情况下,随时调整提示词,比如增加“请说明边齿类型”之类的专业要求。

4.3 实现 Claude Agent 规划器

接下来是 Agent 的核心,也就是工具调用循环。

创建agent/claude_planner.py

# 文件路径:agent/claude_planner.py import json import os from anthropic import Anthropic from .tools import analyze_coin_image class ClaudePlanner: """ 基于 Claude 的 Agent 规划器。 职责:理解用户问题 -> 决定是否调用图片分析工具 -> 把工具结果交给 Claude 汇总 -> 输出最终报告。 """ def __init__(self, api_key: str | None = None): self.client = Anthropic( api_key=api_key or os.getenv("ANTHROPIC_API_KEY") ) self.tools = [ { "name": "analyze_coin_image", "description": "使用智谱GLM视觉大模型分析一张钱币图片,返回钱币的文字图案、工艺特征、包浆特征和瑕疵描述。", "input_schema": { "type": "object", "properties": { "image_path": { "type": "string", "description": "钱币图片的本地路径", }, "question": { "type": "string", "description": "用户希望重点鉴定的问题", }, }, "required": ["image_path"], }, } ] def run(self, user_input: str, image_path: str, max_iters: int = 3) -> str: """ 执行 Agent 工具调用循环。 max_iters 用于限制最多调用几轮工具,防止模型陷入重复调用。 """ messages = [ { "role": "user", "content": f"用户问题:{user_input}\n钱币图片路径:{image_path}", } ] for _ in range(max_iters): response = self.client.messages.create( model="claude-3-5-sonnet-latest", max_tokens=2048, system=( "你是一名古钱币鉴定专家。你需要通过图片分析工具采集钱币特征," "再结合钱币学常识给出结构化鉴定报告。" "不要在没有工具结果时直接下最终结论。" ), tools=self.tools, messages=messages, ) tool_calls = [ block for block in response.content if block.type == "tool_use" ] # 如果没有工具调用请求,说明模型已经可以直接回答 if not tool_calls: texts = [ block.text for block in response.content if block.type == "text" ] return "\n".join(texts) # 把 assistant 返回内容追加到消息历史中 messages.append({"role": "assistant", "content": response.content}) # 依次执行模型请求的工具 for call in tool_calls: if call.name != "analyze_coin_image": continue args = ( call.input if isinstance(call.input, dict) else json.loads(call.input) ) result = analyze_coin_image( args["image_path"], args.get("question", ""), ) # 把工具执行结果返回给模型 messages.append( { "role": "user", "content": [ { "type": "tool_result", "tool_use_id": call.id, "content": result, } ], } ) return "已达到最大工具调用次数,无法生成最终结论。"

这段代码需要解释几个关键点:

  • system提示词里明确要求“不要在没有工具结果时直接下最终结论”,这能有效降低模型幻觉概率。
  • run方法使用for循环实现有限次工具调用,循环内部先判断模型有没有返回tool_use,没有就直接返回文本。
  • 每次工具调用的结果都会通过tool_result消息回传给 Claude,让模型能够“看到”图片识别结果。
  • 如果模型连续多次都要调用工具,max_iters会强制停止,避免 Agent 死循环和 API 费用失控。

4.4 编写主程序入口

最后创建main.py,把整个流程串起来。

# 文件路径:main.py import argparse from agent.claude_planner import ClaudePlanner def main(): parser = argparse.ArgumentParser(description="AI 钱币鉴定 Agent") parser.add_argument("--image", required=True, help="钱币图片的本地路径") parser.add_argument( "--question", default="请帮我看看这枚钱币的基本信息和存疑点。", help="用户希望重点鉴定的问题", ) args = parser.parse_args() planner = ClaudePlanner() report = planner.run(args.question, args.image) print("=== AI 钱币鉴定报告 ===") print(report) if __name__ == "__main__": main()

把图片路径和问题都做成命令行参数,方便测试。如果你后续要接 Web 后端,只需要把这段逻辑封装成一个服务函数,不再走命令行即可。

4.5 运行与验证

先确认.env文件里的两个 API Key 都已经配置好,然后在项目根目录执行:

python main.py \ --image images/sample_coin.jpg \ --question "这枚光绪元宝的大致版本特征是什么?有无明显的存疑点?"

注意,\换行写法适合 macOS 和 Linux;Windows 命令行建议直接写在一行:

python main.py --image images\sample_coin.jpg --question "这枚光绪元宝的大致版本特征是什么?有无明显的存疑点?"

如果一切正常,程序会先调用 Claude Agent 生成工具调用请求,然后调用智谱 GLM 分析钱币图片,最后 Claude 汇总生成一份类似下面的报告:

=== AI 钱币鉴定报告 === 基于钱币图片的工具分析结果,整理如下: 一、基本信息 - 币种:机制铜元/银元,图中可见“光绪元宝”字样,具体面额需结合尺寸判断。 - 版式:正面中央为“光绪元宝”,上方或左右有铸造省份字样。 二、特征观察 - 文字压力感:字口较为清晰,部分笔画边缘存在自然流通磨损。 - 包浆状态:表面包浆分布不均匀,局部颜色偏深,未发现明显浮于表面的涂料感。 - 边齿情况:图中可见边缘齿形,但由于拍摄角度限制,无法精确判断齿型类别。 三、存疑点 - 图片分辨率不足以判断币面是否存在砂眼或修补痕迹。 - 无法通过单张图片准确判断材质比重与金属成分。 四、参考结论 该币在现有图片条件下呈现一定自然磨损特征,但建议结合边齿微距图、重量和尺寸数据做进一步判断。

这只是一个预期输出示例,实际运行时的具体内容以模型识别结果为准。不要把示例输出当成真实鉴定结论。

5. 常见问题与排查思路

在实际运行过程中,大概率会遇到下面这些问题。

问题现象常见原因解决思路
返回 401 认证失败API Key 未配置或配置错误检查.env中是否写入了正确的 Key,确认环境变量已加载
提示“model not found”或模型不存在视觉模型名写错或账号没有该模型权限登录智谱开放平台控制台,查看当前账号可用的视觉模型名称
图片读取失败图片路径错误、文件损坏或格式不支持确认路径,使用 Pillow 能打开的常见格式,例如 jpg、png
图片体积过大导致接口报错原始图片尺寸过大调整preprocess_image中的max_size参数,进一步压缩图片
Agent 循环次数过多模型反复调用工具,说明 prompt 或工具定义不够明确检查画像识别 prompt,必要时提高max_iters限制,但注意控制费用
返回结果出现明显幻觉图片质量差,或 system 提示词约束不够强降低temperature,在提示词中强调“无法确定就写无法确定”
请求超时图片识别过程较慢,或者网络不稳定增加请求超时时间,重试一次;同时确认 API 账号没有欠费或限流

如果你遇到“Claude 返回空文本”,一个常见原因是模型在一次回复中只生成了工具调用,没有生成文本内容。这在工具调用循环里是正常现象,因为后续拿到工具结果后模型才会继续输出。如果所有迭代都用完了仍然没有文本,可以适当调高max_tokens,并检查工具返回结果是否太长,导致后续上下文空间不足。

6. 工程化与安全建议

6.1 图片预处理要放在工具内部

很多初学者会把图片压缩逻辑写在主流程里,这会导致 Agent 每次循环都重复处理图片。更合理的做法是像本文一样,把图片预处理放到GlmVision类内部,对上层 Agent 完全透明。这样未来如果图片来自 URL、PDF 或本地文件,只需要改一个模块。

6.2 提示词是“防幻觉”的第一道防线

钱币鉴定这类领域,模型很容易一本正经地胡说八道。建议在 prompt 中做三层约束:

  • 系统层:明确告诉模型“先调用工具,再下结论”。
  • 工具层:要求视觉模型“只描述图中可见信息”。
  • 输出层:要求最终报告区分“确定项”“存疑项”“无法判断项”。

这样即使模型判断错了,用户至少能看出哪些结论是推测,不会把推测当确定结果。

6.3 不要把 AI 鉴定结果当作最终交易依据

需要特别提醒:大模型鉴定本质上是辅助工具,不能替代专业评级机构的结果。尤其是涉及真伪判断时,应该把 AI 输出定位为“参考意见”,并给用户明确提示。如果你的应用涉及交易金额,最好在界面上加一句免责声明,说明 AI 结论不构成交易或投资建议。

6.4 安全与合规边界

钱币图片本身不算敏感数据,但如果你的应用面向普通用户,要注意以下几点:

  • 用户上传的图片可能包含个人信息,比如拍摄背景里的桌面文件、地址单据,建议服务端对图片做自动脱敏和定期清理。
  • API Key 不要放在前端,也不要提交到公开仓库。
  • 给 API Key 配置最小权限,只允许调用需要的接口,避免一个 Key 拥有全部模型权限。
  • 调用外部大模型 API 前,明确用户是否授权,尤其是商业场景下需要遵循平台服务条款。

6.5 成本控制与性能优化

多模态识别和大模型 Agent 的 token 消耗都不低。生产环境可以考虑这些优化:

  • 对同一张图片的识别结果做缓存,例如计算图片的 MD5,如果已经识别过就直接复用结果。
  • 压缩图片后再传输,既能降低请求耗时,也能减少 token。
  • 控制 Agent 工具调用次数,比如只允许最多两轮工具调用。
  • 给不同环节使用不同模型规格,区分高精度和低成本场景。

6.6 日志与可观测性

Agent 应用比普通 API 调用更难排查问题,因为每一步都会消耗 token。建议每次工具调用都记录日志,至少包含:

  • 用户原始问题。
  • 模型返回了几次工具调用。
  • 每条工具调用的参数和耗时。
  • 工具返回的内容摘要。
  • 最终报告文本。
  • 总 token 消耗和费用估算。

有了这些日志,你才能在模型回答异常时回溯是哪一步出了问题。

7. 总结与下一步扩展

本文从零实现了一个 AI 钱币鉴定 Agent,整体来看你只需要掌握四个关键点:

  1. 多模态模型负责“看图”:通过智谱 GLM 视觉模型提取钱币文字、图案、工艺、包浆等特征。
  2. Agent 负责“规划”:Claude Agent 根据用户问题决定是否调用图片分析工具。
  3. 工具调用循环是 Agent 的核心机制:模型返回工具调用请求,代码执行工具并返回结果,模型再生成最终报告。
  4. 工程化重点是“解耦”:图片预处理、工具函数、Agent 规划器各自独立,便于后续替换模型或扩展功能。

你可以基于这套骨架继续扩展的方向有很多。比如把最终报告接入 Web 页面,做成一个上传图片即可鉴定的在线小工具;也可以增加一个钱币版别知识库,让 Agent 在拿到视觉识别结果后,再去检索数据库中相似的版别信息,做更精确的对比判断;还可以增加多图输入能力,引导用户拍摄边齿、正面、反面多张图片,提升判断准确率。

如果你在实际开发中遇到报错,建议优先检查 API Key 是否生效、模型名是否与账号权限匹配、图片格式是否被支持这三个因素,大部分问题都出在这三处。希望这篇教程对你有所帮助,可以先收藏备用,也可以根据自己的场景替换模型和提示词,做出更符合实际需求的 AI 鉴定工具。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询