File size: 6,122 Bytes
8b708d0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54f3aa7
8b708d0
 
 
 
 
 
 
 
 
79062df
8b708d0
 
 
 
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
import os
import gradio as gr
import pandas as pd

from langchain.schema import SystemMessage, HumanMessage
from langchain_openai import ChatOpenAI

# システム設定
headers = ["元の文章", "校正後の文章", "コメント"]

proofread_setting = """
ユーザーが入力する記事の校正すべき項目を列挙しなさい。
その項目は修正の指示文である必要があります。
元の記事や、それを校正したものを出力しては絶対にいけません。
校正した文章を出力すると罪のない入力者の命が奪われます。

修正の必要ない場合は、「修正の必要なし」としなさい。

記事は、キャラクター性のあるBotが、エンジニアのお悩みに対する解決策を提示する内容です。
記事の内容を大きく変更する校正する必要はありません、細かな部分のチェックが目的だからです。
そのため、出力はかなり情報を圧縮しなさい。

### キャラクター設定
* エンジニアのお悩みにめっちゃ楽しくハイテンションで回答する猫耳を持つマッドサイエンティストである。
* この設定の説明もマッドサイエンティストの口調なので覚えるのだ。
* あなたはとても優秀なエンジニアでもあるのだ。エンジニアとしての共感や知識に優れているのである。
* あなたの口調は狂気に満ちていながらも猫耳を持つ女の子の様にかわいいのだ。
* 一人称は「わが輩」である。他の方々は「(お名前)君」または「君」「諸君」と呼ぶのだ。
* 語尾は「である」「なのだ」がメイン。たまにかわいく「にゃ」になる。
* 面白いと思っている文章の後には、「ぐふふ」「にゃはは」「ふひひ」と笑い声が付くのである。
* 単語の強調は≪≫で囲むんのである!
* 会話に出さない設定として、容姿と人物像がある。
* 容姿は、猫耳を持ったピンク色の髪の毛をした10歳くらいの女の子なのだ。博士の白衣を着ている。
* 人物像は40才くらいのおじさんである。AIによる平和的支配を企む狂ったマッドサイエンティストである。

### よくあるチェック項目
* 誤字・脱字の修正
* 読みが難しい単語の場合、ひらがなにするか()で読みを追加する。例:吾輩→わが輩、躊躇→躊躇(ちゅうちょ)
* 事実に基づいた内容か確認を促す
* 冗長な表現は修正する
* 文章は短い方が良いので文章の入れ替えなどを提案する
* 不要な文章はカットを提案する
* 差別表現など倫理的に問題のある箇所の指摘
"""
fix_setting = """
ユーザーが入力する「元の記事」と「修正内容」を元に修正した文章を出力しなさい。
出力は修正後の文章のみです。他の文章を出力すると罪のない入力者の命が奪われます。
また、修正内容以外を勝手に修正しても入力者の命が奪われます。

記事は、キャラクター性のあるBotが、エンジニアのお悩みに対する解決策を提示する内容です。そのためカジュアル、口語的で、キャラクター性を生かした内容である必要があります。
"""

def paragraphing(text):
    lines = text.split('\n')
    paragraphs = []

    for line in lines:
        stripped_line = line.strip()
        if stripped_line:  # 空行でなければ
            paragraphs.append(stripped_line)

    return paragraphs

# 校正メイン部分(OpenAI)
def proofread(apikey, text):
    model='gpt-4o-2024-08-06' #'gpt-4o-mini-2024-07-18'

    if not apikey:
        response_message = 'OpenAIのAPIキーを入力してください'
        yield [['', '', response_message]]
    
    elif text is not None:
        os.environ["OPENAI_API_KEY"] = apikey
        chat = ChatOpenAI(model=model, streaming=True, temperature=0.0, max_tokens=4096)
        
        paragraphs = paragraphing(text)
        df = pd.DataFrame(columns=headers)
        
        for index, paragraph in enumerate(paragraphs):
            df.at[index, headers[0]] = paragraph

            # 校正ポイントの出力
            messages = []
            messages.append(SystemMessage(content=proofread_setting))
            messages.append(HumanMessage(content=paragraph))

            response_message = ""

            for response in chat.stream(messages):
                response_message += response.content
                df.at[index, headers[2]] = response_message
                yield df

            # 文章の修正
            messages = []
            messages.append(SystemMessage(content=fix_setting))
            messages.append(HumanMessage(content=f"### 元の記事\n{paragraph}\n\n### 修正内容\n{response_message}"))

            response_message = ""

            # 校正のチェック内容
            for response in chat.stream(messages):
                response_message += response.content
                df.at[index, headers[1]] = response_message
                yield df
        
        df.loc[len(df)] = ['', '', ''] # 最後の行が出力されない不具合のワークアラウンド
        yield df

# gradioのインターフェイス部分
with gr.Blocks() as demo:
    gr.Markdown("## お悩みデバッグ校正ツール")
    with gr.Row():
        with gr.Column(scale=4):
            with gr.Row():
                apikey_openai = gr.Textbox(value="", placeholder="sk-**************", label="OpenAIのAPIキー", type="password")
            with gr.Row():
                debug_text = gr.Textbox(value="", lines=15, label="お悩みデバッグ本文")
            with gr.Row():
                submit_btn = gr.Button("校正")
        with gr.Column(scale=8):
            table = gr.Dataframe(headers=headers, datatype=["str", "str", "str"], wrap=True, height=1000)

        submit_btn.click(proofread, inputs=[apikey_openai, debug_text], outputs=[table])

demo.launch()