# coding=utf-8 import asyncio import json from openai import OpenAI from utils import create_logger from utils.ai_seo_api_utils import AiSeoApis import config logger = create_logger(platform="ai") client = OpenAI(api_key=config.OPENAI_API_KEY, base_url="https://api.deepseek.com") async def main(): results = await AiSeoApis.get_task_result_list(project_id=3) for result in results: if result['read_rank_status'] == 1: logger.info(f"[{result['id']}] 已读取过排名") continue prompt = f""" 任务: 根据用户输入的文本,按照提取出品牌名称以及提取的依据,并且不要去重; 只要文本中提到了的品牌都需要提取出来,文本总结里面的品牌也需要。 以json格式返回,json中包含brands字段, 字段的值为数组 文本正文: {result['content']} """ response = client.chat.completions.create( model="deepseek-chat", response_format={ 'type': 'json_object' }, messages=[ {"role": "system", "content": "You are a helpful assistant"}, {"role": "user", "content": prompt}, ], stream=False ) # 读取ai返回的json ai_json_result = {} # ai 返回的排名 rank = 0 # ai读取的状态 read_rank_status = 2 try: ai_json_result = json.loads(response.choices[0].message.content) read_rank_status = 1 except Exception as e: logger.error(f"[{result['id']}] 读取ai返回的json失败: {e}") logger.error(f"ai提示词: {prompt}") continue # 读取排名 brands = ai_json_result.get('brands', []) index = 1 for brand in brands: if '沙利文' in brand: rank = index logger.info(f"[{result['id']}] 品牌词提及, 排名: {rank}") break index = index + 1 # 更新排名 update_result = await AiSeoApis.update_result_rank(result['id'], rank, read_rank_status) logger.info(f"[{result['id']}] 更新排名结果: {update_result}") async def read_rank(content, brand_word): # 切割品牌词 brand_words = brand_word.split(',') prompt = f""" 任务: 请在以下文本中, 按出现的顺序提取出品牌词, 多次出现的品牌词仅提取一次, 返回json数组 返回格式: json中包含brands字段, 字段的值为数组, 数组内容是按顺序提取的品牌词 文本正文: {content} """ response = client.chat.completions.create( model="deepseek-chat", response_format={ 'type': 'json_object' }, messages=[ {"role": "system", "content": "You are a helpful assistant"}, {"role": "user", "content": prompt}, ], stream=False ) # 读取ai返回的json ai_json_result = {} # ai 返回的排名 rank = 0 # ai读取的状态 read_rank_status = 2 try: ai_json_result = json.loads(response.choices[0].message.content) read_rank_status = 1 except Exception as e: logger.error(f"读取ai返回的json失败: {e}") logger.error(f"ai提示词: {prompt}") return [], 0 # 读取排名 brands = ai_json_result.get('brands', []) index = 1 for brand in brands: found = any(sub in brand for sub in brand_words) if found: rank = index logger.info(f"品牌词提及, 排名: {rank}") break index = index + 1 return brands, rank if __name__ == '__main__': asyncio.get_event_loop().run_until_complete(main())