推しアイデア
測りにくいソースコードの開発量をAIを用いることで中立的な立場から評価する web3技術を使ってトークンを付与することで、そのエンジニアの開発貢献度が分かり、トークン量に応じて報酬の分配をするというサービスも展開可能
―
測りにくいソースコードの開発量をAIを用いることで中立的な立場から評価する web3技術を使ってトークンを付与することで、そのエンジニアの開発貢献度が分かり、トークン量に応じて報酬の分配をするというサービスも展開可能
企業に就職していない大学生のエンジニアはプロジェクトに参加する機会がほとんどなく、自分の能力を使って収益を得る機会もないため、そういった機会を提供できるということを示すために今回の制作に至った
・AIによる評価 ・web3技術を活用したトークンの付与 ・ICカードとの情報リンク ・DiscordBOT ・OAuth2 ・Git Hub Action
このサービスは、エンジニアが作成したソースコードをAIが開発量を評価し、Web3技術を活用してトークンを付与するサービスです。
エンジニアが作成したソースコードをChatGPTのAPIを用いて評価します。使用するモデルは使用量や性能を鑑みて「gpt-4o-mini」を採用しています。また、評価理由や要件合致率も同時に出力させるようになっています。タスクの要件を十分に満たしていない(合致率が60%を下回る)ソースコードはタスク完了申請を却下するようにしており、評価理由もユーザーに提示することでユーザーから納得を得られるような仕組みにしました。 さらに、ただAPIを使ってプロンプトを投げるだけではChatGPTの回答をうまく処理できないため、プロンプトや回答出力の処理を工夫し、json形式で出力させた後に必要な事項をピックアップできるようにしています。
def evaluate_code(github_raw_url,issue_description): # 例: GitHubのraw URLを指定 #github_raw_url = "https://raw.githubusercontent.com/sirayu2525/SocialTokenApp/refs/heads/evaluation_code/Open_AI/GPT1.py" fetch_result = fetch_github_code(github_raw_url) if fetch_result['result']: source_code = fetch_result['text'] text = '''以下のソースコードを基準とします。 def process_data(data): return [item for item in data if item >= 10] data = [5, 15, 8, 20, 3, 12] print("Filtered Data:", process_data(data)) このソースコードの開発にかかるコストを1.000Cと定義します。 では、以下のコードの開発には何Cかかるか算出してください。 '''+source_code+''' また、開発してほしいプログラムの概要は以下のようになっています。 この概要に合致しているかどうかもチェックして合致率(パーセンテージ)で教えてください '''+issue_description+''' cost:かかるコスト(小数点第2位まで記載して単位は省略) reason:コストの理由(100字以内) match_percent:合致率(0~100の整数で答えて、単位はつけないでください) としたうえで、以下のようなjson形式で答えてください。 {'cost':cost,'reason':reason,'match_percent':match_percent} ''' if fetch_result['script_type'] == 'py': text = '''以下のソースコードを基準とします。 def process_data(data): return [item for item in data if item >= 10] data = [5, 15, 8, 20, 3, 12] print("Filtered Data:", process_data(data)) このソースコードの開発にかかるコストを1.000Cと定義します。 では、以下のコードの開発には何Cかかるか算出してください。 '''+source_code+''' また、開発してほしいプログラムの概要は以下のようになっています。 この概要に合致しているかどうかもチェックして合致率(パーセンテージ)で教えてください '''+issue_description+''' cost:かかるコスト(小数点第2位まで記載して単位は省略) reason:コストの理由(100字以内) match_percent:合致率(0~100の整数で答えて、単位はつけないでください) としたうえで、以下のようなjson形式で答えてください。 {'cost':cost,'reason':reason,'match_percent':match_percent} ''' # GPT-3.5-Turboモデルに送信するメッセージ形式を修正 response = openai.ChatCompletion.create( model="gpt-4o-mini", # または gpt-4 など messages=[ {"role": "system", "content": "You are a helpful Engineer."}, {"role": "user", "content": text} ] ) # GPTの返答を取得 gpt_reply = response['choices'][0]['message']['content'] print("ChatGPT:", gpt_reply) gpt_reply = gpt_reply.replace("'''", "") gpt_reply = gpt_reply.replace("```", "") gpt_reply = gpt_reply.replace("json", "") gpt_reply = gpt_reply.replace("'", '"') print(gpt_reply) # 文字列をJSON形式に変換 data = json.loads(gpt_reply) print(data) try: gpt_reply = gpt_reply.replace("'''", "") gpt_reply = gpt_reply.replace("```", "") gpt_reply = gpt_reply.replace("json", "") gpt_reply = gpt_reply.replace("'", '"') # 文字列をJSON形式に変換 data = json.loads(gpt_reply) print(data) return data except: return None else: print('【ERROR】') print(fetch_result) return None
Discord botは、スラッシュコマンドや埋め込みメッセージに対応させることでUXの向上を図りました。
評価結果を基に、Web3技術を活用して、Sepoliaネットワーク上のMOP(独自トークン)を付与します。このトークンは、Sepoliaテストネットワーク上でユーザーのウォレット宛に発行されるので、MetaMask等でトークン量を閲覧することが出来ます。独自トークンに関してはether.jsでERC20を基にしてミント機能(トークン発行)などを追加しました。
DiscordBOTを活用することでエンジニアが一連の申請や処理(ソースコードの提出やプロジェクトの立ち上げ)を行いやすくしています。また、Discord上でGitHubのアカウント名やウォレットIDの情報をリンクさせることができ、データベースを作ることでソースコードの提出をしてトークンを受け取る際に、わざわざウォレットIDを入力しなくてもいいようになっています。
付与されたMOPトークン量は、エンジニアが所持するICカードでカードリーダーにタッチすることで閲覧できるようになっています。まずはDiscordのOauth2でDiscordアカウントを認証し、認証されたアカウントとタッチされたICカードのIDmをリンクさせます。認証が完了したカードはかざすだけでDiscordのアカウント名と付与されているトークン量(MOP)を参照することが出来ます。IDmを読み取る形式なので、どのようなICカードでも問題ありません(クレジットカード等は仕様上不可)。また、IDmを読み取る形式では、サービスによってはセキュリティ上適さないこともありますが、今回のケースでは情報の参照だけであったのでこちらの方法を採用しました。
データベースはPostgreSQLを用いており、FastAPIを用いてAPI化することで複数のプログラムから接続しやすくしています。また、APIキーも用いているので第三者が容易に接続できないようにもなっています。
id = Column(Integer, primary_key=True, index=True) # 自動インクリメントの ID discord_name = Column(String(100), default='') # Discordアカウント名 github_username = Column(String(100), default='') # GitHubユーザー名 balance = Column(Integer, default=0) # 残高(日本円) wallet_id = Column(String(255), unique=True, default='') # ウォレットID(文字列) tx_hashes = Column(JSON, default=[]) # 取引履歴(リスト型) card_IDm = Column(String(100), default='')
カード管理プログラムのGUI画面は最初標準ライブラリーのTkinterで実装していましたが、少し質素だったので急遽Pygameを使用して気持ちばかりリッチにしました。
元のTkinterの画面
Pygameの画面
コードの評価結果に基づいて、MOPトークンがSepoliaネットワーク上に発行されます。
テストネットにデプロイするにあたり、本番のようにガス代みたいなものがかかります。それは無料ではあるものの取得が面倒で、結果毎日グーグルのサービスを使ってちまちま集めていた。
初めてYMLファイルを書いた。GithubActionsで自動デプロイもできるようにしたので、謎の優越感(?)があった。ただ、GithubとVPSのSSH接続はさくらVPS特有(?)のものがあったので苦労した。 しっかりドキュメント読むべきだったか。
初めてReactと真剣に向き合ったが、慣れてしまえばそんなに難しくなった。ただ、内部の処理であったりが複雑であるとも感じ、様々なエラーと向き合った。next_oath.jsでDiscordOAth認証した。
FastAPIで構築しました。CORSの部分で苦労してFastAPIのミドルウェアを弄ることで何とか解決しました。
DBをPythonで初めて扱ったので右も左も分からなかったが、案外すんなり作れた。ただ、そのDBの機能をFastAPIでAPIとして提供するときにかなり色々とエラーが出たので、その対応にかなりの時間が割かれました。
CODEN-eyeでは、AI技術、ブロックチェーン技術、そしてDiscordBOT・デスクトップアプリ・ブラウザページというなじみやすいフロントエンドを使用しました。どの技術も初めての挑戦で大変苦労しましたが、何とか完成までこぎつけました。また、機能・モジュール単位で分けて開発したので今後のサービスの拡張も可能になっています。