「Mistral Small 3.1」登場!GPT-4oを超えた?128kトークン長文処理&マルチモーダル対応のLLMを徹底検証

Mistral Small 3.1 128kトークン長文処理 マルチモーダル対応 LLM
押さえておきたいポイント
  • 最大128kトークンの長文処理が可能
  • マルチモーダル対応
  • 多言語能力が向上しており、高性能&高速度処理が可能

2025年3月18日、Mistral AIから新たなLLMがリリース!

今回リリースされた「Mistral Small 3.1 24B Instruct 2503」はMistral Small 3をベースにチューニングされた指示対応型のモデルです。

Mistral Small 3.1 24B Instruct 2503は、Mistral Small 3のテキスト性能を維持したまま、視覚理解能力・最大128kトークンまでの長文コンテキスト処理能力が追加されています。2025年3月にGoogleからリリースされたばかりのGemma 3の性能も上回っています。

本記事ではMistral Small 3.1 24B Instruct 2503の概要から使い方についてお伝えをします。本記事を最後まで読むことでMistral Small 3.1 24B Instruct 2503の理解が深まります。

ぜひ最後までお読みください!

目次

Mistral Small 3.1 24B Instruct 2503の概要

Mistral Small 3.1 24B Instruct 2503はMistral AIが新たにリリースしたLLMで、Mistral Small 3をベースに開発されました。性能はGemma 3やGPT-4oよりも優れていると発表されました。

GPQA-Diamondにおける性能とレイテンシーを見てみると、確かにMistral Small 3.1は性能が高そうです。

横軸が1トークンを生成するのにかかる時間であるレイテンシーで、縦軸がベンチマークスコアで高いほど性能が良くなります。つまりMistral Small 3.1は高性能かつ高速であるということがわかります。ちなみにMistral Small 3.1は1秒間に150トークンの推論速度。

参考:https://mistral.ai/news/mistral-small-3-1

また、Mistral Small 3のテキスト性能を維持しつつ、最大128kトークンの長文処理を実現、さらに視覚理解も新たに追加されました。

参考:https://huggingface.co/mistralai/Mistral-Small-3.1-24B-Instruct-2503

RULER 128Kは128kトークンの超長文処理能力を評価するベンチマークですが、Mistral Small 3.1 24B Instruct 2503はCluade 3.5 Haikuに劣りますが、それ以外のモデルと比べ優れていることがわかります。

またMistral Small 3.1 24B Instruct 2503はローカル環境での実行が可能であり、量子化することで単一のRTX4090や32GB RAMのMacBookで使用することも可能。

Mistral Small 3.1 24B Instruct 2503の特徴

Mistral Small 3.1 24B Instruct 2503のパラメータ数は240億パラメータで、ローカル環境での実行が可能です。

そのため、機密データを扱う企業や研究機関、企業向けのオンプレミス環境に適しています。

対応言語は24言語で、日本語や英語のほかに、フランス語、ドイツ語、中国語などに対応。さらに、テキストだけではなく、画像の解析も可能になったことで、マルチモーダル対応により、視覚情報を活用した推論ができるようになりました。

また、Function Callingに対応しており、APIリクエストの構築やデータベースのクエリ実行、外部プログラムやスクリプトの実行が可能です。

Mistral Small 3.1 24B Instruct 2503の性能

ここではMistral Small 3.1 24B Instruct 2503の性能について、ベンチマークをもとにお伝えします。

まずはテキスト指示タスクのベンチマークです。

参考:https://mistral.ai/news/mistral-small-3-1

ベンチマークは次の7つです。

  • SimpleQA:簡単な質問応答
  • GPQA Main:一般知識に関する質問応答
  • GPQA Diamond:難易度の高い一般知識の質問応答
  • MMLU:一般知識の理解
  • MMLU Pro:より高度な知識理解
  • HumanEval:プログラミングタスク
  • MATH:数学の推論力

SimpleQA、GPQA Main、GPQA Diamondに関しては比較しているLLMの中では、Mistral Small 3.1 24B Instruct 2503が最も良い性能を示しています。

次に下段のベンチマークですが、Mistral Small 3.1 24B Instruct 2503HumanEvalにおいて最も良い性能を示しました。

Claude 3.7やGemini 2.0 Proなどと比較したときのMistral Small 3.1 24B Instruct 2503の性能が気になったので、Chatbot Arenaを確認してみましたが、まだMistral Small 3.1 24B Instruct 2503は掲載されていませんでした。

Chatbot Arenaの最終アップデートが2025/03/16になっているので、数日したらMistral Small 3.1 24B Instruct 2503も掲載されるようになるかもしれませんね。

参考:https://huggingface.co/spaces/lmarena-ai/chatbot-arena-leaderboard

次に多言語性能についてです。

参考:https://mistral.ai/news/mistral-small-3-1

アベレージでMistral Small 3.1 24B Instruct 2503はトップの多言語性能を持っていますが、中東言語に関してはやや性能が落ちます。東アジアの言語でトップ性能を持っていることから、日本語の性能も高いと考えられます

最後に長文処理の性能をグラフで比較します。

参考:https://mistral.ai/news/mistral-small-3-1

RULER 128kではMistral Small 3.1 24B Instruct 2503の性能は若干落ちますが、長文理解のベンチマークであるLongBench v2と32kトークンの長文処理のベンチマークでは最も優れた性能を発揮しています。

この結果からMistral Small 3.1 24B Instruct 2503は長文処理自体は全体的に精度高く処理可能であり、128kトークンの長文処理も安定した性能を発揮できると言えます。

Mistral Small 3.1 24B Instruct 2503のライセンス

Mistral Small 3.1 24B Instruct 2503のライセンスはApacheライセンス2.0です。

そのため、基本的には改変や再配布、商用利用が可能です。ただし、再配布時には元の著作権表示やライセンスの通知を行う必要があります。

利用用途可否
商用利用⭕️
改変⭕️
配布⭕️
特許使用⭕️
私的使用⭕️

なお、マイクロソフトのマルチモーダルモデルであるPhi-4-multimodalについて詳しく知りたい方は、下記の記事を合わせてご確認ください。

Mistral Small 3.1 24B Instruct 2503の使い方

Mistral Small 3.1 24B Instruct 2503はHugging Faceで提供されていますが、提供されているコードを使ってgoogle colaboratoryで実装すると、うまく実行ができないのでAPIを使って実装していきます。

なお、今後数週間でNVIDIA NMとMicrosoft Azure AI Foundryでも使えるようになります。

APIでのモデル名はMistral Smallになっていますが、バージョンは25.03、Descriptionには2025年3月にリリースされたモデルと書かれていて、こちらのブログポストがリンク先になっていますので、Mistral Small 3.1 24B Instruct 2503だと考えられます。

参考:https://docs.mistral.ai/getting-started/models/models_overview/

APIを使ってgoogle colaboratoryで実装します。

まずはMistralaiをインストールします。

!pip install mistralai
サンプルコードはこちら
import os
from mistralai import Mistral

api_key = "Your API Key"
model = "mistral-large-latest"

client = Mistral(api_key=api_key)

chat_response = client.chat.complete(
    model= model,
    messages = [
        {
            "role": "user",
            "content": "What is the best French cheese?",
        },
    ]
)
print(chat_response.choices[0].message.content)
結果はこちら
Choosing the "best" French cheese can be subjective and depends on personal taste, as France offers a wide variety of exceptional cheeses. However, some French cheeses are world-renowned for their unique flavors and qualities. Here are a few notable ones:

1. **Brie de Meaux**: Often referred to as the "King of Cheeses," Brie de Meaux is a soft cheese with a rich, creamy interior and a bloomy rind. It's known for its delicate, slightly nutty flavor.

2. **Camembert de Normandie**: Another soft cheese, Camembert is famous for its creamy texture and distinctive, slightly pungent aroma. It's a classic choice for cheese lovers.

3. **Roquefort**: This is a strong, blue-veined cheese made from sheep's milk. It has a rich, tangy flavor and a creamy texture that is beloved by many.

4. **Comté**: A hard cheese made from unpasteurized cow's milk, Comté has a complex flavor profile that includes notes of nuts, fruit, and spices. It's a versatile cheese that can be enjoyed on its own or in various dishes.

5. **Reblochon**: This is a soft, washed-rind and smear-ripened cheese from the Alps. It has a mild, nutty flavor and a creamy texture, making it perfect for melting.

6. **Époisses**: Known for its strong aroma and flavor, Époisses is a washed-rind cheese that is often enjoyed with a strong wine or beer. It's not for the faint-hearted but is highly regarded by cheese connoisseurs.

7. **Munster**: This is a strong-tasting, soft cheese with a washed rind. It's known for its pungent aroma and rich, creamy flavor.

Ultimately, the "best" French cheese is a matter of personal preference, and the variety of options means there's something for everyone to enjoy.

Mistral Small 3.1 24B Instruct 2503の長文処理とプログラミング能力を検証

Mistral Small 3.1 24B Instruct 2503は長文処理とプログラミング能力が高性能なため、この二つをGoogleのGemini 2.0 Proと比較してみたいと思います。

長文処理としては、青空文庫から書籍の内容を一部コピペして、内容をどれくらい理解しているのか、プログラミングスキルとしては、データ解析用のダッシュボードを作ってもらいます。

長文処理タスク

長文処理タスクで使うのは、芥川龍之介の羅生門です。こちらの内容をコピペして読み込ませ、内容について聞きます。

サンプルコードはこちら
import os
from mistralai import Mistral

api_key = ""
model = "mistral-large-latest"

rasoumon_text = """ある日の暮方の事である。一人の下人げにんが、羅生門らしょうもんの下で雨やみを待っていた。
 広い門の下には、この男のほかに誰もいない。ただ、所々丹塗にぬりの剥はげた、大きな円柱まるばしらに、蟋蟀きりぎりすが一匹とまっている。羅生門が、朱雀大路すざくおおじにある以上は、この男のほかにも、雨やみをする市女笠いちめがさや揉烏帽子もみえぼしが、もう二三人はありそうなものである。それが、この男のほかには誰もいない。
 何故かと云うと、この二三年、京都には、地震とか辻風つじかぜとか火事とか饑饉とか云う災わざわいがつづいて起った。そこで洛中らくちゅうのさびれ方は一通りではない。旧記によると、仏像や仏具を打砕いて、その丹にがついたり、金銀の箔はくがついたりした木を、路ばたにつみ重ねて、薪たきぎの料しろに売っていたと云う事である。洛中がその始末であるから、羅生門の修理などは、元より誰も捨てて顧る者がなかった。するとその荒れ果てたのをよい事にして、狐狸こりが棲すむ。盗人ぬすびとが棲む。とうとうしまいには、引取り手のない死人を、この門へ持って来て、棄てて行くと云う習慣さえ出来た。そこで、日の目が見えなくなると、誰でも気味を悪るがって、この門の近所へは足ぶみをしない事になってしまったのである。
 その代りまた鴉からすがどこからか、たくさん集って来た。昼間見ると、その鴉が何羽となく輪を描いて、高い鴟尾しびのまわりを啼きながら、飛びまわっている。ことに門の上の空が、夕焼けであかくなる時には、それが胡麻ごまをまいたようにはっきり見えた。鴉は、勿論、門の上にある死人の肉を、啄ついばみに来るのである。――もっとも今日は、刻限こくげんが遅いせいか、一羽も見えない。ただ、所々、崩れかかった、そうしてその崩れ目に長い草のはえた石段の上に、鴉の糞ふんが、点々と白くこびりついているのが見える。下人は七段ある石段の一番上の段に、洗いざらした紺の襖あおの尻を据えて、右の頬に出来た、大きな面皰にきびを気にしながら、ぼんやり、雨のふるのを眺めていた。
 作者はさっき、「下人が雨やみを待っていた」と書いた。しかし、下人は雨がやんでも、格別どうしようと云う当てはない。ふだんなら、勿論、主人の家へ帰る可き筈である。所がその主人からは、四五日前に暇を出された。前にも書いたように、当時京都の町は一通りならず衰微すいびしていた。今この下人が、永年、使われていた主人から、暇を出されたのも、実はこの衰微の小さな余波にほかならない。だから「下人が雨やみを待っていた」と云うよりも「雨にふりこめられた下人が、行き所がなくて、途方にくれていた」と云う方が、適当である。その上、今日の空模様も少からず、この平安朝の下人の Sentimentalisme に影響した。申さるの刻こく下さがりからふり出した雨は、いまだに上るけしきがない。そこで、下人は、何をおいても差当り明日あすの暮しをどうにかしようとして――云わばどうにもならない事を、どうにかしようとして、とりとめもない考えをたどりながら、さっきから朱雀大路にふる雨の音を、聞くともなく聞いていたのである。
 雨は、羅生門をつつんで、遠くから、ざあっと云う音をあつめて来る。夕闇は次第に空を低くして、見上げると、門の屋根が、斜につき出した甍いらかの先に、重たくうす暗い雲を支えている。
 どうにもならない事を、どうにかするためには、手段を選んでいる遑いとまはない。選んでいれば、築土ついじの下か、道ばたの土の上で、饑死うえじにをするばかりである。そうして、この門の上へ持って来て、犬のように棄てられてしまうばかりである。選ばないとすれば――下人の考えは、何度も同じ道を低徊ていかいした揚句あげくに、やっとこの局所へ逢着ほうちゃくした。しかしこの「すれば」は、いつまでたっても、結局「すれば」であった。下人は、手段を選ばないという事を肯定しながらも、この「すれば」のかたをつけるために、当然、その後に来る可き「盗人ぬすびとになるよりほかに仕方がない」と云う事を、積極的に肯定するだけの、勇気が出ずにいたのである。
 下人は、大きな嚔くさめをして、それから、大儀たいぎそうに立上った。夕冷えのする京都は、もう火桶ひおけが欲しいほどの寒さである。風は門の柱と柱との間を、夕闇と共に遠慮なく、吹きぬける。丹塗にぬりの柱にとまっていた蟋蟀きりぎりすも、もうどこかへ行ってしまった。
 下人は、頸くびをちぢめながら、山吹やまぶきの汗袗かざみに重ねた、紺の襖あおの肩を高くして門のまわりを見まわした。雨風の患うれえのない、人目にかかる惧おそれのない、一晩楽にねられそうな所があれば、そこでともかくも、夜を明かそうと思ったからである。すると、幸い門の上の楼へ上る、幅の広い、これも丹を塗った梯子はしごが眼についた。上なら、人がいたにしても、どうせ死人ばかりである。下人はそこで、腰にさげた聖柄ひじりづかの太刀たちが鞘走さやばしらないように気をつけながら、藁草履わらぞうりをはいた足を、その梯子の一番下の段へふみかけた。
 それから、何分かの後である。羅生門の楼の上へ出る、幅の広い梯子の中段に、一人の男が、猫のように身をちぢめて、息を殺しながら、上の容子ようすを窺っていた。楼の上からさす火の光が、かすかに、その男の右の頬をぬらしている。短い鬚の中に、赤く膿うみを持った面皰にきびのある頬である。下人は、始めから、この上にいる者は、死人ばかりだと高を括くくっていた。それが、梯子を二三段上って見ると、上では誰か火をとぼして、しかもその火をそこここと動かしているらしい。これは、その濁った、黄いろい光が、隅々に蜘蛛くもの巣をかけた天井裏に、揺れながら映ったので、すぐにそれと知れたのである。この雨の夜に、この羅生門の上で、火をともしているからは、どうせただの者ではない。
 下人は、守宮やもりのように足音をぬすんで、やっと急な梯子を、一番上の段まで這うようにして上りつめた。そうして体を出来るだけ、平たいらにしながら、頸を出来るだけ、前へ出して、恐る恐る、楼の内を覗のぞいて見た。
 見ると、楼の内には、噂に聞いた通り、幾つかの死骸しがいが、無造作に棄ててあるが、火の光の及ぶ範囲が、思ったより狭いので、数は幾つともわからない。ただ、おぼろげながら、知れるのは、その中に裸の死骸と、着物を着た死骸とがあるという事である。勿論、中には女も男もまじっているらしい。そうして、その死骸は皆、それが、かつて、生きていた人間だと云う事実さえ疑われるほど、土を捏こねて造った人形のように、口を開あいたり手を延ばしたりして、ごろごろ床の上にころがっていた。しかも、肩とか胸とかの高くなっている部分に、ぼんやりした火の光をうけて、低くなっている部分の影を一層暗くしながら、永久に唖おしの如く黙っていた。
 下人げにんは、それらの死骸の腐爛ふらんした臭気に思わず、鼻を掩おおった。しかし、その手は、次の瞬間には、もう鼻を掩う事を忘れていた。ある強い感情が、ほとんどことごとくこの男の嗅覚を奪ってしまったからだ。
 下人の眼は、その時、はじめてその死骸の中に蹲うずくまっている人間を見た。檜皮色ひわだいろの着物を着た、背の低い、痩やせた、白髪頭しらがあたまの、猿のような老婆である。その老婆は、右の手に火をともした松の木片きぎれを持って、その死骸の一つの顔を覗きこむように眺めていた。髪の毛の長い所を見ると、多分女の死骸であろう。
 下人は、六分の恐怖と四分の好奇心とに動かされて、暫時ざんじは呼吸いきをするのさえ忘れていた。旧記の記者の語を借りれば、「頭身とうしんの毛も太る」ように感じたのである。すると老婆は、松の木片を、床板の間に挿して、それから、今まで眺めていた死骸の首に両手をかけると、丁度、猿の親が猿の子の虱しらみをとるように、その長い髪の毛を一本ずつ抜きはじめた。髪は手に従って抜けるらしい。
 その髪の毛が、一本ずつ抜けるのに従って、下人の心からは、恐怖が少しずつ消えて行った。そうして、それと同時に、この老婆に対するはげしい憎悪が、少しずつ動いて来た。――いや、この老婆に対すると云っては、語弊ごへいがあるかも知れない。むしろ、あらゆる悪に対する反感が、一分毎に強さを増して来たのである。この時、誰かがこの下人に、さっき門の下でこの男が考えていた、饑死うえじにをするか盗人ぬすびとになるかと云う問題を、改めて持出したら、恐らく下人は、何の未練もなく、饑死を選んだ事であろう。それほど、この男の悪を憎む心は、老婆の床に挿した松の木片きぎれのように、勢いよく燃え上り出していたのである。
 下人には、勿論、何故老婆が死人の髪の毛を抜くかわからなかった。従って、合理的には、それを善悪のいずれに片づけてよいか知らなかった。しかし下人にとっては、この雨の夜に、この羅生門の上で、死人の髪の毛を抜くと云う事が、それだけで既に許すべからざる悪であった。勿論、下人は、さっきまで自分が、盗人になる気でいた事なぞは、とうに忘れていたのである。
 そこで、下人は、両足に力を入れて、いきなり、梯子から上へ飛び上った。そうして聖柄ひじりづかの太刀に手をかけながら、大股に老婆の前へ歩みよった。老婆が驚いたのは云うまでもない。
 老婆は、一目下人を見ると、まるで弩いしゆみにでも弾はじかれたように、飛び上った。
「おのれ、どこへ行く。」
 下人は、老婆が死骸につまずきながら、慌てふためいて逃げようとする行手を塞ふさいで、こう罵ののしった。老婆は、それでも下人をつきのけて行こうとする。下人はまた、それを行かすまいとして、押しもどす。二人は死骸の中で、しばらく、無言のまま、つかみ合った。しかし勝敗は、はじめからわかっている。下人はとうとう、老婆の腕をつかんで、無理にそこへ※(「てへん+丑」、第4水準2-12-93)ねじ倒した。丁度、鶏にわとりの脚のような、骨と皮ばかりの腕である。
「何をしていた。云え。云わぬと、これだぞよ。」
 下人は、老婆をつき放すと、いきなり、太刀の鞘さやを払って、白い鋼はがねの色をその眼の前へつきつけた。けれども、老婆は黙っている。両手をわなわなふるわせて、肩で息を切りながら、眼を、眼球めだまが※(「目+匡」、第3水準1-88-81)まぶたの外へ出そうになるほど、見開いて、唖のように執拗しゅうねく黙っている。これを見ると、下人は始めて明白にこの老婆の生死が、全然、自分の意志に支配されていると云う事を意識した。そうしてこの意識は、今までけわしく燃えていた憎悪の心を、いつの間にか冷ましてしまった。後あとに残ったのは、ただ、ある仕事をして、それが円満に成就した時の、安らかな得意と満足とがあるばかりである。そこで、下人は、老婆を見下しながら、少し声を柔らげてこう云った。
「己おれは検非違使けびいしの庁の役人などではない。今し方この門の下を通りかかった旅の者だ。だからお前に縄なわをかけて、どうしようと云うような事はない。ただ、今時分この門の上で、何をして居たのだか、それを己に話しさえすればいいのだ。」
 すると、老婆は、見開いていた眼を、一層大きくして、じっとその下人の顔を見守った。※(「目+匡」、第3水準1-88-81)まぶたの赤くなった、肉食鳥のような、鋭い眼で見たのである。それから、皺で、ほとんど、鼻と一つになった唇を、何か物でも噛んでいるように動かした。細い喉で、尖った喉仏のどぼとけの動いているのが見える。その時、その喉から、鴉からすの啼くような声が、喘あえぎ喘ぎ、下人の耳へ伝わって来た。
「この髪を抜いてな、この髪を抜いてな、鬘かずらにしようと思うたのじゃ。」
 下人は、老婆の答が存外、平凡なのに失望した。そうして失望すると同時に、また前の憎悪が、冷やかな侮蔑ぶべつと一しょに、心の中へはいって来た。すると、その気色けしきが、先方へも通じたのであろう。老婆は、片手に、まだ死骸の頭から奪った長い抜け毛を持ったなり、蟇ひきのつぶやくような声で、口ごもりながら、こんな事を云った。
「成程な、死人しびとの髪の毛を抜くと云う事は、何ぼう悪い事かも知れぬ。じゃが、ここにいる死人どもは、皆、そのくらいな事を、されてもいい人間ばかりだぞよ。現在、わしが今、髪を抜いた女などはな、蛇を四寸しすんばかりずつに切って干したのを、干魚ほしうおだと云うて、太刀帯たてわきの陣へ売りに往いんだわ。疫病えやみにかかって死ななんだら、今でも売りに往んでいた事であろ。それもよ、この女の売る干魚は、味がよいと云うて、太刀帯どもが、欠かさず菜料さいりように買っていたそうな。わしは、この女のした事が悪いとは思うていぬ。せねば、饑死をするのじゃて、仕方がなくした事であろ。されば、今また、わしのしていた事も悪い事とは思わぬぞよ。これとてもやはりせねば、饑死をするじゃて、仕方がなくする事じゃわいの。じゃて、その仕方がない事を、よく知っていたこの女は、大方わしのする事も大目に見てくれるであろ。」
 老婆は、大体こんな意味の事を云った。
 下人は、太刀を鞘さやにおさめて、その太刀の柄つかを左の手でおさえながら、冷然として、この話を聞いていた。勿論、右の手では、赤く頬に膿を持った大きな面皰にきびを気にしながら、聞いているのである。しかし、これを聞いている中に、下人の心には、ある勇気が生まれて来た。それは、さっき門の下で、この男には欠けていた勇気である。そうして、またさっきこの門の上へ上って、この老婆を捕えた時の勇気とは、全然、反対な方向に動こうとする勇気である。下人は、饑死をするか盗人になるかに、迷わなかったばかりではない。その時のこの男の心もちから云えば、饑死などと云う事は、ほとんど、考える事さえ出来ないほど、意識の外に追い出されていた。
「きっと、そうか。」
 老婆の話が完おわると、下人は嘲あざけるような声で念を押した。そうして、一足前へ出ると、不意に右の手を面皰にきびから離して、老婆の襟上えりがみをつかみながら、噛みつくようにこう云った。
「では、己おれが引剥ひはぎをしようと恨むまいな。己もそうしなければ、饑死をする体なのだ。」
 下人は、すばやく、老婆の着物を剥ぎとった。それから、足にしがみつこうとする老婆を、手荒く死骸の上へ蹴倒した。梯子の口までは、僅に五歩を数えるばかりである。下人は、剥ぎとった檜皮色ひわだいろの着物をわきにかかえて、またたく間に急な梯子を夜の底へかけ下りた。
 しばらく、死んだように倒れていた老婆が、死骸の中から、その裸の体を起したのは、それから間もなくの事である。老婆はつぶやくような、うめくような声を立てながら、まだ燃えている火の光をたよりに、梯子の口まで、這って行った。そうして、そこから、短い白髪しらがを倒さかさまにして、門の下を覗きこんだ。外には、ただ、黒洞々こくとうとうたる夜があるばかりである。
 下人の行方ゆくえは、誰も知らない。"""

client = Mistral(api_key=api_key)

chat_response = client.chat.complete(
    model=model,
    messages=[
        {
            "role": "system",
            "content": "以下は芥川龍之介の短編小説『羅生門』の全文です。この物語の内容に基づいて質問に回答してください。\n\n" + rasoumon_text,
        },
        {
            "role": "user",
            "content": "『羅生門』に登場する下人の心理の変化を、物語の展開に沿って説明してください。",
        },
    ]
)

print(chat_response.choices[0].message.content)
結果はこちら
芥川龍之介の短編小説『羅生門』に登場する下人の心理の変化は、物語の展開に沿って以下のように説明できます。

1. **雨宿りの心理**:
   物語の冒頭、下人は羅生門の下で雨やみを待っています。しかし、彼には行き所がありません。主人から暇を出され、行くあてもない状態で、彼は途方に暮れています。この時点での心理は、不安と焦りでいっぱいです。

2. **絶望と決断**:
   下人は、雨がやむまで待っていたが、雨はやみそうにありません。彼は明日の暮らしをどうにかしなければならないと考え、饑死か盗人になるかの選択を迫られます。この時点での心理は、絶望と苦悩です。

3. **行動への決意**:
   下人は、羅生門の上に上り、人目にかかる惧れのない場所で一晩を過ごそうと決意します。この行動は、彼の心理が行動に移る決断を示しています。

4. **老婆との対峙**:
   下人は、羅生門の上で死骸の髪を抜いている老婆を見つけます。最初は恐怖と好奇心が混ざった感情でしたが、次第に老婆に対する憎悪が強まります。この時点での心理は、悪に対する反感と憎悪です。

5. **憎悪の頂点**:
   下人は老婆を捕らえ、彼女の行動を問いただします。老婆が髪を抜いて鬘を作ろうとしていたことを知り、下人は一時的に安堵しますが、再び憎悪が湧き上がります。

6. **勇気の目覚め**:
   老婆が自分の行動を正当化する言葉を聞いて、下人は自分の行動に対する勇気を取り戻します。この時点での心理は、老婆の言葉に触発された勇気と決意です。

7. **犯罪への突入**:
   下人は老婆の言葉に触発され、自分も引剥ぎをしようと決意し、老婆の着物を剥ぎ取ります。この行動は、彼の心理が犯罪に対する抵抗を乗り越えたことを示しています。

8. **結末**:
   老婆は倒れたまま、下人の行方を見送ります。下人の行方は誰も知らないまま、物語は終わります。この時点での心理は、犯罪に対する決意と行動への決断です。

このように、下人の心理は物語の展開に沿って、絶望から決断、憎悪、勇気、そして最終的には犯罪への決意へと変化しています。
Gemini 2.0 Proの結果はこちら
芥川龍之介の『羅生門』における下人の心理の変化は、物語の展開と密接に結びついており、非常に興味深いものです。以下に、物語の展開に沿って、下人の心理の変化を説明します。

途方に暮れる絶望と無気力:
物語の冒頭、下人は羅生門の下で雨宿りをしながら、途方に暮れています。主人から暇を出され、生活の術を失い、荒廃した京都の状況も相まって、絶望と無気力に支配されています。「どうにもならない事を、どうにかしよう」と考えるものの、具体的な行動に移す気力も、盗人になるという選択肢を受け入れる勇気もありません。

楼上への好奇心と恐怖:
羅生門の楼上に人の気配を感じた下人は、好奇心と恐怖を抱きながら梯子を上ります。死人しかないと思っていた場所に、火を灯す何者かがいることへの不安と、その正体を知りたいという欲求が入り混じった心理状態です。

老婆への嫌悪と正義感:
楼上で老婆が死人の髪の毛を抜いているのを目撃した下人は、強い嫌悪感を抱きます。当初は恐怖心もありましたが、老婆の行為が「悪」であると断じ、正義感にも似た感情を燃え上がらせます。「あらゆる悪に対する反感」は、飢え死によりも盗人になることを選ぼうとしていた下人の倫理観を呼び覚まします。

老婆の告白による動揺と共感の欠如:
老婆を捕らえ、その行為の理由を尋ねた下人は、老婆の「生きるため」という切実な告白を聞きます。しかし、下人は老婆の言葉に共感するどころか、冷笑し、侮蔑します。老婆の論理は理解できても、その行為を正当化することはできませんでした。

「盗人になる」決意と自己正当化:
老婆の「己もそうしなければ、饑死をする体なのだ」という言葉を聞いた下人は、突如として「盗人になる」決意を固めます。老婆の論理を逆手に取り、自分が生きるためには老婆から衣類を奪うことも許されると、自己正当化します。この時、下人の心には、飢え死への恐怖は完全に消え去り、生存本能が倫理観を圧倒しています。

行為後の虚無:
老婆から着物を奪い、羅生門を後にした下人の心には、達成感や満足感はなく、ただ虚無感が残ります。老婆を蹴倒し、闇の中に消えていく下人の姿は、倫理観を捨て去った人間の空虚さを象徴しているようです。

このように、『羅生門』における下人の心理は、絶望から始まり、好奇心、嫌悪、正義感、そして自己正当化による盗みへと、状況の変化に応じて大きく揺れ動きます。最終的に、生きるために悪を選んだ下人の姿は、人間のエゴイズムと、極限状態における倫理観の脆さを浮き彫りにしています。

結果を見ると適切に内容を理解しているように思います。物語の展開を適切に理解し、それに対応した心理も出力できていますね。

Gemini 2.0 Proと比較しても遜色ない回答だと思います。

プログラミングタスク

プログラミングタスクでは、CSVを読み込んでデータ解析を行うダッシュボードを開発してもらいます。与えるプロンプトとしては、次の内容です。

あなたは熟練したPython開発者です。Streamlit を使用してデータ解析ダッシュボードを開発してください。CSVアップロード機能、統計情報の表示、折れ線グラフ・ヒストグラム・散布図の可視化、データフィルタリング機能、フィルタリング後のデータダウンロード機能を含めてください。

サンプルコードはこちら
import os
from mistralai import Mistral

api_key = ""
model = "mistral-large-latest"
client = Mistral(api_key=api_key)

chat_response = client.chat.complete(
    model=model,
    messages=[
        {
            "role": "system",
            "content": "あなたは熟練したPython開発者です。"
                       "Streamlit を使用してデータ解析ダッシュボードを開発してください。"
                       "CSVアップロード機能、統計情報の表示、折れ線グラフ・ヒストグラム・散布図の可視化、"
                       "データフィルタリング機能、フィルタリング後のデータダウンロード機能を含めてください。",
        },
        {
            "role": "user",
            "content": "データ解析ダッシュボードのコードを出力してください。",
        },
    ]
)

print(chat_response.choices[0].message.content)
結果はこちら
Streamlitを使用してデータ解析ダッシュボードを作成するためのコードを以下に示します。このダッシュボードにはCSVアップロード機能、統計情報の表示、折れ線グラフ・ヒストグラム・散布図の可視化、データフィルタリング機能、フィルタリング後のデータダウンロード機能が含まれています。

まず、必要なライブラリをインストールします。StreamlitとPandasが必要です。

```bash
pip install streamlit pandas
```

次に、以下のコードを`app.py`というファイルに保存します。

```python
import streamlit as st
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

# Streamlitのページ設定
st.set_page_config(page_title="データ解析ダッシュボード", layout="wide")

# CSVファイルのアップロード
st.sidebar.header("CSVファイルのアップロード")
uploaded_file = st.sidebar.file_uploader("CSVファイルをアップロードしてください", type=["csv"])

# データフレームの読み込み
if uploaded_file is not None:
    df = pd.read_csv(uploaded_file)
    st.sidebar.success("ファイルが正常にアップロードされました")

    # データの表示
    st.header("データのプレビュー")
    st.write(df.head())

    # 統計情報の表示
    st.header("統計情報")
    st.write(df.describe())

    # データフィルタリング
    st.sidebar.header("データフィルタリング")
    columns = df.columns.tolist()
    selected_columns = st.sidebar.multiselect("列を選択してください", columns)

    if selected_columns:
        filtered_df = df[selected_columns]
        st.write("フィルタリング後のデータ")
        st.write(filtered_df.head())

        # フィルタリング後のデータダウンロード
        csv = filtered_df.to_csv(index=False)
        st.download_button(
            label="フィルタリング後のデータをダウンロード",
            data=csv,
            file_name="filtered_data.csv",
            mime="text/csv",
        )

        # 折れ線グラフ
        st.header("折れ線グラフ")
        if len(selected_columns) == 2:
            st.line_chart(filtered_df)
        else:
            st.write("折れ線グラフを表示するためには2つの列を選択してください")

        # ヒストグラム
        st.header("ヒストグラム")
        for column in selected_columns:
            if df[column].dtype in ['int64', 'float64']:
                fig, ax = plt.subplots()
                sns.histplot(df[column], kde=True, ax=ax)
                st.pyplot(fig)

        # 散布図
        st.header("散布図")
        if len(selected_columns) == 2:
            fig, ax = plt.subplots()
            sns.scatterplot(data=filtered_df, x=selected_columns[0], y=selected_columns[1], ax=ax)
            st.pyplot(fig)
        else:
            st.write("散布図を表示するためには2つの列を選択してください")

else:
    st.sidebar.error("CSVファイルをアップロードしてください")
```

このコードを実行するには、ターミナルで以下のコマンドを実行します。

```bash
streamlit run app.py
```

これで、Streamlitを使用してデータ解析ダッシュボードが起動します。CSVファイルをアップロードし、統計情報を表示し、折れ線グラフ、ヒストグラム、散布図を可視化し、データをフィルタリングしてダウンロードすることができます。

streamlit自体は動きましたが、csvデータを読み込ませるとエラーになってしまいました。一度で全てを完全に実装するのは難しいのかもしれません。

Gemini 2.0 Proの結果はこちら
はい、承知いたしました。熟練したPython開発者として、Streamlitを使用したデータ解析ダッシュボードを開発します。

以下に、ご要望の機能(CSVアップロード、統計情報表示、グラフ可視化、データフィルタリング、フィルタ後データダウンロード)を網羅したStreamlitアプリケーションのコードと詳細な説明を示します。

import streamlit as st
import pandas as pd
import plotly.express as px
import io

# ダッシュボードのタイトルと説明
st.title("データ解析ダッシュボード")
st.write(
    """
    CSVファイルをアップロードして、データの統計情報を確認し、
    様々なグラフで可視化、フィルタリングを行うことができます。
    """
)

# CSVファイルのアップロード
uploaded_file = st.file_uploader("CSVファイルをアップロードしてください", type="csv")

if uploaded_file is not None:
    # アップロードされたCSVファイルをPandas DataFrameとして読み込む
    try:
        df = pd.read_csv(uploaded_file)
    except Exception as e:
        st.error(f"エラーが発生しました: {e}")
        st.stop()

    # 元のデータフレームを保持
    original_df = df.copy()


    # サイドバーでデータフィルタリング
    st.sidebar.header("データフィルタリング")

    # フィルタリング用の辞書
    filters = {}

    for col in df.columns:
        #数値データのときは範囲で指定できるようにする
        if pd.api.types.is_numeric_dtype(df[col]):
            min_val = float(df[col].min())
            max_val = float(df[col].max())
            selected_min, selected_max = st.sidebar.slider(
                f"{col} の範囲を選択",
                min_val,
                max_val,
                (min_val, max_val),  # 初期値は最小値と最大値
                step= (max_val-min_val)/100 if (max_val-min_val)/100 > 0.01 else 0.01 #stepが細かくなりすぎないように調整
            )
            filters[col] = (selected_min, selected_max)
        # カテゴリカルデータの時はマルチセレクト
        else:
            options = df[col].unique().tolist()
            selected_options = st.sidebar.multiselect(
                f"{col} を選択", options, default=options
            )
            filters[col] = selected_options

    # データのフィルタリング
    for col, criteria in filters.items():
        if pd.api.types.is_numeric_dtype(df[col]):
            selected_min, selected_max = criteria
            df = df[(df[col] >= selected_min) & (df[col] <= selected_max)]
        else:
            df = df[df[col].isin(criteria)]

    # フィルタリングされたデータ数の表示
    num_filtered = len(df)
    num_original = len(original_df)
    st.sidebar.write(f"フィルタリング結果: {num_filtered}/{num_original} 件")

     # 統計情報の表示(フィルタリング後)
    st.subheader("統計情報 (フィルタリング後)")
    st.dataframe(df.describe())


    # グラフの可視化
    st.subheader("グラフの可視化")

    # グラフの種類を選択
    chart_type = st.selectbox("グラフの種類を選択", ["折れ線グラフ", "ヒストグラム", "散布図"])

    if chart_type == "折れ線グラフ":
        x_col = st.selectbox("X軸を選択", df.columns)
        y_col = st.selectbox("Y軸を選択", df.columns)
        fig = px.line(df, x=x_col, y=y_col, title=f"{x_col} vs {y_col}")
        st.plotly_chart(fig)

    elif chart_type == "ヒストグラム":
        col = st.selectbox("列を選択", df.columns)
        if pd.api.types.is_numeric_dtype(df[col]):
            fig = px.histogram(df, x=col, title=f"{col} のヒストグラム")
            st.plotly_chart(fig)
        else:
            st.warning("数値データを含む列を選択してください。")

    elif chart_type == "散布図":
        x_col = st.selectbox("X軸を選択", df.columns)
        y_col = st.selectbox("Y軸を選択", df.columns)
        if pd.api.types.is_numeric_dtype(df[x_col]) and pd.api.types.is_numeric_dtype(df[y_col]):
             # カラーで区別するための列を選択(オプション)
            color_col = st.selectbox(
                "色分けに使用する列を選択 (オプション)", ["なし"] + df.columns.tolist()
            )
            if color_col != "なし":
                fig = px.scatter(
                    df, x=x_col, y=y_col, color=color_col, title=f"{x_col} vs {y_col}"
                )
            else:
                fig = px.scatter(df, x=x_col, y=y_col, title=f"{x_col} vs {y_col}")

            st.plotly_chart(fig)
        else:
            st.warning("X軸とY軸には数値データを含む列を選択してください。")

    # フィルタリングされたデータのダウンロード
    st.subheader("フィルタリングされたデータのダウンロード")

    # CSVとしてダウンロード
    csv_buffer = io.StringIO()
    df.to_csv(csv_buffer, index=False)
    st.download_button(
    label="CSVとしてダウンロード",
    data=csv_buffer.getvalue(),
    file_name="filtered_data.csv",
    mime="text/csv",
    )

    #Excelとしてダウンロード
    excel_buffer = io.BytesIO()
    with pd.ExcelWriter(excel_buffer, engine='xlsxwriter') as writer:
        df.to_excel(writer, sheet_name='Sheet1', index=False)
    st.download_button(
        label="Excelとしてダウンロード",
        data=excel_buffer,
        file_name="filtered_data.xlsx",
        mime="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet",
    )


コードの解説:

ライブラリのインポート:

streamlit: Streamlitのメインライブラリ。

pandas: データ操作と分析のためのライブラリ。

plotly.express: 対話的なグラフを作成するためのライブラリ。

io: インメモリのデータストリームを扱うためのライブラリ(CSVダウンロードに使用)。

タイトルと説明:

st.title(): ダッシュボードのタイトルを設定。

st.write(): ダッシュボードの説明文を表示。

CSVファイルアップロード:

st.file_uploader(): ファイルアップロード用のウィジェットを作成。type="csv" でCSVファイルのみを許可。

アップロードされたファイルは、uploaded_file 変数に格納される。

try-exceptブロックで、CSVファイルの読み込みエラーを処理。

original_df に、フィルタリング前の状態を保持します。

データフィルタリング (サイドバー):

st.sidebar.header(): サイドバーにヘッダーを表示。

数値データ列の場合:

st.sidebar.slider(): 範囲スライダーを作成。

min()とmax()で元のデータの最小値と最大値を取得し、スライダーの範囲を設定。

選択された範囲は、filters 辞書に保存。

stepが細かくなりすぎないように調整

カテゴリカルデータ列の場合:

st.sidebar.multiselect(): 複数選択ウィジェットを作成。

unique() でユニークな値のリストを取得し、選択肢として表示。

選択された値は、filters 辞書に保存。

フィルタリング実行:

filters 辞書をループして、各列に対してフィルタリングを適用。

数値データは範囲でフィルタリング。

カテゴリカルデータは選択された値でフィルタリング。

フィルタリングされたデータ数を表示

統計情報表示:

st.subheader(): サブヘッダーを表示。

st.dataframe(df.describe()): フィルタリング 後 のDataFrameの統計情報(平均、標準偏差など)を表示。

グラフ可視化:

st.selectbox(): グラフの種類(折れ線グラフ、ヒストグラム、散布図)を選択するドロップダウンを作成。

選択されたグラフの種類に応じて、必要な列を選択するウィジェットを表示。

plotly.express を使ってグラフを作成:

折れ線グラフ: px.line()

ヒストグラム: px.histogram()

散布図: px.scatter()

st.plotly_chart(): PlotlyグラフをStreamlitアプリに表示。

数値データとカテゴリカルデータのチェックを行い、不適切な場合は警告を表示。

散布図には、オプションとして、カラーで区別するための列を選択できるようにしました。

フィルタリングされたデータのダウンロード:

st.subheader(): サブヘッダーを表示。

CSVダウンロード:

io.StringIO(): インメモリの文字列バッファを作成。

df.to_csv(csv_buffer, index=False): DataFrameをCSV形式でバッファに書き込み。

st.download_button(): ダウンロードボタンを作成。

Excelダウンロード
* io.BytesIO(): インメモリのバイトバッファを作成
* ExcelWriterとto_excelを使ってバッファに書き込み
* st.download_button(): ダウンロードボタンを作成

使い方:

環境構築:

Python (3.7以上推奨) がインストールされていることを確認。

必要なライブラリをインストール:

pip install streamlit pandas plotly
pip install openpyxl
pip install xlsxwriter
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
Bash
IGNORE_WHEN_COPYING_END

スクリプト実行:

上記のコードを .py ファイル (例: dashboard.py) に保存。

ターミナル/コマンドプロンプトで、ファイルがあるディレクトリに移動し、以下のコマンドを実行:

streamlit run dashboard.py
IGNORE_WHEN_COPYING_START
content_copy
download
Use code with caution.
Bash
IGNORE_WHEN_COPYING_END

ブラウザでアクセス:

自動的にブラウザが開いて、ダッシュボードが表示されます。

表示されない場合は、ターミナルに表示されるURLにアクセスしてください。

CSVアップロード

CSVファイルをアップロードしてくださいからファイルを選択.

データ解析

表示された統計情報やグラフを確認

サイドバーでデータをインタラクティブにフィルタリング

データダウンロード
CSVとしてダウンロード、またはExcelとしてダウンロードを選択.

改良点と追加機能のアイデア:

データクリーニング機能: 欠損値処理、外れ値処理、データ型変換などのオプションを追加。

グラフのカスタマイズ: 軸ラベル、タイトル、凡例などの編集機能。

複数グラフの同時表示: ダッシュボードのレイアウトを改善し、複数のグラフを並べて比較できるようにする。

機械学習モデルの統合: 予測モデルを組み込み、予測結果を表示する。

ダッシュボードの共有: Streamlit Sharing や Heroku などを使って、ダッシュボードをオンラインで公開する。

より詳細な統計:四分位範囲、歪度、尖度なども表示に追加する。

相関行列: 変数間の相関をヒートマップで可視化する。

このダッシュボードは、基本的なデータ解析のニーズを満たすように設計されています。必要に応じて、さらに機能を追加・改良して、より高度な分析に対応できるように拡張してください。

[Gemini結果動画]

こちらは一部動きますが、やはりエラーになってしまいました。プログラミング性能はもしかしたら一部実装できたGemini 2.0 Proの方が上かもしれません。Gemini 2.0 ProもMistral Small 3.1両方に言えることですが、トライアンドエラーを繰り返しながらコーディングは進めていくのが良いのかもしれません。

また、Gemini 2.0 Proではコードの解説を指示を与えなくとも出力してくれるので、コーディング内容の理解を深めたい場合には、非常に使い勝手の良いLLMだと思います。仮にMistral Small 3.1が完全に動くコードを出力できていたとしても、個人的にはコードの解説もしてくれるGemini 2.0 Proを好んで使うと思います。

なお、Claude 3.7 Sonnetについて詳しく知りたい方は、下記の記事を合わせてご確認ください。

まとめ

本記事ではMistral Small 3.1 24B Instruct 2503の概要から性能、google colaboratoryでの使い方について解説をしました。長文処理や多言語性能が高いため、Mistral Small 3.1 24B Instruct 2503を使ってリアルタイム翻訳や多言語対応のカスタマーサポートのチャット対応などが活用方法として考えられますね。

そのほかにもMistral Small 3.1の高性能かつ高速という点を踏まえると、RAGの生成モデルとしての活用も考えられます。特に母国語以外の論文を読む上でMistral Small 3.1の多言語性能・長文処理性が発揮されます。

また、高速処理が可能なので、チャットボットに組み込めば自社専用のRAGを構築することができますね。

本記事を参考にぜひMistral Small 3.1 24B Instruct 2503を使ってみてください!

最後に

いかがだったでしょうか

Mistral Small 3.1 24B Instruct 2503の高度な長文処理・マルチモーダル対応を活かし、カスタマーサポート・ドキュメント処理・社内ナレッジ活用・マーケティング・開発支援など、貴社の業務を抜本的に効率化するAI活用戦略をご提案します。

株式会社WEELは、自社・業務特化の効果が出るAIプロダクト開発が強みです!

開発実績として、

・新規事業室での「リサーチ」「分析」「事業計画検討」を70%自動化するAIエージェント
・社内お問い合わせの1次回答を自動化するRAG型のチャットボット
・過去事例や最新情報を加味して、10秒で記事のたたき台を作成できるAIプロダクト
・お客様からのメール対応の工数を80%削減したAIメール
・サーバーやAI PCを活用したオンプレでの生成AI活用
・生徒の感情や学習状況を踏まえ、勉強をアシストするAIアシスタント

などの開発実績がございます。

まずは、無料相談にてご相談を承っておりますので、ご興味がある方はぜひご連絡ください。

➡︎生成AIを使った業務効率化、生成AIツールの開発について相談をしてみる。

大規模言語モデル(LLM)比較レポート
LLM比較レポート

「生成AIを社内で活用したい」「生成AIの事業をやっていきたい」という方に向けて、生成AI社内セミナー・勉強会をさせていただいております。

セミナー内容や料金については、ご相談ください。

また、大規模言語モデル(LLM)を対象に、言語理解能力、生成能力、応答速度の各側面について比較・検証した資料も配布しております。この機会にぜひご活用ください。

投稿者

  • 翔平

    総合病院で10年間理学療法士として勤務し、患者のリハビリテーション支援に従事。その後、Pythonを独学で学び、データ分析のスキルを活かしてデータアナリストに転身。 データ分析の知見を活かし、主にテクニカル記事を担当。趣味はキックボクシング。

  • URLをコピーしました!
  • URLをコピーしました!
目次