本文介绍了如何使用大模型网关平台预置的文字识别智能体。
文字识别智能体是大模型网关平台预置的一个智能体。该智能体能够从输入图片中提取文本信息,可根据您的提示词进行全局(图片整体)/局部文本提取。结合了最新的多模态大模型和传统深度学习 OCR 算法技术,该智能体泛用性较强,支持绝大部分场景的文本识别。
对于结构化卡证(如银行卡、身份证、驾驶证、行驶证、火车票、增值税发票、印章)整体信息提取的场景,智能体返回固定输出字段。此外,您也可以使用提示词来自定义输出字段。
要使用文字识别智能体,您需要:
使用文字识别智能体前,您可以先通过预览功能体验其能力。预览只需要一个网关访问密钥即可。
注意
预览时产生的模型调用会消耗该密钥的免费资源配额。请确保网关访问密钥有可用的 Tokens 配额。
登录大模型网关控制台。
注意
文字识别智能体 API 仍在测试,暂不建议您在实际业务环境使用。
说明
文字识别智能体 API 遵循 OpenAI 的 API 格式,可按照 OpenAI 标准请求格式调用。
请求方法:POST
Endpoint:https://ai-gateway.vei.volces.com/v1/chat/completions
Curl 请求示例
说明
示例中的YOUR_API_KEY
表示网关访问密钥;b64
表示输入图片的 base64 编码。生成方式可参考下文 Python 示例。
curl "https://ai-gateway.vei.volces.com/v1/chat/completions" \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $YOUR_API_KEY" \ -d '{ "model": "AG-ocr-agent", "messages": [ { "role": "user", "content": [ { "type": "text", "text": "请帮我提取这张身份证的姓名。" }, { "type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"} } ] } ], "stream": false, "max_tokens": 1024, "temperature": 0.1 }'
文字识别智能体遵循 OpenAI 标准格式。当前不支持 stream 输出。要使用智能体,您必须先安装 OpenAI SDK。
pip install openai
from openai import OpenAI api_key = "xxx.xxx" server_url = "xxxxxx" client = OpenAI(api_key=api_key, base_url=server_url) text = {"type": "text", "text": "请帮我提取这张身份证的姓名。"} #身份证图片的base64编码 b64 = "xxxxx" image = {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"}} messages = [{"role": "user", "content": [text, image]}] completion = client.chat.completions.create( messages=messages, model="AG-ocr-agent", stream=False, temperature=0.7, max_tokens=1024 ) print(completion.model_dump_json())
Model
: string(必选)
模型名称。对于文字识别智能体,该参数取值为 AG-ocr-agent
。
Messages
: array(必选)
输入信息列表。文字识别智能体不支持多轮对话,因此该参数只包含一条用户的输入信息。
输入信息格式如下。其中,role=user
为固定字段,表示当前是用户输入;content
表示输入内容。
[ { "role": "user", "content": [text, image] } ]
content
包含以下 2 个对象:
文本提示词。格式如下:
{"type": "text", "text": "请帮我提取这张身份证的姓名。"}
待处理图片的 base64 编码。格式如下:
{"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{b64}"}}
格式说明:
data:image/jpeg;base64
的前缀。其中 jpeg
表示输入图片格式是 JPEG;如果格式是 PNG,则要修改成 png
。def img_to_base64(img_path): with open(img_path, "rb") as f: base64_str = base64.b64encode(f.read()).decode("utf-8") return base64_str
stream
: boolean(可选)
是否流式输出回复。默认值为 False
。目前仅支持 stream=False
的场景。
temperature
: float(可选)
采样温度,用于控制模型生成文本的多样性。取值范围: [0, 2)。默认值:0.7。
数值越高,生成的文本更多样;反之,生成的文本更确定。如果希望每次生成的结果相对稳定,可设置较小的值,如 0.1。
max_tokens
: int(可选)
允许模型消费的最大 Token 数,用于需要限制字数(如生成摘要、关键词)、控制成本或减少响应时间的场景。默认值是 2048。
{ "id": "chat-272e76ae32cd4e5394c6f238f7d08dfb", "choices": [{ "finish_reason": "stop", "index": 0, "logprobs": null, "message": { "content": "\n{\n 'name': '边缘智能' \n}\n", "role": "assistant", "refusal": null, "audio": null, "function_call": null, "tool_calls": [], "stop_reason": null } }], "created": 1721044114, "model": "AG-ocr-agent", "object": "chat.completion", "service_tier": null, "system_fingerprint": null, "usage": { "completion_tokens": 36, "prompt_tokens": 22, "total_tokens": 58, "completion_tokens_details": null, "prompt_tokens_details": null }, "prompt_logprobs": null }
在结果中,可重点关注以下字段:
Id
: stringchoices
: arraychoice
对象。
message
: objectcontent
: stringrole
: stringassistant
。Usage
: objectcompletion_tokens
: intprompt_tokens
: inttotal_tokens
: intprompt_tokens
与 completion_tokens
的总和。文本识别智能体提供两种任务处理模式:
说明
支持的结构化卡证包括:银行卡、身份证、驾驶证、行驶证、火车票、增值税发票、印章。
您可以在 Query 文本中增加特定前缀来指定任务处理模式。支持的前缀如下表所示。
Query 文本前缀 | 说明 | 使用示例 |
---|---|---|
| 指定使用全局提取模式。 | 原始 Query: 说明
|
| 指定使用局部提取模式。
| 原始 Query: |
输出结果的字段分为两种类型:
content
包含针对每种卡证的固定输出字段。具体示例请参见:
示例:
假设身份证图片中的姓名信息为{"姓名": "张三"}
。通过在 Query 文本中指定请在输出中将字段"姓名"替换成"name"
,那么得到的实际输出会是{"name": "张三"}
。
说明
在 Query 文本中增加输出字段映射关系的提示时,建议加上 <local>
前缀,以此来降低任务处理时延。因为字段映射是由多模态大模式处理的。
以下包含 2 个使用自定义输出字段的示例:
示例一
输入图片如下。
使用不同输入文本(Query)获得的输出结果如下。
输入文本 | 输出结果 |
---|---|
请帮我提取这张图片中的文本信息,请用JSON的格式进行输出。 |
|
请帮我提取这张图片中的文本信息,请用JSON的格式进行输出,并按以下规则进行字段映射,第一行的字段为url,第二行的字段为name, 第三行的字段为service, 第四行的字段为phone, 第四行括号中的内容字段为worktime。 |
|
示例二
输入图片如下。
使用不同输入文本(Query)获得的输出结果如下。
输入文本 | 输出结果 |
---|---|
请帮我提取这张身份证上的全部信息,并以JSON的格式进行输出。 |
|
请帮我提取这张身份证上的全部信息,并以JSON的格式进行输出,请遵循如下格式进行字段映射,将姓名替换成name, 将性别替换成gender, 将民族替换成ethnicity,将出生替换成birth_of_date,将住址替换成address,将公民身份号码替换成id_code。 |
|
以下是一段完整的 Python 代码示例。
from openai import OpenAI import base64 from io import BytesIO from PIL import Image, ImageOps def img_to_base64(img_path): with open(img_path, "rb") as f: base64_str = base64.b64encode(f.read()).decode("utf-8") return base64_str api_key = "xxx.xxx" server_url = "https://ai-gateway.vei.volces.com/v1" client = OpenAI(api_key=api_key, base_url=server_url) # 输入图片 image_file = 'id-card.jpg' # 输入文本 query = "<local>请帮我提取这张身份证上的全部信息,并以JSON的格式进行输出,请遵循如下格式进行字段映射,将姓名替换成name, 将性别替换成gender, 将民族替换成ethnicity,将出生替换成birth_of_date,将住址替换成address,将公民身份号码替换成id_code。" with open(image_file, "rb") as f: b64 = base64.b64encode(f.read()).decode("utf-8") messages = [ { "role": "user", "content": [ {"type": "text", "text": query}, {"type": "image_url","image_url": {"url": f"data:image/jpeg;base64,{b64}"} ] } ] completion = client.chat.completions.create( messages=messages, model="AG-ocr-agent", stream=False, temperature=0.2, max_tokens=1024 ) result = completion.choices[0].message.content print(result)
支持输入图片和文本。
data:image/jpeg;base64
。具体转换方法可参见前文描述。<local>
来提升执行效率。由于 beam search 的原因,大模型生成的结果具有一定随机性。如果想要同一个输入每次生成的结果保持一致,您可可以在输入中传入temperature 参数,并将该参数设置一个相对较小的值,比如temperature=0.1
或者 temperature=0.01
。
不支持。目前只支持图片输入。如需提取 PDF 文档中的文本,可以先将 PDF 转换成图片,然后再使用智能体处理转换得到的图片。
当前只支持输入单张图片,不支持输入多张图片。
输入图片样例
固定输出字段
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
number | String | 卡号 | 无 |
expired_date | String | 过期时间 | 无 |
bank_id | String | 银行编号 | 无 |
bank_name | String | 银行名称 | 无 |
card_name | String | 卡名称 | 无 |
输出示例
{ "number": "6222628888888888888", "expired_date": "8888/88", "bank_id": "03010000", "bank_name": "交通银行", "card_name": "交银IC卡" }
输入图片样例
固定输出字段
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
name | String | 姓名 | 身份证正面 |
gender | String | 性别 | 身份证正面 |
ethnicity | String | 民族 | 身份证正面 |
data_of_birth | String | 出生 | 身份证正面 |
domicile | String | 住址 | 身份证正面 |
id_number | String | 公民身份号码 | 身份证正面 |
issue_authority | String | 签发机关 | 身份证反面 |
valid_period | String | 有效期限 | 身份证反面 |
输出示例
{ "name":"字节跑动", "gender":"男", "ethnicity":"汉", "data_of_birth":"1999.01.01", "domicile":"滨江市海滨区西知春路00号", "id_number":"102030199004444444", "issue_authority":"", "valid_period":"" }
输入图片样例
固定输出字段
输出字段 | 类型 | 说明 | 备注 |
---|---|---|---|
id_number | String | 驾驶证号 | 主页信息 |
name | String | 姓名 | 主页信息 |
sex | String | 性别 | 主页信息 |
nationality | String | 国籍 | 主页信息 |
address | String | 住址 | 主页信息 |
date_of_birth | String | 出生日期 | 主页信息 |
date_of_first_issue | String | 初次领证日期 | 主页信息 |
driving_class | String | 准驾车型 | 主页信息 |
valid_begin | String | 有效期起 | 主页信息 |
valid_end | String | 有效期止 | 主页信息 |
licence_issuing_authority | String | 发证机关 | 主页信息 |
document_id | String | 档案编号 | 副页信息 |
record | String | 记录 | 副页信息 |
输出示例
{ "address": "山东省XX市XX镇XX村XX", "class": "C1", "date_of_birth": "1959-01-09", "date_of_first_issue": "2013-12-27", "document_id": "411300211186", "id_number": "411328198921091120", "licence_issuing_authority": "河南省XX市公安局交通警察支队", "name": "梁XX", "nationality": "中国", "record": "实习期至2015年12月26日。", "sex": "女", "valid_begin": "2013-02-27", "valid_end": "2018-12-27" }
输入图片样例
固定输出字段
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
plate_number | String | 号牌号码 | 优先返回主页上的"号牌号码",无主页时返回副页上的"号牌号码" |
vehicle_type | String | 车辆类型 | 主页信息 |
owner | String | 所有人 | 主页信息 |
address | String | 住址 | 主页信息 |
use_character | String | 使用性质 | 主页信息 |
model | String | 品牌型号 | 主页信息 |
vin | String | 车辆识别代号 | 主页信息 |
engine_number | String | 发动机号码 | 主页信息 |
register_date | String | 注册日期(YYYY.MM.DD) | 主页信息 |
issue_date | String | 发证日期(YYYY.MM.DD) | 主页信息 |
licence_issuing_authority | String | 发证机关 | 主页信息 |
document_id | String | 档案编号 | 副页信息 |
approved_passengers_capacity | String | 核定载人数 | 副页信息 |
total_mass | String | 总质量 | 副页信息 |
curb_weight | String | 整备质量 | 副页信息 |
ratified_load_capacity | String | 核定载质量 | 副页信息 |
gabarite | String | 外廓尺寸 | 副页信息 |
traction_mass | String | 准牵引总质量 | 副页信息 |
remarks | String | 备注 | 副页信息 |
inspection_record | String | 检验记录 | 副页信息 |
输出示例
{ "address": "某某省某某县某某路", "approved_passengers_capacity": "XXXX", "curb_weight": "XXX", "document_id": "XXX", "engine_number": "ABCDEF123456", "gabarite": "XXX", "inspection_record": "XXX", "issue_date": "2014.01.01", "licence_issuing_authority": "某某省某某市公安局交通警察支队", "model": "桑塔纳12345ABCDE", "owner": "张三", "plate_number": "京ABCDEF", "ratified_load_capacity": "", "register_date": "2011.01.01", "remarks": "XXX", "total_mass": "XXX", "traction_mass": "XXX", "use_character": "非营运", "vehicle_type": "小型轿车", "vin": "ABCDCHGH123456789" }
输入图片样例
固定输出字段
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
ticket_num | String | 票号 | 主页信息 |
start_station | String | 出发站 | 主页信息 |
train_num | String | 车次 | 主页信息 |
end_station | String | 到达站 | 主页信息 |
time | String | 出发时间 | 主页信息 |
seat_num | String | 座位号 | 主页信息 |
price | String | 价格 | 主页信息 |
seat_cls | String | 座位等级 | 主页信息 |
id_num | String | 证件号 | 主页信息 |
name | String | 姓名 | 主页信息 |
sale_num | String | 销售编号 | 主页信息 |
sale_station | String | 售票车站 | 主页信息 |
sub_type | String | 车票类型(正常票、补票等其他票) | 主页信息 |
输出示例
{ "ticket_num":"Q099454", "start_station":"南京南", "train_num":"G124", "end_station":"北京南", "time":"2015年07月10日12:21开", "seat_num":"11车13A号", "price":"¥443.5元", "seat_cls":"二等座", "id_num":"341126********4921", "name":"王XX", "sale_num":"10010000490718Q099454", "sale_station":"北京南售", "sub_type":"normal_ticket" }
输入图片样例
固定输出字段
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
invoice_code | String | 发票代码 | 主页信息 |
invoice_name | String | 发票名称 | 主页信息 |
machine_num | String | 机器编号 | 主页信息 |
check_code | String | 校验码 | 主页信息 |
sheet_name | String | 发票联次 | 主页信息 |
invoice_no | String | 发票号码 | 主页信息 |
typed_invoice_code | String | 机打发票代码 | 主页信息 |
typed_invoice_no | String | 机打发票号码 | 主页信息 |
invoice_date | String | 开票日期 | 主页信息 |
buyer_name | String | 购买方名称 | 主页信息 |
buyer_taxpayer_no | String | 购买方纳税人识别号 | 主页信息 |
buyer_account | String | 购买方开户行&账号 | 主页信息 |
entry | List of Entry | 应税条目 | 字段说明见下方 |
total_price | String | 金额 | 主页信息 |
total_tax | String | 税额 | 主页信息 |
big_total_price_and_tax | String | 大写金额(价税合计) | 主页信息 |
total_price_and_tax | String | 小写金额(价税合计) | 主页信息 |
seller_name | String | 销售方 | 主页信息 |
seller_taxpayer_no | String | 销售方识别号 | 主页信息 |
seller_address_phone | String | 销售方地址&电话 | 主页信息 |
seller_account | String | 销售方开户行&账号 | 主页信息 |
comment | String | 备注 | 主页信息 |
payee | String | 收款人 | 主页信息 |
reviewer | String | 复核 | 主页信息 |
drawer | String | 开票人 | 主页信息 |
entry 明细说明
字段 | 类型 | 说明 | 备注 |
---|---|---|---|
entry_name | String | 货物或应税劳务、服务名称 | 主页信息 |
entry_type | String | 型号 | 主页信息 |
unit | String | 单位 | 主页信息 |
quantity | String | 数量 | 主页信息 |
unit_price | String | 单价(不含税) | 主页信息 |
price_amount | String | 金额 | 主页信息 |
tax_rate | String | 税率 | 主页信息 |
tax_amount | String | 税额 | 主页信息 |
输出示例
{ "invoice_code":"011002000611", "machine_num":"499098491560", "invoice_name":"XX增值税电子普通发票", "check_code":"16649652847559064366", "invoice_no":"10178760", "invoice_date":"2020年12月14日", "buyer_name":"北京字跳网络技术有限公司", "buyer_taxpayer_no":"91110108MA01F2L25J", "buyer_address_phone": "知春路1号 12xx24567222", "entry": [{ "entry_name":"*运输服务*客运服务费", "entry_type":"无", "unit":"次", "quantity":"1", "unit_prict":"73.92", "price_amount":"73.92", "tax_rate":"免税", "tax_amount":"***", }], "total_price":"73.92", "total_tax":"***", "big_total_price_and_tax":"柒拾叁圆玖角贰分", "total_price_and_tax":"73.92", "seller_name":"北京滴滴出行科技有限公司", "seller_taxpayer_no":"91110108MA01G0FB09", "seller_address_phone":"北京市海淀区东北旺西路8号院34号楼二层208号010-62682929", "seller_account":"招商银行股份有限公司北京东三环支行110936504210806", "payee":"张雪丽", "reviewer":"蔡静", "drawer":"杜洪亮", }
输入图片样例
固定输出字段
以 list 输出。list 中每个元素表示一个印章。每个印章元素包含以下 3 个字段。
字段 | 类型 | 说明 | 说明 |
---|---|---|---|
company_name | String | 印章内部单位名称 | 无 |
tax_code | String | 印章内部税务代码 | 无 |
seal_type | String | 印章内部专用章信息 | 无 |
输出示例
{ [ "company_name":"宁波迅途信息技术有限公司", "tax_code":"913302820629019631", "seal_type":"发票专用章", ] }