「しりとり上手の高木さん」と、LINEでしりとり勝負をしたい！

# 概要
「[からかい上手の高木さん （© 山本崇一朗 小学館）](https://ja.wikipedia.org/wiki/%E3%81%8B%E3%82%89%E3%81%8B%E3%81%84%E4%B8%8A%E6%89%8B%E3%81%AE%E9%AB%98%E6%9C%A8%E3%81%95%E3%82%93)」 という漫画・アニメにヒントを得て、  
**高木さんと、LINE でしりとり勝負をするゲーム** を作りました。
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341404/afc8a20f-b022-f3b4-e8e6-19f0bdd66687.gif" width="200">
※ [高木さんのアイコンは、SNSでの個人利用が許可されているものを使っています。](https://twitter.com/takagi3_kyun/status/1480860726340505605)

# ライトニングトーク 発表資料
2023年7月13日（木）**「[みんなのPython勉強会#95](https://startpython.connpass.com/event/284967/)」** のLT枠で、本アプリについて紹介をしました。  
要点が5分間にまとまっているので、ぜひご覧ください。  

### 発表時の動画
<iframe width="560" height="400" src="https://www.youtube.com/embed/07VCfTitwlY" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen></iframe>

### スライド資料
（クリックすると新しいタブで開きます）  
[![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341404/34d6c4f5-fda1-f741-ce0b-a5bd6c3248c5.png)](https://speakerdeck.com/hayate_h/tui-sinoline-tui-sitolinegasitai)

# 技術
### 使用している要素技術
- [LINE Messaging API](https://developers.line.biz/ja/services/messaging-api/)
- [Open AI API (GPT4、3.5)](https://openai.com/blog/openai-api)
- [AWS CDK](https://aws.amazon.com/jp/cdk/) (Python / API Gateway, Lambda, DynamoDB, SecretsManger)

### アーキテクチャ図
![Architecture _diagram.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341404/1bed8880-97b0-1caa-1aa6-4a3d33442179.png)

### ソースコード
GitHubにて公開中  （デプロイ方法などは README に記載）

https://github.com/cloud8high/line-gpt

### 特徴 / 工夫
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/341404/d49fbac5-0125-f6cb-e839-135acd99ce7c.png)
LINE から GPT を呼び出す構成は、技術ブログなどで時々見かけます。  
しかし、今回のアプリでは、**以下の点にオリジナリティがある**と考えています。（LT内でも紹介しているものです）

1. **しりとりができる！**
    - 【問題点】GPTは、意外と「しりとり」が得意ではありません。  
        - 言葉になっていない言葉を返したり、既出の言葉を返したり、「ん」で終わる言葉を返したり...します。
    - 【解決策】GPTプロンプトの工夫と、チャット履歴を管理するDBを用意することで、「しりとり」ができるようにしました。
        - 具体的には、しりとりのルールと実例を、`Few-shot Learning` というテクニックを用いて教えこませました。 
2. **キャラクターらしいチャットができる！**
    - 【問題点】GPTは高木さんのキャラクターを熟知しているわけではないので、「高木さんを演じてください」と言ってもできません。
    - 【解決策】プロンプトを工夫することで、高木さんらしいチャットができるように育て上げました。
        - 前述の `Few-shot Learning` に加えて、`Role prompting` というテクニックを使いました。
3. **文脈に沿った会話ができる！**
    - 【問題点】実はGPTのAPIはセッションを持たず、チャットの履歴をAPI側で持ってくれません。
        - そのため、しりとりなのに既出の単語を回答したり、チャットごとに話がコロコロ変わるという問題が起こりえます。
    - 【解決策】AWS 上にチャット履歴を管理する DB を用意しました。
        - 過去のチャット内容を DB に保存しておき、GPT API を呼び出す際には、保存しておいた過去のチャット文を API リクエストに添付する工夫をしました。
4. **デプロイしやすく、ランニングコストも安い！**
    - IaC（インフラのコード化）の採用
        - [AWS CDK](https://aws.amazon.com/jp/cdk/) を用いて、AWSリソースをソースコードとして定義しました。
        - これにより、ミスなく簡単にシステムをデプロイできるようになりました。
    - サーバレスサービスの採用
        - AWS Lambda, DynamoDB, API Gateway などのサーバレスサービスを利用し、
        ランニングコストがとても安い構成にすることができました。（おそらく月0～1円程度）

# 参考資料 / お役立ち資料
- GPT API
    - [OpenAI API - Documentation Guides](https://platform.openai.com/docs/guides/gpt/chat-completions-api)
    - [OpenAI API - API reference Create chat completion](https://platform.openai.com/docs/api-reference/chat/create)
    - [OpenAI cookbook](https://github.com/openai/openai-cookbook/blob/main/examples/How_to_format_inputs_to_ChatGPT_models.ipynb)
- GPT プロンプトエンジニアリング
    - [Prompt Engineering Guide](https://www.promptingguide.ai/jp)
    - [ChatGPTにギルガメッシュ王の人格を与えるには？｜深津 貴之 (fladdict)](https://note.com/fladdict/n/neff2e9d52224)
- AWS CDK
    - [AWS CDK Workshop](https://cdkworkshop.com/ja/)
- LINE Messaging API
    - [Messaging APIの概要 | LINE Developers](https://developers.line.biz/ja/docs/messaging-api/overview/)
    - [AWS Chalice を用いて、翻訳 LINE Bot をサーバレスアーキテクチャで作る！](https://github.com/cloud8high/linebot-translation-chalice)