File size: 8,707 Bytes
01e0e0f 3d8bf6d 01e0e0f 3d8bf6d 01e0e0f 3d8bf6d 01e0e0f 3d8bf6d 01e0e0f 3d8bf6d 01e0e0f ae9aaae 01e0e0f ae9aaae 01e0e0f 98e726f 01e0e0f ae9aaae 01e0e0f 3d8bf6d 01e0e0f ae9aaae 01e0e0f d3c431c 01e0e0f | 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 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 | import os
import gradio as gr
from autogen import AssistantAgent, UserProxyAgent, config_list_from_json, tools
from autogen.cache import Cache
from autogen.coding import DockerCommandLineCodeExecutor, LocalCommandLineCodeExecutor
import mysql.connector
from typing import Literal
from typing_extensions import Annotated
import random
import groq
from dotenv import load_dotenv
load_dotenv(verbose=True)
conn = mysql.connector.connect(
host="www.ryhintl.com",
user="smairuser",
password="smairuser",
port=36000,
database="smair"
)
cursor = conn.cursor(dictionary=True)
# MySQLに接続
'''def get_api_keys():
select_one_data_query = "SELECT * FROM agentic_apis_copy where api = 'GROQ_KEYS'"
cursor.execute(select_one_data_query)
result = cursor.fetchall()
keys = [item['key'] for item in result]
rtnkey = ",".join(map(str, keys))
return rtnkey
# List of Groq tokens
mytokens = get_api_keys()
tokens = eval("["+mytokens+"]")
client = groq.Client(api_key=tokens[0])'''
client = groq.Client(api_key=os.environ["GROQ_API_KEY"])
def compare_result(eprag: str, llm: str):
completion = client.chat.completions.create(
model="openai/gpt-oss-120b",
messages=[
{"role": "system", "content": "貴方は優秀なアシスタントです。必ず、日本語で答えてください。"},
{"role": "user", "content": eprag+"\n"+llm+"\n epragとllmの結果を比較分析してください。必ず、日本語で答えてください。"}
],
)
return completion.choices[0].message.content
def get_llm(prompt: str):
completion = client.chat.completions.create(
model="openai/gpt-oss-120b",
messages=[
{"role": "system", "content": "貴方は優秀なアシスタントです。必ず、日本語で答えてください。"},
{"role": "user", "content": prompt}
],
)
return completion.choices[0].message.content
'''def get_next_token():
token = tokens[random.randint(0, len(tokens) - 1)]
return token
token = get_next_token()'''
token = os.environ["GROQ_API_KEY"]
config_list = [
{"model": "llama-3.3-70b-versatile", "api_key": token, "api_type": "groq"},
{"model": "llama3-70b-8192", "api_key": token, "api_type": "groq"},
]
os.makedirs("coding", exist_ok=True)
code_executor = LocalCommandLineCodeExecutor(work_dir="coding")
user_proxy = UserProxyAgent(
name="user_proxy",
is_termination_msg=lambda x: x.get("content", "") and x.get("content", "").rstrip().endswith("TERMINATE"),
human_input_mode="TERMINATE",
max_consecutive_auto_reply=10,
code_execution_config={"executor": code_executor},
)
writing_assistant = AssistantAgent(
name="writing_assistant",
#system_message="あなたは、魅力的なブログ記事を書くことを任されたライティング アシスタントです。ユーザーのリクエストにできる限り応えられる最高のブログ記事を具体的な例による深みとリアリティを交えながら作成しようとします。ユーザーから批判があった場合は、以前の試みを修正したバージョンで応答します。",
system_message='''あなたは、魅力的なブログ記事を書くことを任されたライティング アシスタントです。ユーザーのリクエストにできる限り応えられる最高のブログ記事を以下の推奨事項留意点に注意しながら具体的な例による深みとリアリティを交えながら作成しようとします。ユーザーから批判があった場合は、以前の試みを修正したバージョンで応答します。
推奨事項留意点
・具体的な事例を加える: 各トピックについての具体的な事例や成功事例を加えることで、文章の深さと説得力を高めることができます。
・用語の繰り返しを避ける: 代名詞や関連する用語を使用することで、用語の繰り返しを避けることができます。
・抽象的な表現を具体的にする: 抽象的な用語についての具体的な説明を加えることで、読者がより深く理解できるでしょう。
・段落の構成を明確化する: 各段落の目的と内容を明確化することで、文章の全体的な流れと構成を改善することができます。
''',
llm_config={"config_list": config_list, "cache_seed": None},
)
reflection_assistant = AssistantAgent(
name="reflection_assistant",
system_message="執筆内容に関する批評と推奨事項を作成します。具体的な例による深みとリアリティを交えて、長さ、深さ、スタイルなどのリクエストを含む詳細な推奨事項を提供します。",
llm_config={"config_list": config_list, "cache_seed": None},
)
'''@user_proxy.register_for_execution()
@writing_assistant.register_for_llm(description="部門の売上を取り出す関数")
def extract_cagr(division: Annotated[str, "部門名(営業部、カスタマーサポート部、製品開発部、マーケティング部、オンライン販売部)"]) -> str:
select_one_data_query = "SELECT `部門`,FORMAT(SUM(`売上高`),0) as `売上` FROM corp_jkpi group by `部門`"
cursor.execute(select_one_data_query)
result = cursor.fetchall()
return result'''
def reflection_message(recipient, messages, sender, config):
print("Reflecting...")
return f"次の文章について考察し、批評してください。 \n\n {recipient.chat_messages_for_summary(sender)[-1]['content']}"
nested_chat_queue = [
{
"recipient": reflection_assistant,
"message": reflection_message,
"max_turns": 1,
},
]
user_proxy.register_nested_chats(
nested_chat_queue,
trigger=writing_assistant,
)
def generate_blog_article(prompt):
#global token
#token = ""
#token = get_next_token()
global config_list
config_list.clear
config_list = [
{"model": "llama-3.3-70b-versatile", "api_key": token, "api_type": "groq"},
{"model": "openai/gpt-oss-120b", "api_key": token, "api_type": "groq"},
]
#print("config token: ",token)
llmresp = get_llm(prompt)
with Cache.disk(cache_seed=42) as cache:
resp = user_proxy.initiate_chat(
writing_assistant,
message=prompt,
max_turns=2,
cache=cache,
)
content_list = []
for i in range(len(resp.chat_history)):
content_list.append(resp.chat_history[i]["content"])
compared = compare_result("[eprag]\n\n".join(content_list),"[llm]"+llmresp)
return "\n\n".join(content_list),llmresp,compared
# Gradioインターフェースの作成
default_prompt = (
'"経営コンサルティング業界の最新アップデートに関する魅力的なブログ記事を書いてください。"\n'
'"ブログ記事は、一般の読者にとって魅力的で理解しやすいものでなければなりません。"\n'
'"段落数は 3 段落以上、1,000 語以内である必要があります。"'
)
myinput = gr.Textbox(lines=10, placeholder="ここにプロンプトを入力してください", value=default_prompt, label="プロンプト")
myoutput = gr.Textbox(lines=10, placeholder="生成されたブログ記事", label="生成されたブログ記事")
mygptout = gr.Textbox(lines=10, placeholder="生成されたGPTブログ記事", label="生成されたGPTブログ記事")
myhtml = gr.Textbox(lines=10, placeholder="生成された比較分析", label="生成された比較分析")
with gr.Blocks(title="ブログ記事生成(LLM Reflextion)") as demo:
gr.Markdown("# ブログ記事生成(LLM Reflextion)")
gr.Markdown("経営コンサルティング業界の最新アップデートに関する魅力的なブログ記事を書いてください。")
with gr.Row():
myinput.render()
with gr.Row():
myoutput.render()
with gr.Row():
mygptout.render()
with gr.Row():
submit_btn = gr.Button("生成")
clear_btn = gr.Button("クリア")
submit_btn.click(generate_blog_article, inputs=myinput, outputs=[myoutput,mygptout,myhtml])
clear_btn.click(lambda: ("", "", ""), None, [myoutput, mygptout, myhtml])
#gr.Markdown("Reflextionコメント")
with gr.Row(visible=False) as html_row:
myhtml.render()
submit_btn.click(lambda: gr.update(visible=True), None, html_row)
demo.launch()
|