大家好,我是刘聪NLP。
不知道大家买早餐的时候有没有感叹过, 早餐店的老板们都是速算高手 ,不管你买了多少包子,他都一顿心算加法,跟你说最后多少钱。
然后你会毫不犹豫的转账,是的,没错,我一直相信老板数学能力。
直到前两天早上买早餐(也确实买的有点多,帮几个同事带的), 事后才发现老板多收了我1块钱 ,气死了,气死了。当然不是钱多钱少的事情,只是感觉亏了。
于是我突发奇想, 直接开发一个早餐算价器得了 ,现在大模型能力都很强,直接api一组装,一个应用就可以出来了。
早餐算价器设计思路:
- 输入一张早餐店的价格单(拍照图片)、一句你点了什么的内容,输出需要花费多少钱;
- 先用多模态大模型进行价格单的内容识别,提取出每个商品的名称和价格;
- 再通过文本大模型识别说话意图,抽取出话语中所有的商品以及对应的数量;
- 最后为了保证计算准确无误,利用设计一个计算函数,用于计算出最后的总价格。
为了方便,我这里直接调用智谱BigModele开发平台上的模型API来进行应用搭建了, 懒得自己再搭模型了 ,核心是Flash系列模型免费,我要把我丢失的的1块钱白嫖回来,哈哈哈哈。
这里先说一下,大模型发展到现在,能力也是越来越强,大多数场景,真的是写写提示词就ok了,摇身变成prompt工程师~
所以大家做项目在demo阶段,能不微调的时候先别微调,毕竟数据构造、数据清洗还有 一大堆烦心事~
下面我开始搭建早餐算价器,这里多模态大模型使用GLM-4V-Flash模型来做静态识别(同样是免费的),文本大模型使用GLM-4-Air模型。
- 价格单的内容识别&抽取
在价格单抽取时有几点需要注意,一个是结构一定要简单一点,方便后续调用,二是要求多模态大模型识别的时候别随意发挥。
下面是价格单内容识别&抽取的提示词:
## Role
你是一名OCR专家。
## Goals
请根据提供的菜单图片内容,识别出图片的菜品名称以及价格,并用json结构输出。
## Constrains
- 输出结果必须为json格式;
- json内容的key为菜品名称,value为价格;
- value结果中不需要带单位,只放数值,类型为float;
- 识别内容必须严格按照遵循图片内容,不要联想,不要自己发挥;
- 言简意赅,直接输出json结果。
## Example
json结果示例如下:
{"key1": value1, "key2": value2, "key3": value3}
## Initialization
请根据提供图片开始内容解析。
然后直接利用API进行接口调用,这里需要注意一点,调用时,response_format要设置成json,这样可以保证输出结果一定为json格式,方便后续使用。要不然josn适配还有一大堆坑,懂得都懂!!
代码如下:
from zhipuai import ZhipuAI
api_key = ""
client = ZhipuAI(api_key=api_key)
query_ocr = "" # 用上面的提示词
image_url = "https://files.mdnice.com/user/22202/f308b947-40f6-4c2a-bfad-75d5373809ae.jpg"
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"}
)
print(response.choices[0].message.content)
为了方便测试,我先从网上找了张早餐店的菜单图片(因为此时我还在火车上),
网图
最终抽取结果还是十分准确的,没有内容的缺失,结构、结果都是按照提示词要求生成的。
- Query解析
在进行Query解析的时候,也有几个注意事项,一是用户在说话时,往往都是简称、省略、口语化等词汇,所以要跟菜单内容做对齐;二是要识别对每个内容的数量,不要对应错误。
下面是Query解析的提示词:
## Role
你是一名信息抽取专家。
## Goals
请根据提供的菜单内容,对用户的问题进行信息提取,主要提取出菜名以及对应的数量。
## Constrains
- 输出结果必须为json格式;
- json内容的key为菜品名称,value为数量;
- value结果中不需要带单位,只放数值,类型为int;
- 如果用户问题中的菜名偏口语化,请根据提供的菜单名称进行菜名的对齐,要求菜名必须在菜单中;
- 如果发现有菜名实在不在菜单中,忽略改菜名,不进行抽取;
- 言简意赅,直接输出json结果。
## Example
json结果示例如下:
{"key1": value1, "key2": value2, "key3": value3}
## Initialization
请根据提供菜单内容和用户问题进行内容解析。
菜单:{菜单}
用户问题:{用户问题}
同样API接口调用,这里吧model改成智谱最新新鲜升级的的glm-4-air-0111。
table = "" # 用上面识别的结果
query = "3个鲜肉,两个梅干菜,1个香辣豆腐豆腐,1杯豆浆,2个奶黄包"
query_extract = "" # 用上面的提示词
response = client.chat.completions.create(
model="glm-4-air-0111",
messages=[
{
"role": "user",
"content": query_extract + "菜单:{}\n用户问题:{}".format(table, query)
}
],
response_format={"type": "json\_object"}
)
print(response.choices[0].message.content)
解析结果也不错,各种包子也都识别的没啥问题。
- 价格计算
因为上面两个步骤输出的结果都是json格式的str,粗暴的eval一下就可以,然后遍历解析结果,最终计算出需要花费的总价格。
choices = eval(choices)
table = eval(table)
total_money = 0
content = ""
for key, value in choices.items():
content += "{}: {}*{}={}\n".format(key, table[key], value, table[key] * value)
total_money += table[key] * value
content += "总价: {}".format(total_money)
print(content)
计算结果如下:
- 多轮对话识别
当然,早高峰如果去的完,一般还会出现某一种或几种包子买完的情况,那么就需要 借助模型多轮对话的能力 ,在上一轮对话的结果上进行改写,重新抽取点了哪些菜品。
query2 = "梅干菜换成海带"
response = client.chat.completions.create(
model="glm-4-air-0111",
messages=[
{
"role": "user",
"content": query_extract + "菜单:{}\n用户问题:{}".format(table, query)
},
{
"role": "assistant",
"content": choices
},
{
"role": "user",
"content": "根据当前用户问题,对上面输出的json结果进行修改,并输出json结果。用户问题:" + query2
}
],
response_format={"type": "json\_object"}
)
我们可以发现,整体改正的效果还不错,将梅干菜包的个数改为了0,增加了香辣海带包。
PS:有奖竞猜,猜猜哪个口味是我的最爱!!!
最后上面的代码整体封装一下,或者借助workflow工具,就可以快速将这个应用搭出来。这里就不过多描述了,甚至后面还可以封装app啥的,还可以接个tts不看只听。
这个 早餐防骗算价器 不能说该想法有多好,上面的实现也有点简单,在真实使用时,可能会出现各种各样的bad case。但只想告诉大家,学以致用,可以多多利用大模型能力,来解决身边有趣的事务,并且代价也不大,不失为一种乐趣。
往往需求就在我们身边,或大或小,或难或易,冲就完事儿了~
此外,这里用智谱BigModel开发平台,主要就是 便宜还有不要钱,基本上是免费的免费,降价的降价 。上面用的GLM4v-Flash是免费的,GLM-4-Air-0111也是最近刚刚新升级的,性价比极强(春节期间还有活动,哈哈)。
最近,国内价格战打的真的有猛烈的,感觉智谱这波平台上新,也是受到了其他大模型厂商的压力。
不过,有一说一, 2025年才开始,大模型开源社区就又开源了好几个模型,闭源社区也是又开始了新一轮的价格战 ,感觉大家都在春节前发力,估计是想回家过个肥年吧,哈哈哈哈。
不过,他们卷他们的,这还是利好我们这些个人开发者的。我现在很多个人的一些应用,都已经换成了智谱免费的Flash系列模型,节省了很多本地部署的麻烦,要不然还得找GPU服务资源,麻烦又费事!!
最后,八卦一手,前两天网传的小红书里面的翻译api到底用的是不是智谱呀,大写好奇,哈哈哈哈!
PS:我已经开始放假了,提前进入假期,提前祝各位粉丝朋友们,蛇年快乐吧!还有,我2月10号才开工,说出来只是想让你们羡慕一下,哈哈哈哈!!!