こんにちは~NTです!
立て続けの投稿となりますが、
内容は前編に続きまして後編とさせていただきます。
Bedrockについては、GPT-4oよりも高性能と言われている「Claude 3.5 Sonnet v2」を使用しています。参考記事
ソースコード実行のために色々調べながら動かしたので、今回は実際に動くソースコードも共有します。
あらすじ的には、議事録生成アプリを作ろうという話だったのに、
小説の音声コーパスを文字起こししてAIに内容をまとめてもらおうという趣旨に変わって来ております。。。w
一応、議事録生成用のプロンプトも考えて用意してみたので、
参考にしていただけたらと思います。(個人的に社内で需要があれば作ってみようと思ってます)
今回使用するAWSサービスは以下の通りです。
前回のAWS Batchの処理において、出力結果となる文字起こししたテキスト(約55,000字)をS3にアップロードしてあるので、それを用いてLambdaからBedrockへ投げてみようと思います。
先に当初の目的であった議事録生成用のプロンプトは以下のようになるかなと考えています。
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 |
以下の中小IT企業の社内で行われた会議を文字起こししたテキストから 正式な議事録を作成してください。 文字起こし精度が悪い場合はつじつまが合うよう補完してください。 必要な出力フォーマット: 1. 会議概要: - 日時 - 場所 - 参加者 - 議題 2. 議事内容: - 各議題の要点 - 重要な決定事項 - アクションアイテム 3. まとめ: - 主な合意事項 - 次回会議の予定(もしあれば) - フォローアップが必要な事項 以下の点に注意して作成してください: - 冗長な会話は要点のみに整理する - 重要な決定事項を明確に示す - アクションアイテムには担当者と期限を含める - 専門用語や略語は正式な表現に統一する - 箇条書きを適切に使用して読みやすくする 特定の会議タイプに応じた項目の追加: 技術会議用の技術的な決定事項セクション 出力形式の指定: Markdown形式 文字起こしテキスト: [ここに会議の文字起こしテキストを貼り付け] |
今回は、前編でもお伝えしたように実際の会議データは使用していませんので、
夏目漱石の坊ちゃんを題材にプロンプトを考えてみました。
1 2 3 4 5 6 7 8 9 10 11 12 13 |
以下の文字起こししたテキストは 昔の日本の小説家が書いた小説です。 音声から文字起こしをしたので漢字の変換ミスなども容易に考えられますので、 その辺りも考慮した上で考えてください。 書いてある内容から以下の3点を正確に記載してください。 出力フォーマット: - 登場人物 - 小説の概要(50文字程度) - 小説の内容まとめ(300文字程度) 文字起こしテキスト: [文字起こしテキストを貼り付け] |
なかなか雑ですが、注文の多いプロンプトにしてみました。
そして、ここの[文字起こしテキストを貼り付け]という部分に前編で音声データから文字起こしした約55,000文字の文字列を入れて、Bedrockへ送るコードは以下となります。
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 |
import boto3 import os import json bedrock_runtime_client = boto3.client( service_name="bedrock-runtime", region_name="us-east-1", ) s3_client = boto3.client( service_name="s3", region_name="us-east-1", ) def bedrock_invoke(prompt): try: response = bedrock_runtime_client.invoke_model( modelId="us.anthropic.claude-3-5-sonnet-20241022-v2:0", contentType="application/json", accept="application/json", body=json.dumps( { "anthropic_version": "bedrock-2023-05-31", "max_tokens": 4096, "top_k": 250, "stop_sequences": [], "temperature": 1, "top_p": 0.999, "messages": [ { "role": "user", "content": [ { "type": "text", "text": prompt } ] } ] } ) ) response_body = json.loads(response.get("body").read()) return response_body except Exception as e: print(f"Error: {e}") return None def process_s3_and_bedrock(bucket_name, s3_key): try: response = s3_client.get_object(Bucket=bucket_name, Key=s3_key) file_content = response["Body"].read().decode("utf-8") prompt = f""" 以下の文字起こししたテキストは 昔の日本の小説家が書いた小説です。 音声から文字起こしをしたので漢字の変換ミスなども容易に考えられますので、 その辺りも考慮した上で考えてください。 書いてある内容から以下の3点を正確に記載してください。 出力フォーマット: - 登場人物 - 小説の概要(50文字程度) - 小説の内容まとめ(300文字程度) 文字起こしテキスト: {file_content} """ bedrock_response = bedrock_invoke(prompt) return bedrock_response except Exception as e: print(f"Error processing S3 and Bedrock: {e}") return None def lambda_handler(event, context): bucket_name = "XXXXXXXXXXXXX" s3_key = "//20241218032253_output.txt" bedrock_response = process_s3_and_bedrock( bucket_name=bucket_name, s3_key=s3_key ) print(f"bedrock_response: {bedrock_response}") answer = bedrock_response["content"][0]["text"] print(f"answer: {answer}") |
AWS Batch上でBedrockを呼び出しても良かったのですが、
Bedrockの実行時間(今回で約30秒程度)分のEC2起動時間を考えると、別実行でLambda上で実行しています。
実際に出力された結果は以下となります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
以下のように整理いたします: 登場人物: - 主人公(「俺」として語られる教師) - 山嵐/山原氏(同僚教師) - 赤シャツ(教頭) - タヌキ(校長) - キヨ(主人公の世話をしていた女性) - 野田(教師) - 裏成/うらなり(教師) 小説の概要: 新任の中学教師として赴任した主人公が、学校での様々な人間関係や騒動を経験しながら、最終的に辞職するまでを描いた物語。 小説の内容まとめ: 主人公は数学の教師として地方の中学校に赴任する。 赴任先では「赤シャツ」と呼ばれる教頭や「タヌキ」と呼ばれる校長、同僚の山嵐(山原氏)らと出会う。 教師として授業を行う傍ら、学校内での人間関係に悩まされる。特に赤シャツとの確執が深まっていく。 お祭りでの乱闘事件や新聞沙汰など様々な騒動に巻き込まれ、最終的に同僚の山嵐と共に学校を去ることを決意する。 物語の最後には、主人公が外国鉄道会社に就職し、世話になっていたキヨの死を看取るところで終わる。 これは漱石の『坊っちゃん』であると推測されます。 |
概要については58文字なので想定通り、まとめについても227文字なので想定通り、
さらには坊ちゃんであると推測までされていました。
最後の「主人公が外国鉄道会社に就職し」という部分は「街鉄の技手」を外鉄と勘違いしていそうです。
業務でもLLM系に触れることは多いですが、やはりこの辺りの技術革新は日進月歩で日々驚かされてます。。。
小説を約3分程度で文字起こしをかけて、30秒程度で全ての内容を把握して要約するというのは、
さすがに離れ業過ぎるのでさすがAIというところもありつつ、
過去に知り得てる情報を使っていたかも知れないので、将来予測などはやはり不完全だと思います。
議事録生成というところでは、また別の時間を使って試してみようと思います。
今回のアドベントカレンダーは全て技術的なお話でしたが、
楽しんでいただけたら幸いです。
最後まで見ていただきありがとうございました!