用Gemini搞定双面名片合并:别再写死规则了
把一张名片的正反两面当成两个人存进数据库,这种低级错误在做 OCR 识别时简直太常见了。尤其是很多名片一面中文一面英文,如果死磕代码逻辑去判断“这两张图是不是同一个人”,大概率会写出一段让自己想辞职的垃圾代码。
至于提示词怎么写,重点在于告诉它:“你现在面对的是同一张名片的正反两面,请提取所有信息并合并成一个完整的 JSON 对象”。
下一篇
搞定上下文管理,能直接解决大模型“断片”和胡说八道的问题。 →
最聪明的做法其实是:把两张图直接怼给 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 最后合并,一次调用直接出结果,响应速度更快。
至于提示词怎么写,重点在于告诉它:“你现在面对的是同一张名片的正反两面,请提取所有信息并合并成一个完整的 JSON 对象”。
你是一个专业且精准的名片识别专家。
我将为你提供同一张名片正反两面的照片。
请你综合分析这两张图片中的所有信息,提取姓名、职位、公司、电话、邮箱等字段。
如果两张图片中出现同一信息的不同语言版本(如中文名和英文名),请将它们合并在同一个字段中,格式为“中文名 (English Name)”。
请严格按照 JSON 格式输出,不要包含任何解释性文字。这种工作流比写几百行正则表达式要优雅得多,也稳定得多。
