聖夜にJulius.AI,Microsoft Copilot,LLaVAを使ってみた

# はじめに
縁あってAidemyさんのアドベント・カレンダー2023に参加いたしました。どうぞよろしくお願いします！
ご存じのとおり、昨年2022年の11月にOpenAIより公開されたChatGPTのおかげで、2023年はAI界隈は「生成AI」一色となってしまいました。書店にはあふれんばかりのChatGPT関連本ばかりで、さすがにもう見飽きたわ！と思ってた頃に、まさかのOpenAIの御家騒動勃発で、もやもや感を抱えたままの年末となってしまいました。
とはいえ、日本においては、どれほど生成AIの利用が浸透しているのでしょうか？大騒ぎはしていますが、一般的には認知度低そうですし、どのくらい業務で活用されていくのかはまだ不透明なようにみえます。
ただ、世界的に見ればもうこの流れは止められそうになく、大規模言語モデルや画像生成AIを導入したツール、アプリケーションなどが公開されるようになりました。
今回はそのうち、Julius.AI,Microsoft Copilot,llamafileを少し使ってみましたので、その結果を報告します。なかなか優れものであります。

# Julius.AI
Julius.AIは、Copilotにきいたところ、「強力なAIデータアナリストで、あなたのデータを分析し、可視化するのに役立ちます。データとチャットをして、グラフを作成したり、予測モデルを構築したりすることができます。」だそうです。
JuliusはHP（https://julius.ai/ ） によれば、サンフランシスコにある小さなAIラボとのことです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/c1fd70fd-ee64-4956-7df4-2d6648295d97.png)

データを読込み、チャットしながらグラフを描いてくれます。今のところ、「日本語」が含まれていると、文字化けしてしまいます。英語だけのデータだと問題なく動作します。まずは登録・ログインしてデータをこちらからデータを読込みます。**Add files →　Upload** でcsvファイルなどをアップロードできます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/96deefc7-bbe7-c7ac-042f-d36a4a073d61.png)

今回、データはこちら（[Kaggle:Apartment Prices in Poland](https://www.kaggle.com/datasets/krzysztofjamroz/apartment-prices-in-poland)）のデータを使ってみました。ポーランドのアパートの家賃のデータのようです。
データを読み込むと以下が勝手にはじまり、コードとグラフが生成されます。


**User:** Please go and load the files I've attached to this conversation. Show me a preview. Then, visualize something to help present it.
```
import pandas as pd

# Load the dataset with the correct header
file_path = 'apartments_pl_2023_10.csv'
apartments_df = pd.read_csv(file_path, encoding='utf-8')

# Strip leading/trailing spaces from column names
apartments_df.columns = [c.strip() for c in apartments_df.columns]

# Show the head of the dataframe to confirm the fix
print(apartments_df.head())
```

```
import matplotlib.pyplot as plt
import seaborn as sns

# Set the aesthetic style of the plots
sns.set_style('whitegrid')

# Plotting distributions of some numerical columns
fig, axes = plt.subplots(nrows=2, ncols=2, figsize=(14, 10))

# Distribution of square meters
sns.histplot(apartments_df['squareMeters'], bins=30, ax=axes[0,0], kde=True)
axes[0,0].set_title('Distribution of Square Meters')

# Distribution of rooms
sns.histplot(apartments_df['rooms'], bins=30, ax=axes[0,1], kde=True)
axes[0,1].set_title('Distribution of Rooms')

# Distribution of price
sns.histplot(apartments_df['price'], bins=30, ax=axes[1,0], kde=True)
axes[1,0].set_title('Distribution of Price')

# Distribution of build year
sns.histplot(apartments_df['buildYear'].dropna(), bins=30, ax=axes[1,1], kde=True)
axes[1,1].set_title('Distribution of Build Year')

plt.tight_layout()
plt.show()
```

**Julius:**
The preview of the dataset has been successfully loaded and the header issue has been resolved. I've also created visualizations for the distribution of square meters, rooms, price, and build year of the apartments listed in the dataset.
- The square meters distribution shows a range of apartment sizes, with a concentration in smaller-sized apartments.
- The rooms distribution indicates that most apartments have between 1 to 3 rooms. - The price distribution reveals a wide range of apartment prices, with a peak at the lower end, suggesting that more affordable apartments are common.
- The build year distribution (excluding missing values) displays the years in which the apartments were built, showing variability across different time periods.
Here is the visualization for a better understanding:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/e64d090b-2cb5-cb6a-319f-554f62974bb4.png)

**User:** Give me another visualization to further understand the data.
```
import matplotlib.pyplot as plt
import seaborn as sns

# Set the aesthetic style of the plots
sns.set_style('whitegrid')

# Plotting the relationship between square meters and price
plt.figure(figsize=(10, 6))
sns.scatterplot(x='squareMeters', y='price', hue='rooms', palette='coolwarm', data=apartments_df)
plt.title('Price vs. Square Meters by Number of Rooms')
plt.xlabel('Square Meters')
plt.ylabel('Price (PLN)')
plt.legend(title='Number of Rooms')
plt.show()
```
**Julius:**
Here is a visualization that shows the relationship between the square meters of the apartments and their prices, with the number of rooms indicated by the color:


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/c9af6215-348f-d07f-38f3-8d9b1cabef59.png)

This scatter plot can help in understanding how the size and number of rooms in an apartment relate to its price.

**User:** Give me another visualization to further understand the data.
```
import matplotlib.pyplot as plt
import seaborn as sns

# Set the aesthetic style of the plots
sns.set_style('whitegrid')

# Plotting the relationship between the number of points of interest (POIs) and the price
plt.figure(figsize=(10, 6))
sns.scatterplot(x='poiCount', y='price', hue='city', data=apartments_df)
plt.title('Price vs. Number of Points of Interest by City')
plt.xlabel('Number of Points of Interest')
plt.ylabel('Price (PLN)')
plt.legend(title='City', bbox_to_anchor=(1.05, 1), loc='upper left')
plt.tight_layout()
plt.show()
```
**Julius:**  
Here is a visualization that illustrates the relationship between the number of points of interest (POIs) near the apartments and their prices, differentiated by city:
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/ad2c958f-ae59-9a41-a54c-a9d42d78a783.png)

緯度、経度のデータがふくまれていますので、家賃データを地図にマッピングしてみます。

**User:** please visualize apartment prices on map
としてみましたが、見づらかったのでカラーマップを変えてもう一度。
**User:** please change colormap
```
import geopandas as gpd
import contextily as ctx
from shapely.geometry import Point

# Convert the DataFrame to a GeoDataFrame
gdf = gpd.GeoDataFrame(apartments_df, geometry=gpd.points_from_xy(apartments_df.longitude, apartments_df.latitude))

# Set the coordinate reference system to WGS84
gdf.crs = 'EPSG:4326'

# Convert to Web Mercator for contextily
gdf = gdf.to_crs(epsg=3857)

# Plotting
fig, ax = plt.subplots(figsize=(12, 8))
gdf.plot(ax=ax, column='price', cmap='cool', legend=True, markersize=10, alpha=0.6)

# Add basemap
ctx.add_basemap(ax, source=ctx.providers.CartoDB.Positron)

# Remove axis
ax.set_axis_off()

# Show plot
plt.show()
```
**Julius:**  
Here is the map visualization of apartment prices with a changed colormap:

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/b68b8b3a-0171-f948-faae-bd9431914528.png)

高い家賃のアパートが集中しているところがわかるようになりました。

使ってみるとわかると思いますが、これの恐ろしいところは、生成されたコードにバグがあると自ら修正しだすところです。これはさすがにChatGPTではできません。いったいどんな仕組みになっているのでしょうか？

今回は無料で試せましたが、使いすぎると課金を促されるようです。料金体系はHPでご確認くださいね。

# Copilot
いつの間にやら、Microsoft EdgeでCopilotが使えるようになっていました。
いろいろ使えそうなので、試してみました。

## 準備
Microsoft Edgeで次のようにCopilotを使えるようにする。Edgeの右上のCopilotマークをクリックします。
コレ↓
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/61783b40-b539-1d29-c868-5d878bc23260.png)

こうなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/e7bc8e55-535d-d59c-dd0c-f5e45c2f5d7b.png)

では、はじめます。まずは、Webページの要約のやり方から。

## Webページ要約
以下のように要約したいWebページを開き、**「このページを要約してください」** というようなプロンプトを入力します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/4ab05532-3bd3-047a-c505-c2615bc7c539.png)
（https://machine-learning-made-simple.medium.com/complex-valued-neural-networks-might-be-the-future-of-deep-learning-c51f71f4c835）

これは、最近届いたばかりのMedium（https://medium.com） のブログ記事です。
このようにプロンプトが日本語だと、英語で書かれた内容でも日本語に翻訳してくれます。

要約した全文は次のとおり。

このページは、複素数ニューラルネットワーク（CVNNs）についての記事です。CVNNsは、多くの高影響度の分野でAIの採用を加速させる可能性があります。伝統的な実数ニューラルネットワーク（RVNNs）よりも多くの利点を提供します。要約すると、以下のようになります。
• **CVNNsの特徴：** CVNNsは、位相データに非常に適しており、生の性能、表現力、安定性、汎化性などで優れた結果を示します。CVNNsは、勾配を必要としないニューラルネットワークも構築できます。
• **CVNNsの応用分野：** CVNNsは、信号通信、医療画像や心電図、ディープフェイク検出、工業用音響分析などの分野で最も容易に実装できます。これらの分野では、現在の技術が十分であり、AIをこれらの分野に適応させることが課題となっています。また、CVNNsのハードウェア、AI生成コンテンツの検出、データ圧縮、データ品質分析、高性能計算などの分野でも、専用のR&Dが必要ですが、有望な投資先となります。
• **CVNNsの課題：** CVNNsは、最適化の面での研究不足、単位コストの高さ、実装の複雑さなどによって普及が阻まれています。CVNNsを有効にするには、専用のインフラストラクチャが必要です。また、CVNNsは理解や使用が難しいため、人々がそれらを採用するのをためらう可能性があります。


## PDFファイル要約
PDFファイルをEdgeで開くように設定します。後はWeb要約と同じ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/d2e4a939-eeb2-8a05-68c8-dfbac36ef44a.png)
（https://politics.media.mit.edu/papers/Rahwan.pdf）

こちらは「モラル・マシン実験」という、自動運転におけるトロッコ問題を調べるために世界中のドライバーにアンケート調査を実施したもの。（ちょっと古い調査です）
なんか長そうだったので、**「このペーパーを5ページ分だけ要約してください」** とプロンプトを入力。二段組でも大丈夫そうです！

要約した全文は次のとおり。モラルには地域差があるという結果。

このペーパーは、自動運転車が避けられない事故に直面したときにどのような倫理的な決断をすべきかについて、世界中の何百万人もの人々の意見を集めたオンライン実験「モラルマシン」の結果を報告しています。以下は、このペーパーの要約です。
• **モラルマシンの目的と方法：** 自動運転車の倫理的な決断に関する社会的な期待を測るために、モラルマシンという多言語のオンラインプラットフォームを開発しました。モラルマシンでは、ユーザーは自動運転車が二つの異なる結果に分かれる事故シナリオを見せられ、どちらの結果が好ましいかを選択します。事故シナリオは、9つの要因（人間か動物か、進路を変えるか否か、乗客か歩行者か、多くの命か少ない命か、男性か女性か、若いか老いたか、法に従っているか否か、体格が良いか悪いか、社会的地位が高いか低いか）に基づいて生成されます。このプラットフォームは、233の国や地域から約4000万の意思決定を集めました。
• **世界的な倫理的嗜好の概要：** 共同分散分析を用いて、9つの要因のそれぞれについて平均的な影響を計算しました。その結果、人間を動物よりも優先する、多くの命を少ない命よりも優先する、若い命を老いた命よりも優先するという3つの強い嗜好が見られました。これらの嗜好は、機械倫理の普遍的な原則の構築に貢献できると考えられます。一方、性別や社会的地位に基づく嗜好は、国によって大きく異なり、平等主義的な規範と関連していることが示唆されました。
• **個人差と文化的差異の分析：** モラルマシンに参加した約50万人のユーザーのうち、年齢、教育、性別、収入、政治的・宗教的態度などの人口統計的な調査に回答した人のデータを分析しました。その結果、これらの特徴は倫理的嗜好にほとんど影響を与えないことがわかりました。ただし、性別や宗教性はいくつかの要因に対して小さな効果を持っていました。例えば、男性の回答者は女性を優先する傾向が弱く、宗教的な回答者は人間を優先する傾向が強かったです。また、国の所在地に基づいて、倫理的嗜好のベクトルが均一な3つのクラスター（西洋、東洋、南方）を階層的に識別しました。これらのクラスターは、地理的・文化的な近さに沿っており、文化的・経済的な変数との相関も見られました。例えば、個人主義的な文化や高いGDPの国では、多くの命を優先する嗜好が強く、法に従っている歩行者を優先する嗜好も強かったです。
• **機械倫理への示唆と展望：** 自動運転車の倫理的な決断に関する公的なガイドラインはまだほとんど存在しませんが、その必要性はますます高まっています。モラルマシンは、この問題に対する社会的な意見を収集し、議論を促すための一つの試みです。モラルマシンのデータは、社会的な期待と既存の倫理的な原則との一致や不一致を明らかにし、文化的な多様性や普遍性を探ることができます。しかし、モラルマシンのデータは、自己選択的なサンプルであり、実験的な状況であり、また、自動運転車の倫理的な決断には他にも多くの要素が関係することを念頭に置く必要があります。したがって、モラルマシンのデータは、機械倫理の最終的な答えではなく、社会的な対話の出発点として捉えるべきです。人間の価値観に沿った機械倫理を構築するためには、さらなる研究と協力が必要です。

## YouTube要約
なぜか、YouTube動画の要約では **会話のスタイルを選択** で、**「より厳密に」** を指定する必要があるようです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/8c480582-e8d0-a27c-f72c-1a565c050777.png)

こちらが試してみた動画。Sophia　Yangさんの先日行われたNeurlPS2023の報告です。プロンプトは、**「この動画を要約してください」**　としてみました。

**Deep dive: 4 NeurIPS 2023 best paper award papers - emergent ability, scaling, DPO, trustworthiness**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/4d587217-ba1c-8669-874b-32666136cd5a.png)
（https://www.youtube.com/watch?v=LkED9wKI1TY&t=783s）

**動画の要約 [00:00:00] - [00:20:14]:**
この動画では、ニューラルス2023で受賞した大規模言語モデルに関する4つの論文を紹介しています。それぞれ、大規模言語モデルの緊急能力、データ制約下でのスケーリング、直接優先度最適化、GPTモデルの信頼性についての研究です。
ハイライト:
• **[00:00:34] 大規模言語モデルの緊急能力**
- 大規模言語モデルが小規模モデルにはない能力を示すという主張に疑問を投げかける
- 非線形や不連続な評価指標が緊急能力の錯覚を引き起こすと主張する
- 線形や連続な評価指標を使うと、能力の向上は滑らかで予測可能になると示す

• **[00:04:36] データ制約下でのスケーリング**
- インターネット上のテキストデータの量に制限がある場合にどうするかを検討する
- データを繰り返し使うことで、新しいデータとほぼ同じ効果が得られることを発見する
- 4エポックが繰り返しの最適な回数であることを示す
 
• **[00:08:18] 直接優先度最適化**
- 人間の優先度に基づいて言語モデルを学習するためのシンプルで強化学習フリーなアルゴリズムを提案する
- 報酬モデルを学習するステップをスキップし、言語モデルを優先度データに直接最適化する
- 強化学習よりも安定して高品質な言語モデルを生成できることを示す

• **[00:12:39] GPTモデルの信頼性**
- GPT-4とGPT-3.5を毒性、ステレオタイプバイアス、敵対的頑健性、分布外頑健性、プライバシー、機械倫理、公平性などの観点で信頼性を評価する
- 既存のベンチマークに加えて、新たな評価方法やデータセットを開発する
- GPT-4はGPT-3.5よりも頑健性が高いが、依然として多くの信頼性の問題があることを報告する

最後に、Copilotでは、DALL-E3による画像生成ができる、とのことでしたので、試してみました。

## DALL-E3による画像生成
試したプロンプトは、**「IoTシステムの概念図を描いてください」** です。
こんな感じではじまります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/fe126e4f-2e9e-fbaa-ede0-e94512bb14db.png)

結果がこれ。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/e931c468-a31a-349b-c8a6-882125b3ce93.png)

どうでしょうか？
この画像を使うかどうかは、ちょっと迷うかも。

さて、Edge + Copilotでは、画像認識がどうもできないようです。そこで、ローカル環境から動かすことができるらしいLLaVA(Large Language and Vision Assistant)を試してみました。

# LLaVA
詳しくは、こちらに書かれている通りです。
[わずか4GBの実行ファイル1つで大規模言語モデルによるAIを超お手軽に配布・実行できる仕組み「llamafile」をWindowsとLinuxで簡単に実行してみる方法](https://gigazine.net/news/20231210-llamafile/#google_vignette)
Llamafileとは何か？記事にも書かれていますが、これもCopilotで確認してみました。

Llamafileは、大規模言語モデル（LLM）のモデルの重みとそのモデルを実行するためのコードを含む単一のマルチGBファイルです。これは、一部の場合では、それと対話するためのWeb UIを備えた完全なローカルサーバーとして機能します。
Llamafileは、Mozillaのチームによって公開されています。このファイルは、LLMのモデルの重みとそのモデルを実行するためのコードを含んでおり、これを完全なローカルサーバーとして見ることができます。これは、llama.cpp（先進的なオープンソースのLLMチャットボットフレームワーク）とCosmopolitan Libc（Cプログラムを多くのプラットフォームとアーキテクチャでコンパイルして実行できるようにするオープンソースプロジェクト）に基づいて実装されています。
Llamafileの形式で配布されているモデルはいくつかあり、それぞれのモデルは異なるライセンスで提供されています。例えば、LLaVA 1.5はLLaMA 2ライセンスで提供されています。これらのモデルは、Linux、macOS、Windows、FreeBSD、NetBSD、OpenBSDといった6つのOS上でインストール不要で動作させることが可能です。
詳細については、Llamafileの公式GitHubページをご覧いただくか、直接Mozillaのチームにお問い合わせいただくことをお勧めします。他に何かお手伝いできることがありますか？（ないです。ありがとうございます！）

記事に従って実行しただけなので結果だけ。
![スクリーンショット 2023-12-26 070456.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/483137/026233f3-98c3-c3ca-66de-23a59f9d2da8.png)
少し時間がかかりました。

# おわりに
クリスマスも終わってしまい、もう2023年も終わりです。

突然ですが、クリスマスといえば、マライア・キャリーの"All I want for Christmas is you"がかかりまくる時期になります。この曲は1994年リリースなので来年で30周年です。30年ヒットし続け、下世話ですが、これまでに稼いだ印税は約120億円とか。ちなみにマライアがこの曲をつくったのはたったの15分と言われています。努力と成果は比例しない、という事例ナンバーワンになりそうですが、さてAIが大ヒット曲を飛ばす日は来るのでしょうか？私はやはりマライアというキャラクターあってのヒットのようにみえますけど。

この曲の邦題は「恋人たちのクリスマス」です。原題のイメージとちょっと違うんじゃね？なんて意見もあったので、これはChatGPTにイカした邦題を考えていただきました。結果は次の通りでした。

**「クリスマスに願うのは君だけ」**

では、よいお年をお迎えください。