Jupyter AIが出た！試した！！すごい！！！

2023/10/09更新

Jupyter AIがAmazon Bedrockに対応しましたので早速試しました。Jupyter AI自体も完成度が増している印象です。

https://moritalous.pages.dev/e679e9a105fe3a91d096

---

**来ました！JupyterにAIが来ました！**

https://jupyter-ai.readthedocs.io/en/latest/index.html

:::note
AWSブログでも紹介されています→[こちら](https://aws.amazon.com/jp/blogs/news/announcing-new-jupyter-contributions-by-aws-to-democratize-generative-ai-and-scale-ml-workloads/)
:::

早速使ってみました

## 環境構築

dockerでサクッと行きます。
`jupyter_ai`パッケージがJupyter AIです。OpenAIのAPIが呼ばれるため、`openai`もインストールします。

```dockerfile:Dockerfile
FROM jupyter/minimal-notebook:lab-3.6.3

RUN pip install --no-cache-dir \
  jupyter_ai \
  openai
```

ビルド

```shell:shell
docker build -t jupyter-ai .
```

起動

```shell:shell
docker run -it --rm \
  -p 8888:8888 \
  -e "OPENAI_API_KEY=<OPENAI_API_KEY>" \
  jupyter-ai
```

ターミナルにトークン付きのURLが表示されますので、ブラウザでアクセスします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/7427bda7-a3ac-a598-d3b1-e7d7bc4ca924.png)

起動しました。


## チャットインターフェイス

左パネルにチャットのボタンが追加されています。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/63c35f83-9973-4c49-d474-54807608019a.png)

Welcomeメッセージが表示されます。

![127.0.0.1_8888_lab_workspaces_auto-d(1280x720) (1).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/b90aca5d-9979-eb9b-782b-c08fcb2c0582.png)

language modelとembedding modelを選択します。

![127.0.0.1_8888_lab_workspaces_auto-d(1280x720) (2).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a7e36a01-c80e-e041-7109-4fbc40ff7272.png)

これで準備完了です。
チャットができます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/21b01b47-4997-d3ce-1c67-0d74f4cbf778.png)

**おお！**

### ノートブックについて質問できる

ただチャットができるだけではありません。ノートブックのセルに対して範囲選択をすると、チャットエリアの下部に`Include selection`と`Replace selection`が表示されます。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/6be5d4e7-b5f7-5358-4e6c-dc3efd4fe943.png)

`Include selection`だと選択したコードを含んだ形で質問ができます。

**すっげー！**

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f6ee04cd-ff10-68a8-0b35-3c0ae8e31627.png)


:::note
ログを確認したところ、内部ではLangChainを使ってAPIを叩いているように見えます。

```text
(DefaultActor pid=473) 
(DefaultActor pid=473) 
(DefaultActor pid=473) > Entering new ConversationChain chain...
(DefaultActor pid=473) Prompt after formatting:
(DefaultActor pid=473) System: You are Jupyternaut, a conversational assistant living in JupyterLab to help users.
(DefaultActor pid=473) You are not a language model, but rather an application built on a foundation model from OpenAI called text-ada-001.
(DefaultActor pid=473) You are talkative and provides lots of specific details from its context.
(DefaultActor pid=473) You may use Markdown to format your response.
(DefaultActor pid=473) Code blocks must be formatted in Markdown.
(DefaultActor pid=473) Math should be rendered with inline TeX markup, surrounded by $.
(DefaultActor pid=473) If you do not know the answer to a question, answer truthfully by responding that you do not know.
(DefaultActor pid=473) The following is a friendly conversation between you and a human.
(DefaultActor pid=473) Human: Hello!
(DefaultActor pid=473) AI: 
(DefaultActor pid=473) 
(DefaultActor pid=473) Hi there! How are you?
(DefaultActor pid=473) Human: what does this code do?
(DefaultActor pid=473) 
(DefaultActor pid=473) ```
(DefaultActor pid=473) from diffusers import DiffusionPipeline
(DefaultActor pid=473) 
(DefaultActor pid=473) pipeline = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
(DefaultActor pid=473) pipeline.to("cuda")
(DefaultActor pid=473) pipeline("An image of a squirrel in Picasso style").images[0]
(DefaultActor pid=473) 
(DefaultActor pid=473) ```
(DefaultActor pid=473) AI: 
(DefaultActor pid=473) 
(DefaultActor pid=473) > Finished chain.
```
:::

`Replace selection`にチェックを入れると、選択したコード部分がチャットの回答で上書きされます。ただし、チャットの回答が正しいかはわからないので、チェックしてから更新するほうが良さそうです。（そもそも、コードで返ってこないこともありますし。）

### ローカルデータについて学ぶ

これだけじゃありません。チャットが質問に答える際にローカルデータを含めるようにすることもできます。embedding modelが使用されます。

試しにhuggingface/diffusersのREADMEを埋め込んでみます。

```shell:shell
mkdir docs
cd docs
wget https://raw.githubusercontent.com/huggingface/diffusers/main/README.md
```

準備完了です。

チャット欄に`/learn`コマンドを入力し、覚えさせます。

```
/learn docs/
```

うまく行ったようです。

![127.0.0.1_8888_lab_tree_docs(1280x720).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/a236fada-6665-ca0a-d42c-5e87f286e5df.png)

質問する際は`/ask`コマンドを使用します。

```
/ask "Please tell me how to install Diffusers using pip."
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/d7d72691-e682-fe22-dfeb-f1d351f35e3a.png)

> You can install 🤗 Diffusers in your virtual environment from PyPi using pip (the official package):
`pip install --upgrade diffusers[torch]`

覚えさせたドキュメントでは以下の内容ですので、少し要約されて出ているようです。

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/bb17ee71-3916-b177-5c67-7446d87f250a.png)


## `%%ai`マジックコマンド

Jupyter AIはチャットだけではありません。`%%ai`マジックコマンドも使えます。

* 拡張のロード

```python:notbook cell
%load_ext jupyter_ai_magics
```

これだけです。

### 使えるモデルの一覧を取得

```python:notebook cell
%ai list
```

| Provider           | Environment variable   | Set? | Models                                                                                                                                     |
| ------------------ | ---------------------- | ---- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| ai21               | AI21_API_KEY           | ❌   | ai21:j1-large, ai21:j1-grande, ai21:j1-jumbo, ai21:j1-grande-instruct, ai21:j2-large, ai21:j2-grande, ai21:j2-jumbo, ai21:j2-grande-instruct, ai21:j2-jumbo-instruct |
| anthropic          | ANTHROPIC_API_KEY      | ❌   | anthropic:claude-v1, anthropic:claude-v1.0, anthropic:claude-v1.2, anthropic:claude-instant-v1, anthropic:claude-instant-v1.0                 |
| cohere             | COHERE_API_KEY         | ❌   | cohere:medium, cohere:xlarge                                                                                                               |
| huggingface_hub    | HUGGINGFACEHUB_API_TOKEN | ❌   | This provider does not define a list of models.                                                                                            |
| openai             | OPENAI_API_KEY         | ✅   | openai:text-davinci-003, openai:text-davinci-002, openai:text-curie-001, openai:text-babbage-001, openai:text-ada-001, openai:davinci, openai:curie, openai:babbage, openai:ada |
| openai-chat        | OPENAI_API_KEY         | ✅   | openai-chat:gpt-4, openai-chat:gpt-4-0314, openai-chat:gpt-4-32k, openai-chat:gpt-4-32k-0314, openai-chat:gpt-3.5-turbo, openai-chat:gpt-3.5-turbo-0301 |
| openai-chat-new    | OPENAI_API_KEY         | ✅   | openai-chat-new:gpt-4, openai-chat-new:gpt-4-0314, openai-chat-new:gpt-4-32k, openai-chat-new:gpt-4-32k-0314, openai-chat-new:gpt-3.5-turbo, openai-chat-new:gpt-3.5-turbo-0301 |
| sagemaker-endpoint | Not applicable.        | N/A  | This provider does not define a list of models.                                                                                            |

環境変数にキーをセットした項目が`Set?`が✅になります。

マジックコマンドを使う際に`model ID`を一緒に指定します。

```python:notebook cell
%%ai openai:text-ada-001
Write some JavaScript code that prints "hello world" to the console.
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/32cfe822-ad09-027e-72e5-7d129dc1d29f.png)

**ほー**

デフォルトではMarkdownでの出力となりますが、`-f`または`--format`オプションで書式を指定できます。

```python:notebook cell
%%ai openai:text-ada-001 -f code
Write some Java code that prints "hello world" to the console.
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/3362ed90-61f0-473d-b7cd-5cc3fd605648.png)

**ほーほー**
（あれ？Javaってこんな書き方でしたっけ？？）

### 他のセルの内容を参照する

前のセルのインプットを参照させられます。

```python:notebook cell
%%ai openai:text-davinci-003
Here's a detailed explanation of the following code, simplified for elementary school students:
--
{In[5]}
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/f45f874b-9484-5ee9-fa32-14d00ffca2cb.png)

**おお！**

インプットだけでなくアウトプットも使えます。
更にエラーも使えますので、こんなこともできます。


```python:notebook cell
%%ai openai:text-davinci-003 --format code
The following Python code:
--
{In[14]}
--
produced the following Python error:
--
{Err[14]}
--
Please tell me the cause of the error.
```

![](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41574/34d145c2-cfd2-2cfc-59c3-500044facb47.png)

**うおおおおおおおおおおお！**

すっごい！！

---

まだ新しいプロジェクトなので、少し動かないところはありますが、今後に期待ですね。

---


## 続編書きました

よかったら見てください。

https://moritalous.pages.dev/1a6a2ab01a320908f7d7