Create app.py
Browse files
app.py
ADDED
@@ -0,0 +1,56 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
import openai
|
2 |
+
from openai import AsyncOpenAI
|
3 |
+
import os
|
4 |
+
import json
|
5 |
+
import pandas as pd
|
6 |
+
|
7 |
+
async def text2theme(p, openai_key=os.environ.get('OPENAI_KEY'), target="ユーザ"):
|
8 |
+
"""
|
9 |
+
input1 (text): 「ペットボトル」という項目は何に仕分けしたら良いですか?
|
10 |
+
input2 (text): default
|
11 |
+
input3 (text): ユーザ
|
12 |
+
output1 (dataframe): 仕分け候補
|
13 |
+
"""
|
14 |
+
if openai_key == "default":
|
15 |
+
os.environ['OPENAI_API_KEY'] = os.environ.get('OPENAI_KEY')
|
16 |
+
else:
|
17 |
+
os.environ['OPENAI_API_KEY'] = openai_key
|
18 |
+
|
19 |
+
header = '{"1":"'
|
20 |
+
prompt=f'{p}\n{target}にとっての順位をkeyとして1~の数値をintに、訴求要素をvalueに、1階層のjsonだけを返し、バッククオートなどは含めないでください。\njson:{header}'
|
21 |
+
#print(prompt)1
|
22 |
+
client = AsyncOpenAI()
|
23 |
+
response = await client.chat.completions.create(
|
24 |
+
model='gpt-4',
|
25 |
+
messages=[
|
26 |
+
{
|
27 |
+
"role": "system",
|
28 |
+
"content": "あなたは会計士と税理士の資格を持っており、全ての質問にjsonで回答します。"
|
29 |
+
},
|
30 |
+
{
|
31 |
+
"role": "user",
|
32 |
+
"content": prompt
|
33 |
+
|
34 |
+
},
|
35 |
+
],
|
36 |
+
top_p=1,
|
37 |
+
frequency_penalty=0,
|
38 |
+
presence_penalty=0
|
39 |
+
)
|
40 |
+
|
41 |
+
json_data = header + response.choices[0].message.content
|
42 |
+
try:
|
43 |
+
# JSONデータを読み込む
|
44 |
+
j = json.loads(json_data)
|
45 |
+
except json.decoder.JSONDecodeError as e:
|
46 |
+
# JSON解析エラーが発生した場合、エラーの位置を特定
|
47 |
+
error_position = e.pos # エラーが発生した位置
|
48 |
+
print("JSONデコードエラー:", e)
|
49 |
+
print("エラーの周辺の文字:", json_data[max(0, error_position-10):error_position+10])
|
50 |
+
|
51 |
+
|
52 |
+
data = []
|
53 |
+
for k,v in j.items():
|
54 |
+
data.append([k,v])
|
55 |
+
|
56 |
+
return pd.DataFrame(data, columns=['rank', 'theme'])
|