|
import openai |
|
from openai import AsyncOpenAI |
|
import os |
|
import json |
|
import pandas as pd |
|
|
|
async def shiwake(p, openai_key=os.environ.get('OPENAI_KEY'), target="ユーザ"): |
|
""" |
|
input1 (text): 「ペットボトル」という項目は何に仕分けしたら良いですか? |
|
input2 (text): default |
|
input3 (text): 税務署 |
|
output1 (dataframe): 仕分け候補 |
|
""" |
|
if openai_key == "default": |
|
os.environ['OPENAI_API_KEY'] = os.environ.get('OPENAI_KEY') |
|
else: |
|
os.environ['OPENAI_API_KEY'] = openai_key |
|
|
|
header = '{"1":"' |
|
prompt=f'{p}\n{target}にとって納得感のある順位をkeyとして1~の数値をintに、項目をvalueに、1階層のjsonだけを返し、バッククオートなどは含めないでください。\njson:{header}' |
|
|
|
client = AsyncOpenAI() |
|
response = await client.chat.completions.create( |
|
model='gpt-4', |
|
messages=[ |
|
{ |
|
"role": "system", |
|
"content": "あなたは会計士と税理士の資格を持っており、勘定科目名がすらすら出てきます。経費という曖昧な単語は利用しません。全ての質問にjsonで回答します。" |
|
}, |
|
{ |
|
"role": "user", |
|
"content": prompt |
|
|
|
}, |
|
], |
|
top_p=1, |
|
frequency_penalty=0, |
|
presence_penalty=0 |
|
) |
|
|
|
json_data = header + response.choices[0].message.content |
|
try: |
|
|
|
j = json.loads(json_data) |
|
except json.decoder.JSONDecodeError as e: |
|
|
|
error_position = e.pos |
|
print("JSONデコードエラー:", e) |
|
print("エラーの周辺の文字:", json_data[max(0, error_position-10):error_position+10]) |
|
|
|
|
|
data = [] |
|
for k,v in j.items(): |
|
data.append([k,v]) |
|
|
|
return pd.DataFrame(data, columns=['rank', 'theme']) |
|
|