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()