68 lines
2.4 KiB
Python
68 lines
2.4 KiB
Python
import logging
|
||
from api.doubao_client import DoubaoClient
|
||
from utils.image_utils import encode_image # 更新导入语句以反映新位置
|
||
|
||
prompt = """
|
||
你是一个初中数学图片的描述专家,请将图片中的内容转换为文本。
|
||
1、注意数学公式需要用latex格式输出。注意只输出文本内容,不要输出任何解释。
|
||
2、如果图片中有图形,请结合题干内容对图形进行描述,只要描述不需要任何解释。
|
||
3、如果图片中是坐标系,分析抛物线的开口方向和经过的象限,并详细描述。识别图片中的坐标系类型,如直角坐标系、极坐标系等。
|
||
4、要以markdown格式输出
|
||
输出格式为
|
||
【题干】
|
||
【图形描述】
|
||
"""
|
||
|
||
class OCRService:
|
||
def __init__(self, api_client: DoubaoClient):
|
||
"""
|
||
初始化OCRService
|
||
|
||
Args:
|
||
api_client: ApiClient的实例
|
||
"""
|
||
self.api_client = api_client
|
||
logging.info("OCRService initialized.")
|
||
|
||
def get_ocr(self, problem: str) -> str:
|
||
"""
|
||
获得问题的ocr。
|
||
|
||
Args:
|
||
problem: 需要解答的问题图片。
|
||
|
||
Returns:
|
||
问题的ocr结果。
|
||
"""
|
||
# 将图片转换为base64编码
|
||
base64_image = encode_image(problem)
|
||
|
||
# 构建请求消息,包含图片
|
||
messages = [
|
||
{
|
||
'role': 'user',
|
||
'content': [
|
||
{
|
||
'type': 'image_url',
|
||
'image_url': {
|
||
'url': f'data:image/jpeg;base64,{base64_image}'
|
||
}
|
||
},
|
||
{
|
||
'type': 'text',
|
||
# 'text': '请将图片中的内容转换为文本。\n注意数学公式需要用latex格式输出。\n注意只输出文本内容,不要输出任何解释。'
|
||
'text': prompt
|
||
}
|
||
]
|
||
}
|
||
]
|
||
|
||
logging.info(f"Calling API for ocr for problem: {problem[:50]}...") # Log first 50 chars
|
||
solution = self.api_client.chat_completion(messages, temperature=0.6, max_tokens=2048)
|
||
|
||
if solution is None:
|
||
logging.error("Failed to get ocr from API.")
|
||
return "ocr出现错误,请检查输入或稍后重试。"
|
||
|
||
logging.info("Successfully got ocr.")
|
||
return solution |