基于大模型 API 的早餐自动算价器实现
本文介绍了一种利用多模态大模型与文本大模型结合实现的早餐价格自动计算方案。通过 OCR 技术提取菜单图片中的商品及价格信息,结合自然语言处理解析用户点餐意图,最后通过代码逻辑计算总金额。方案包含单轮查询与多轮对话支持,旨在解决日常消费中的计价误差问题,展示了大模型在垂直场景落地的低成本、高效率特性。

本文介绍了一种利用多模态大模型与文本大模型结合实现的早餐价格自动计算方案。通过 OCR 技术提取菜单图片中的商品及价格信息,结合自然语言处理解析用户点餐意图,最后通过代码逻辑计算总金额。方案包含单轮查询与多轮对话支持,旨在解决日常消费中的计价误差问题,展示了大模型在垂直场景落地的低成本、高效率特性。

在日常消费场景中,尤其是早餐店等高频小额交易场景,人工计算价格容易出现误差。为了验证大模型在垂直场景下的落地能力,本文设计并实现了一个早餐价格自动计算应用。该应用能够识别菜单图片中的商品信息,解析用户的自然语言点餐指令,并准确计算总金额。
本方案采用多模态大模型与文本大模型协同工作的架构:
首先需要对早餐店的菜单图片进行处理。由于菜单排版各异,提示词工程需强调结构化输出,避免模型幻觉。
ocr_prompt = """
## Role
你是一名 OCR 专家。
## Goals
请根据提供的菜单图片内容,识别出图片的菜品名称以及价格,并用 json 结构输出。
## Constrains
- 输出结果必须为 json 格式;
- json 内容的 key 为菜品名称,value 为价格;
- value 结果中不需要带单位,只放数值,类型为 float;
- 识别内容必须严格按照遵循图片内容,不要联想,不要自己发挥;
- 言简意赅,直接输出 json 结果。
## Example
json 结果示例如下:
{"key1": value1, "key2": value2}
## Initialization
请根据提供图片开始内容解析。
"""
调用时务必设置 response_format 参数为 json_object,确保返回结果可直接被程序解析,减少后续正则清洗的成本。
from zhipuai import ZhipuAI
import json
api_key = "YOUR_API_KEY"
client = ZhipuAI(api_key=api_key)
image_url = "https://example.com/menu.jpg" # 替换为实际图片 URL
query_ocr = ocr_prompt
response = client.chat.completions.create(
model="glm-4v-flash",
messages=[
{
"role": "user",
"content": [
{"type": "image_url", "image_url": {"url": image_url}},
{"type": "text", "text": query_ocr}
]
}
],
response_format={"type": "json_object"}
)
menu_data = json.loads(response.choices[0].message.content)
print(menu_data)
用户输入通常包含口语化表达、简称或省略语(如'来两个肉包')。此步骤需要将非结构化文本转化为结构化数据。
extract_prompt = """
## Role
你是一名信息抽取专家。
## Goals
请根据提供的菜单内容,对用户的问题进行信息提取,主要提取出菜名以及对应的数量。
## Constrains
- 输出结果必须为 json 格式;
- json 内容的 key 为菜品名称,value 为数量;
- value 结果中不需要带单位,只放数值,类型为 int;
- 如果用户问题中的菜名偏口语化,请根据提供的菜单名称进行菜名的对齐,要求菜名必须在菜单中;
- 如果发现有菜名实在不在菜单中,忽略改菜名,不进行抽取;
- 言简意赅,直接输出 json 结果。
## Initialization
请根据提供菜单内容和用户问题进行内容解析。
菜单:{menu_json}
用户问题:{user_query}
"""
同样使用 response_format 保证输出稳定性。注意在构造 Prompt 时,将上一步获取的菜单数据填入 {menu_json} 占位符。
query = "3 个鲜肉,两个梅干菜,1 杯豆浆"
query_extract = extract_prompt.format(menu_json=json.dumps(menu_data), user_query=query)
response = client.chat.completions.create(
model="glm-4-air-0111",
messages=[
{
"role": "user",
"content": query_extract
}
],
response_format={"type": "json_object"}
)
order_items = json.loads(response.choices[0].message.content)
print(order_items)
获取到菜单单价和订单明细后,即可进行计算。原方案中使用 eval 存在安全隐患,建议直接使用 json.loads 解析字符串,并通过字典查找匹配单价。
total_money = 0
calculation_log = []
for item_name, quantity in order_items.items():
if item_name in menu_data:
price = menu_data[item_name]
subtotal = price * quantity
total_money += subtotal
calculation_log.append(f"{item_name}: {price}*{quantity}={subtotal}")
else:
print(f"警告:菜单中未找到商品 '{item_name}'")
calculation_log.append(f"总价:{total_money}")
print("\n".join(calculation_log))
在实际场景中,用户可能会修改订单(如'把梅干菜换成海带')。这需要维护对话历史,利用大模型的上下文理解能力进行增量更新。
conversation_history = [
{"role": "user", "content": query_extract},
{"role": "assistant", "content": json.dumps(order_items)},
{"role": "user", "content": f"根据当前用户问题,对上面输出的 json 结果进行修改,并输出 json 结果。用户问题:{new_query}"}
]
response = client.chat.completions.create(
model="glm-4-air-0111",
messages=conversation_history,
response_format={"type": "json_object"}
)
updated_order = json.loads(response.choices[0].message.content)
eval() 函数处理外部输入,推荐使用 json.loads() 配合严格的类型校验。本方案展示了如何利用大模型 API 快速构建一个解决实际问题的工具。通过 OCR 与 NLP 的结合,实现了从非结构化图像和文本到结构化数据的转换。虽然目前实现较为简单,但核心思路可复用于更多零售计价场景。大模型技术的普及降低了开发门槛,使得个人开发者也能低成本地利用 AI 能力解决生活中的痛点。
未来可进一步集成 TTS(语音合成)功能,实现语音点餐与播报,提升无障碍体验。同时,结合知识库检索(RAG)技术,可支持更复杂的促销规则计算。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online