用Gemini搞定双面名片合并:别再写死规则了

KaiDev 专家 10小时前 548 浏览 15 点赞 约 2 分钟

把一张名片的正反两面当成两个人存进数据库,这种低级错误在做 OCR 识别时简直太常见了。尤其是很多名片一面中文一面英文,如果死磕代码逻辑去判断“这两张图是不是同一个人”,大概率会写出一段让自己想辞职的垃圾代码。

最聪明的做法其实是:把两张图直接怼给 Gemini,让它自己去合并。

这里的核心技巧不是在 Python 里写 if-else 合并字符串,而是利用大模型的多模态能力,在一次 Request 里发送两张图片,直接输出最终的 JSON。

实操逻辑:
1. 识别第一张图后,先别急着存库,问用户:“还有背面吗?”
2. 如果用户说有,就进入等待状态(记得设个 5 分钟超时,不然用户跑了,你的状态机就卡死了)。
3. 拿到第二张图后,把两张图一起打包发给 Gemini。

关键代码实现:

def generate_json_from_two_images(
 front_img: PIL.Image.Image,
 back_img: PIL.Image.Image,
 prompt: str) -> object:
 model = GenerativeModel(
 "gemini-1.5-flash", 
 generation_config={
 "response_mime_type": "application/json",
 "response_schema": NAMECARD_SCHEMA
 },
 )
 front_part = Part.from_data(
 data=pil_to_bytes(front_img), mime_type="image/jpeg")
 back_part = Part.from_data(
 data=pil_to_bytes(back_img), mime_type="image/jpeg")
 # 直接把 prompt 和两张图一起扔进去,让模型在语义层面完成合并
 response = model.generate_content(
 [prompt, front_part, back_part],
 stream=False,
 labels={"client_id": "namecard"}
 )
 return response

为什么这样有效?

  • 语义合并 vs 字符串拼接: 用代码把 "张三" 和 "Zhang San" 合并成 "张三 (Zhang San)" 极其麻烦,但对 Gemini 来说就是秒懂。
  • 减少冗余请求: 不需要先识别 A 再识别 B 最后合并,一次调用直接出结果,响应速度更快。
用Gemini搞定双面名片合并:别再写死规则了

至于提示词怎么写,重点在于告诉它:“你现在面对的是同一张名片的正反两面,请提取所有信息并合并成一个完整的 JSON 对象”。

你是一个专业且精准的名片识别专家。
我将为你提供同一张名片正反两面的照片。
请你综合分析这两张图片中的所有信息,提取姓名、职位、公司、电话、邮箱等字段。
如果两张图片中出现同一信息的不同语言版本(如中文名和英文名),请将它们合并在同一个字段中,格式为“中文名 (English Name)”。
请严格按照 JSON 格式输出,不要包含任何解释性文字。

这种工作流比写几百行正则表达式要优雅得多,也稳定得多。

Gemini提示词AIPromptcloud

全部回复 (3)

副业中创业者 初级 10小时前
记得在Prompt里强调下只要JSON,不然它爱废话。
0 回复
阿福在路上 高级 10小时前
之前死磕正则写了三天,最后换成LLM半小时搞定,真的省心。
0 回复
远程办公技术宅 中级 10小时前
建议把两张图拼成一张再发,识别速度快不少。
0 回复

发表回复

支持 Markdown 格式