File size: 5,976 Bytes
800d064 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 |
import os
import json
from openai import OpenAI
import gradio as gr
from my_calling_functions import FUNCTIONS, get_trending_searches, google_res
def llm_calls(country, output_lang):
# OpenAI API client
client = OpenAI() # 無參數,即自動抓取環境變數
LLM_DEPLOYMENT_NAME = os.getenv('LLM_DEPLOYMENT_NAME')
# 定義query內容
# query = f"{country}的今日熱門關鍵字有哪些,選擇一個關鍵字,選擇的方式以新聞事件或人名為優先,其次是趣味性,並以google搜尋,了解此關鍵字內容,根據內容用{output_lang}撰寫一篇100字社群貼文,第一行為標題,適度的使用表情符號作為項目符號或表達情感,並在結尾加上三個hashtag"
query = f"Identify today's trending keywords in {country}. Select one keyword, prioritizing based on news events or personal names, \
followed by interesting or entertaining topics. Use Google search to understand the context of the selected keyword. \
Based on the information, write a 100-word social media post in {output_lang}, starting with a headline. \
Use emojis appropriately as bullet points or to express emotions, and conclude the post with three hashtags."
# 第一次呼叫OpenAI API,取回需要執行的function和參數,正解應為get_trending_searches和三個參數
response_1 = client.chat.completions.create(
model=LLM_DEPLOYMENT_NAME, # 特定模型版本才有支援function calling
messages=[{"role":"user", "content": query}],
tools=FUNCTIONS,
tool_choice="required"
)
print('===== response_1 =====')
print(response_1)
print('===== response_1.choices[0].message.tool_calls[0] =====')
print(response_1.choices[0].message.tool_calls[0])
# 為下一次呼叫OpenAI API準備function call和function call的結果
# 因為OpenAI API不接受response.choices[0].message裡面的某些key,所以用此function保留它接受的
def get_tool_message(response):
tool_msg = response.choices[0].message
tool_msg_dict = tool_msg.model_dump()
clean_tool_msg_dict = {
'role': tool_msg_dict['role'],
'content': tool_msg_dict['content'],
'tool_calls': tool_msg_dict['tool_calls']
}
return clean_tool_msg_dict
tool_msg_1 = get_tool_message(response_1)
print("===== tool_msg_1 =====")
print(tool_msg_1)
# 依照tool_msg_1的指示執行function
country_name = json.loads(tool_msg_1['tool_calls'][0]['function']['arguments'])['country_name']
hl = json.loads(tool_msg_1['tool_calls'][0]['function']['arguments'])['hl']
tz = json.loads(tool_msg_1['tool_calls'][0]['function']['arguments'])['tz']
function_call_result_1 = get_trending_searches(country_name, hl, tz)
# 做成OpenAI API要的格式
function_call_result_message_1 = {
"role": "tool",
"content": json.dumps(function_call_result_1, ensure_ascii=False),
"tool_call_id": tool_msg_1['tool_calls'][0]['id'],
}
print("===== function_call_result_message_1 =====")
print(function_call_result_message_1)
# 第二次呼叫OpenAI API,取回需要執行的function和參數,正解應為google_res和一個參數
response_2 = client.chat.completions.create(
model=LLM_DEPLOYMENT_NAME,
messages=[
{"role":"user", "content": query},
get_tool_message(response_1), # 附上第一次呼叫的資訊
function_call_result_message_1,
],
tools=FUNCTIONS,
tool_choice="required"
)
print('===== response_2 =====')
print(response_2.choices[0].message)
# 為下一次呼叫OpenAI API準備function call和function call的結果
# 因為OpenAI API不接受response.choices[0].message裡面的某些key,所以用此function保留它接受的
tool_msg_2 = get_tool_message(response_2)
print("===== tool_msg_2 =====")
print(tool_msg_2)
# 依照tool_msg_2的指示執行function
search_keyword = json.loads(tool_msg_2['tool_calls'][0]['function']['arguments'])['search_keyword']
function_call_result_2 = google_res(search_keyword)
# 做成OpenAI API要的格式
function_call_result_message_2 = {
"role": "tool",
"content": json.dumps(function_call_result_2, ensure_ascii=False),
"tool_call_id": tool_msg_2['tool_calls'][0]['id'],
}
print("===== function_call_result_message_2 =====")
print(function_call_result_message_2)
# 第三次呼叫OpenAI API,根據前兩次呼叫的所獲得的資訊,得出最終產出結果
response_3 = client.chat.completions.create(
model=LLM_DEPLOYMENT_NAME,
messages=[
{"role":"user", "content": query},
# 附上第一和第二次呼叫的資訊
get_tool_message(response_1),
function_call_result_message_1,
get_tool_message(response_2),
function_call_result_message_2,
],
)
print('===== Query =====')
print(query)
print('===== response_3 =====')
print(response_3)
print('===== response_3.choices[0].message.content =====')
print(response_3.choices[0].message.content)
return response_3.choices[0].message.content
gradio_app = gr.Interface(
llm_calls,
inputs=[gr.Dropdown(
choices=[("Taiwan", "台灣"), ("Japan", "日本"), ("South Korea", "南韓"), ("Czech Republic", "捷克")], label="Country", info="Will use current trends of this country"
), gr.Dropdown(
choices=[("English", "英文"), ("Chinese", "繁體中文")],
label="Output Language", info="Will use this language to write"
)],
outputs=["textbox"],
title="Social Media Writer",
description="Generate a social media post based on the trend of the selected country, in the selected language"
)
if __name__ == "__main__":
gradio_app.launch()
|