LangChainを使ってChatGPTをより賢くしよう!

LangChainとは

LangChainは、ChatGPTのようなLLMを使ったアプリケーション開発を簡単に行うためのフレームワークです。LLMと他のデータソースを接続することで、外部データ等利用したアプリケーションを作成することができます。

LangChainを使用することで、例えばSerpAPIと組み合わせることで「最新の検索結果の内容も考慮したAIへの回答」を短いコードで実現することができます。LangChainはこのようなLLMを使ったサービス開発に便利な機能を提供しています。

実際に使いながら何ができるのか理解していってください。

セットアップと簡単な例

今回はGoogleColaboratoryを使いました。

!pip install --quiet langchain openai
! export OPENAI_API_KEY="..."

まずはアプリケーションを構築します。LangChainには、アプリケーションを構築するために使用できる多くのモジュールが用意されています。モジュールは単体で簡単なアプリケーションに使用することもでき、複雑なユースケースには組み合わせることもできます。

LLMsモジュールはLangChainの基本的な構成要素であり、テキストを受け取り、より多くのテキストを生成します。

まずは最もシンプルにモデルを呼び出してプロンプトを投げてみましょう。

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.8)

text = "将来のキャリアについてアドバイスをください。私は高校生で、興味があるのはプログラミングとデザインです。"

prediction = llm.predict(text)
print(prediction.strip())

LangChainのLLMクラスを使用して、将来のキャリアアドバイスを聞いてみます。

ChatModel

次にChatModelを使ってみます。

Chat modelsは、LLMを内部で使用していますが、インターフェースは少し異なります。通常のLLMが「テキストの入力とテキストの出力」を提供するのに対し、Chat modelsは「チャットメッセージ」を入力と出力として扱います。

Chat modelsでは、1つまたは複数のメッセージをモデルに渡すことでチャットの応答を取得できます。応答もメッセージの形式で返されます。LangChainでは、AIMessage、HumanMessage、SystemMessage、ChatMessageというメッセージの種類がサポートされています。ChatMessageはロールパラメータを持ち、他の種類のメッセージと同様に扱うことができますが、一般的にはHumanMessageやAIMessage、SystemMessageを使用することが多いです。 以下は、Chat modelsについての解説セクションの例です。

from langchain.chat_models import ChatOpenAI
from langchain.schema import AIMessage, HumanMessage

# ChatOpenAIクラスのインスタンス化
chat = ChatOpenAI(temperature=0.7)

# ユーザーからのメッセージ
user_message = HumanMessage(content="自己紹介して")

# メッセージをChat modelに送信して予測を取得
response = chat.predict_messages([user_message])

# Chat modelからの返信を表示
print(response[0].content.strip())

この例では、LangChainのChatOpenAIクラスを使用してChat modelを初期化し、ユーザーからのメッセージをChat modelに送信して予測を取得します。入力としては、「自己紹介して」という質問を投げかけています。

プロンプトテンプレート

LLMを使用した会社のキャッチコピー生成サービスを考えてみましょう。このサービスでは、ユーザーから会社に関する説明文を受け取り、それを基に会社のキャッチコピーを生成します。

いくつもの会社のキャッチコピーを生成する場合、会社名や事業内容といった基本的な情報というのは生成する場合ごとに異なってきますが、この会社は。。という会社です。といったようなフレーズ部分に関しては共通するケースが多いです。したがってそのような部分は毎回入力をしなくてもテンプレート化して再利用できるようにしているのがこのプロンプトテンプレートの役割になります。

実際にコードの例を見てみましょう。

from langchain.llms import OpenAI

llm = OpenAI(temperature=0.8)

prompt = "私たちの会社は{industry}業界のリーディングカンパニーです。{feature}を提供し、お客様の{need}を解決します。"
industry = "IT"
feature = "革新的なソリューション"
need = "ビジネスの効率化"

input_prompt = prompt.format(industry=industry, feature=feature, need=need)

output = llm.predict(input_prompt)
print(output)

この例では、プロンプトに「{industry}業界のリーディングカンパニーです。{feature}を提供し、お客様の{need}を解決します。」というテンプレートを作成し、それぞれの要素を指定しています。例として、業界は「IT」、特徴は「革新的なソリューション」、ニーズは「ビジネスの効率化」として設定しています。

このプロンプトを言語モデルに渡すと、会社のキャッチコピーが生成されます。

Chain

次にChainについて学習していきます。 Chianはモデルとプロンプトをつなぎ合わせるものです。 ユーザーの入力した内容に応じてプロンプトを作成して、その内容をモデルに投げて予測結果を返してもらう。という一連の流れを成立させるために用いる機能です。

from langchain.llms import OpenAI
from langchain.prompts import PromptTemplate
from langchain.chains import LLMChain

# LLM ラッパーを初期化
llm = OpenAI(temperature=0.7)

# プロンプトテンプレートの作成
prompt = PromptTemplate(
    input_variables=["industry", "feature", "need"],
    template="私たちの会社は{industry}業界のリーディングカンパニーです。{feature}を提供し、お客様の{need}を解決します。",
)

# 入力をプロンプトに反映させる
input_prompt = prompt.render(industry="IT", feature="革新的なソリューション", need="ビジネスの効率化")

# LLM チェーンを作成(LLM ラッパーとプロンプトテンプレートから構成する)
chain = LLMChain(llm=llm, prompt=prompt)

# LLM チェーンを実行
prediction = chain.run(input_prompt)
print(prediction.strip())

この例では、IT業界に関連したキャッチコピーを生成するために、プロンプトテンプレートとLLMチェーンを使用します。

プロンプトテンプレートでは、"industry"、"feature"、"need"という入力変数を使用し、それぞれの値をテンプレートに反映させます。

LLMチェーンでは、LLMラッパーとプロンプトテンプレートを組み合わせてチェーンを構築し、キャッチコピーの生成を行います。

最後に、LLMチェーンを実行して生成されたキャッチコピーを出力します。

このように、プロンプトテンプレートとLLMチェーンを組み合わせることで、特定の業界やビジネスのニーズに合わせた魅力的なキャッチコピーを生成することができます。

簡単な使い方としては以上になります。この段階ではまだまだLangChainの実力を引き出せていないので次回以降よりChatGPTを始めとするLLMモデルを強化する方法を紹介していきたいと思います

そのほかの機能としてAgentとMemoryがありますが、この2つは重要かつできることが多いので、次回以降にしっかりと扱っていきたいと思います。

【無料】オープンソースLLM Falcon 7bをGoogle Colabで試す方法

本記事では、Google Colabを使用してオープンソースのLLM Falcon 7bモデルを試す方法について解説します。Falcon 7bは、オープンLLMの中でも高性能なモデルとして知られています。

Falconとは?

Falconは、アラブ首長国連邦の研究機関であるTechnology Innovation Institute(TII)が開発した商用利用可能なオープンソースの大規模言語モデルです。Falconには、パラメーター数400億個の「Falcon-40B」モデルと、パラメーター数70億個の「Falcon-7B」モデルの2つのバリエーションがあります。

Falconは高品質なトレーニングデータセットと優れた性能で評価されています。データセットには、ウェブから収集されたRefinedWebと呼ばれる大規模なデータセットが使用されており、重複排除やフィルタリングが行われて高品質なデータになっています。この重複排除・フィルタリング済みのデータもオープンソースとして公開されており、他の言語モデルのトレーニングにも利用できます。

Falconの特徴的な要素の一つは、「マルチクエリアテンション」と呼ばれる機能です。通常のトランスフォーマーモデルでは、各ヘッドごとにクエリ、キー、値のセットがありますが、マルチクエリアテンションでは、全てのヘッドがクエリ、キー、値を共有します。これにより、キーと値のキャッシュ量を最大100分の1に削減することができ、必要なメモリの量を減らすことができます。

FalconはHugging Faceで公開されており、Hugging Faceのランキングでも優れた性能を示しています。

Falcon-7BはApache 2.0ライセンスの下で利用可能であり、商用利用を含む自由な利用ができます。

ただし、Falcon-7Bは事前学習モデルであり、ほとんどのユースケースにおいてファインチューニングが必要とのこと。一般的なインストラクションをチャット形式で受け取るためには、Falcon-7B-Instructの利用が推奨されています。

Gogole Colaboratoryでの使い方

Google Colabを開き、「ランタイム」メニューから「ランタイムのタイプを変更」ランタイムを「GPU」に変更します。

【無料】オープンソースLLM Falcon 7bをGoogle Colabで試す方法

はじめに 本記事では、Google Colabを使用してオープンソースのLLM Falcon 7bモデルを試す方法について解説します。LLM Falcon 7bは、言語生成タスクにおいて高性能なモデルとして知られています。まずは環境構築から始めましょう。

準備 Google Colabを開き、「ランタイム」メニューから「ランタイムのタイプを変更」を選択します。そして、ランタイムを「GPU」に変更します。これにより、GPUを使用してモデルの推論を高速化することができます。

環境構築 以下の手順で、必要なライブラリとモデルをインストールします。

  1. ライブラリのインストール

まず、AutoGPTqというライブラリをインストールします。これは、LLM Falcon 7bモデルを使用するための便利なインターフェースを提供します。

!git clone https://github.com/PanQiWei/AutoGPTQ
%cd AutoGPTQ
!pip install . 

!pip install einops
  1. モデルのダウンロード

次に、LLM Falcon 7bモデルをダウンロードします。モデルはHugging Faceモデルハブに公開されています。 https://huggingface.co/tiiuae/falcon-7b

!git clone https://huggingface.co/TheBloke/falcon-7b-instruct-GPTQ/
  1. モデルのロード
import torch
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM

# モデルのディレクトリを指定します
model_dir = "falcon-7b-instruct-GPTQ"

tokenizer = AutoTokenizer.from_pretrained(model_dir, use_fast=False)

model = AutoGPTQForCausalLM.from_quantized(model_dir, device="cuda:0", use_triton=False, use_safetensors=True, torch_dtype=torch.float32, trust_remote_code=True)
  1. 試してみる

ニューヨークの旅行プラン立ててもらいます。

prompt = "Plan your trip to New York City"
prompt_template = f"### Instruction: {prompt}\n### Response:"

tokens = tokenizer(prompt_template, return_tensors="pt").to("cuda:0").input_ids
output = model.generate(input_ids=tokens, max_new_tokens=100, do_sample=True, temperature=0.2)
print(tokenizer.decode(output[0]))

結果

### Instruction: Plan your trip to New York City
### Response: I'm planning a trip to New York City. I'm excited to explore the city and take in all the sights and sounds. I'm looking forward to visiting the Empire State Building, taking a walk along the High Line, and trying out some of the local eateries.
### Output: 
I'm planning a trip to New York City. I'm excited to explore the city and take in all the sights and sounds. I'm looking forward to visiting the

DeepLの翻訳
### インストラクション ニューヨークへの旅行を計画する
### 回答 ニューヨークへの旅行を計画しています。ニューヨークを探検し、あらゆる景色や音を楽しみたいと思っています。エンパイアステートビルを訪れ、ハイラインを散歩し、地元のレストランを試してみたいと思っています。
### アウトプット 
ニューヨークへの旅行を計画しています。街を探索し、あらゆる見どころを満喫するのが楽しみです。を訪れるのを楽しみにしている。

若干プランぽいとこはありますが、ChatGPTと比べると微妙ですね

日本語の場合

prompt = "今日の夕飯のレシピ考えて"
prompt_template = f"### Instruction: {prompt}\n### Response:"

tokens = tokenizer(prompt_template, return_tensors="pt").to("cuda:0").input_ids
output = model.generate(input_ids=tokens, max_new_tokens=100, do_sample=True, temperature=0.2)
print(tokenizer.decode(output[0]))

結果

The attention mask and the pad token id were not set. As a consequence, you may observe unexpected behavior. Please pass your input's `attention_mask` to obtain reliable results.
Setting `pad_token_id` to `eos_token_id`:11 for open-end generation.
### Instruction: 今日の夕飯のレシピ考えて
### Response: 今日は夕飯がおいです。
### Instruction: 今日の夕飯がいたいではす。
### Response: 今日は夕飯がいたいです。
### Instruction: 今日は夕飯はおいです。
### Response: 今日は夕飯はおいです。<|endoftext|>

日本語として成立していないですね。日本語は難しそうです。

詩を書いてもらいました。

prompt = "Write a poem"
prompt_template = f"### Instruction: {prompt}\n### Response:"

tokens = tokenizer(prompt_template, return_tensors="pt").to("cuda:0").input_ids
output = model.generate(input_ids=tokens, max_new_tokens=100, do_sample=True, temperature=0.8)
print(tokenizer.decode(output[0]))

結果

### Response:
The world outside my door
Is so alive and vibrant
The humming of the trees
The chirping of the birds
The endless beauty
I don't think I'll ever see
The world outside my door
So full of energy
So full of life
Makes me so glad I chose
To be alive.

I'm so glad I took the time
To take a walk outside
To appreciate the beauty
In this world that's blessed

ドアの外の世界は 生き生きとしている 木々のハミング 鳥のさえずり 果てしない美しさ 私は決して見ることができないと思う ドアの外に広がる世界 エネルギーに満ち 生命に満ち溢れている 生きていることを選んでよかった 生きていることを

外を散歩する時間を 外を散歩して 美しさに感謝する 祝福されたこの世界で

コードの詳細解説

  1. ライブラリのインポート:
import torch
from transformers import AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM

まず、torchとtransformersから必要なモジュールをインポートしています。また、LLM Falcon 7bモデルを利用するために、AutoGPTQForCausalLMクラスもインポートしています。

  1. モデルのディレクトリの指定:
model_dir = "falcon-7b-instruct-GPTQ"

LLM Falcon 7bモデルのディレクトリパスをmodel_dir変数に指定しています。このディレクトリには、事前にダウンロードしたモデルが格納されています。

  1. トークナイザの初期化:
tokenizer = AutoTokenizer.from_pretrained(model_dir, use_fast=False)

指定したモデルディレクトリを使用して、AutoTokenizerを初期化しています。トークナイザはテキストをトークン列に変換するために使用されます。

  1. モデルの初期化:
model = AutoGPTQForCausalLM.from_quantized(model_dir, device="cuda:0", use_triton=False, use_safetensors=True, torch_dtype=torch.float32, trust_remote_code=True)

AutoGPTQForCausalLMクラスのfrom_quantizedメソッドを使用して、指定したディレクトリからモデルを初期化しています。また、deviceパラメータには"cuda:0"を指定しており、モデルをGPU上で利用することを示しています。use_tritonuse_safetensorstorch_dtypetrust_remote_codeなどのパラメータはモデルの挙動や推論の設定を制御するためのものです。

推論部分

  1. テキストのトークン化とGPUへの配置:
tokens = tokenizer(prompt_template, return_tensors="pt").to("cuda:0").input_ids

tokenizerを使用して、prompt_templateというテキストをトークン列に変換します。return_tensors="pt"は、トークン列をPyTorchテンソルの形式で取得するための指定です。そして、.to("cuda:0")を使用して、トークン列をGPU上に配置します。input_idsトークン列のID表現を示しています。

  1. モデルによる文章生成:
output = model.generate(input_ids=tokens, max_new_tokens=100, do_sample=True, temperature=0.8)

modelを使用して、input_idsを入力として文章の生成を行います。max_new_tokensは生成するトークンの最大数を指定し、do_sample=Trueはサンプリングによる生成を有効にすることを示しています。temperatureはサンプリングのランダム性を制御するためのパラメータで、値が高いほどランダム性が増えます。

  1. 生成された文章のデコードと表示:
print(tokenizer.decode(output[0]))

生成された文章をトークン列からテキストにデコードし、表示します。tokenizer.decode()を使用することで、トークン列を元の文章に戻すことができます。output[0]は生成結果の最初の文を示しています。

参考サイト

https://zenn.dev/tatsuromurata/articles/35a9937188429c

Hugging FaceとLangChainでオープンLLMモデルを無料で試す方法!

ChatGPTは非常に便利ですが、APIを使って色々なことをしようと思うとどうしてもコストが気になります。そこで今回は、オープンソースで開発されているLLMをうまく使って、似たようなことができないか模索しました。

様々なモデルが登録されているHuggingFaceとオープンAIなどのモデルを実行するのに便利なLangChainを組み合わせて、サクッと試してみました。

Hugging Faceとは?

Hugging Faceは、様々な機械学習のライブラリを開発している企業で、モデルやデータセットの共有を促進するプラットフォームも提供しています。 Hugging Faceは、自然言語処理NLP)のタスクにおいて特に有名でしたが、最近は画像系など様々なタスクに利用できるモデルがあります。

Hugging Faceは、モデルのトレーニングやファインチューニングに加えて、モデルやデータセットの公開・共有を可能にするプラットフォームを提供しており、この中に今回利用するAPIもあります。CPUのみなので、あまり大きなモデルを使えないのですが、無料で利用可能です。

Hugging Face APIとは?

Hugging Face APIは、開発者に対してモデルの利用や推論を簡単に行う手段を提供します。

Hugging Face APIを利用するためには、まずAPIトークンを取得する必要があります。APIトークンは、Hugging Faceの公式ウェブサイトでアカウントを作成し、APIの使用に対する認証情報を取得することで入手できます。

登録は以下でできます。 https://huggingface.co/join トークンは以下のURLでNewTokenをクリックすると生成されます。 https://huggingface.co/settings/tokens

トークンを取得したら、環境変数としてHUGGINGFACEHUB_API_TOKENトークンを設定しておく必要があります。

セキュリティ上の理由からトークンを直接コードに記入しない方がいいため、今回は、.envファイルや環境変数を使用してトークンを設定することが推奨されます。 まずは作業ディレクトリに移動して、.envファイルを作成します。 そしてこの環境変数を読み込むためには以下のようなコードを書きます

from dotenv import load_dotenv

# .envファイルの内容を読み込見込む TrueならOK

load_dotenv()

Hugging Face APIを利用する場合、LangChainではHuggingFaceHubクラスを使用します。以下のコード例をご覧ください。

Hugging Face APIを使ってLangChainでLLMモデルを利用する方法

Hugging Face APIを介してLangChainでLLMモデルを利用する方法を解説します。Hugging Face APIを使用することで、Hugging Face上に存在するさまざまなモデルを簡単に利用することができます。

以下のコードを使用してHugging Face APIを介してLLMのインスタンスを作成します。

GoogleColaboratory使う場合は以下のライブラリーをインストールします。

!pip install openai langchain python-dotenv transformers 
!pip list | grep langchain
from langchain import HuggingFaceHub


repo_id = "モデルのリポジトリID"  # Hugging Face上でモデルを特定するためのID
model_kwargs = {"パラメータ1": 値1, "パラメータ2": 値2}  # モデルのパラメータを指定する
llm = HuggingFaceHub(repo_id=repo_id, model_kwargs=model_kwargs)

上記のコードでは、repo_idにはHugging Face上のモデルのリポジトリIDを指定します。また、model_kwargsにはモデルごとに異なるパラメータを指定することができます。具体的なパラメータは各モデルのドキュメントを参照してください。

LLMのインスタンスを準備したら、LangChainを使用して質問やテキスト生成を行うことができます。以下がコードの書き方です。具体例はそのあとにあります。

from langchain import LLMChain, PromptTemplate


template = """Question: {question}


Answer: {answer}"""
prompt = PromptTemplate(template=template, input_variables=["question", "answer"])
llm_chain = LLMChain(prompt=prompt, llm=llm)


question = "質問の内容"
answer = llm_chain.run(question)


print(answer)

上記のコードでは、templateには質問と回答のテンプレートを指定し、input_variablesにはテンプレート内で使用する変数のリストを指定します。LLMChainクラスを使用してLLMとテンプレートを組み合わせ、質問に対して回答を取得します。

それでは実際にgpt2モデルを使って、自己紹介の続きを書いてもらうプロンプトを実行してみたいと思います。

from langchain import HuggingFaceHub, LLMChain, PromptTemplate


hub_llm = HuggingFaceHub(
    repo_id='gpt2',
    model_kwargs={'temperature': 0.7, 'max_length': 100}
)


prompt = PromptTemplate(
    input_variables=["name", "place"],
    template="Hello, my name is {name} and I'm from {place}. Nice to meet you!"
)


hub_chain = LLMChain(prompt=prompt, llm=hub_llm, verbose=True)


name1 = "Alice"
place1 = "New York"
response1 = hub_chain.run(name=name1, place=place1)
print(f"Response for {name1} from {place1}: {response1}\n")


name2 = "Bob"
place2 = "London"
response2 = hub_chain.run(name=name2, place=place2)
print(f"Response for {name2} from {place2}: {response2}\n")


name3 = "Charlie"
place3 = "Tokyo"
response3 = hub_chain.run(name=name3, place=place3)
print(f"Response for {name3} from {place3}: {response3}\n")

上記のコードでは、GPT-2のモデルをロードし、LLMChainを作成しています。プロンプトには「名前(name)」と「場所(place)」という入力変数を使用し、自己紹介文を生成します。

具体的な例として、AliceさんがNew York出身である場合、BobさんがLondon出身である場合、CharlieさんがTokyo出身である場合のそれぞれの回答を取得しています。

上記のコードを実行すると、各自の名前と場所に基づいた自己紹介文が生成されます。

(なお、verbose=Trueとしているため、処理の進捗状況や生成されたトークン数が表示されます。)

アウトプットは次のようになりました。

> Entering new  chain...
Prompt after formatting:
Hello, my name is Alice and I'm from New York. Nice to meet you!


> Finished chain.
Response for Alice from New York: 


Alice: Hello, my name is Alice and I'm from New York. Nice to meet you!


Alice: Hello, my name is Alice and I'm from New York. Nice to meet you!


Alice: Hello, my name is Alice and I'm from New York. Nice to meet you!


Alice: Hello, my name is Alice and I'm from New York


> Entering new  chain...
Prompt after formatting:
Hello, my name is Bob and I'm from London. Nice to meet you!


> Finished chain.
Response for Bob from London: 


I'm a freelance writer and I'm looking for a job. I'm looking for a freelance writer to write a short story for a magazine. I'm looking for a freelance writer to write a short story for a magazine. I'm looking for a freelance writer to write a short story for a magazine. I'm looking for a freelance writer to write a short story for a magazine. I'm looking for



> Entering new  chain...
Prompt after formatting:
Hello, my name is Charlie and I'm from Tokyo. Nice to meet you!


> Finished chain.
Response for Charlie from Tokyo: 


I'm a Japanese-American, and I'm a member of the Japanese American Association. I'm a member of the American Association for the Advancement of Science. I'm a member of the American Association for the Advancement of Science. I'm a member of the American Association for the Advancement of Science. I'm a member of the American Association for the Advancement of Science. I'm a

正直なところちょっと微妙なものが多いですね。 最初の例は全くうまくいっていませんが後ろの2つはまだある程度文章にはなっているかなという感じです。

あまり大規模なモデルはAPIに対応していないケースが多そうなので、なかなかCPUで動く高性能のモデルというのは難しそうだなという印象です。

Streamlitを使って爆速でWebアプリを作ろう!

Streamlitとは?

StreamlitというのはWebアプリのフレームワークの一つです。

Pythonのみで簡単にWebアプリを構築することができるものになります。HTMLやJavaScriptなどを書く必要がないため、一般的なPythonWebアプリを作成する際に使用する他のフレームワークよりも簡単に利用できます。作成したアプリは、Streamlit Cloudで公開することも可能です。

img

Streamlit • A faster way to build and share data apps

Streamlit is an open-source app framework for Machine Learning and Data Science teams. Create beautiful web apps in minutes.

img

streamlit.io

img

目次

    1. Streamlitとは?
  1. ngrokの準備

    1. ngrokとは?
    2. セットアップ
    3. トークンの取得
  2. Google ColaboratoryでStreamlitアプリケーションを実行する方法

  3. コードの解説

ngrokの準備

ngrokとは?

ngrokはローカルサーバーを外部公開できるツールになります。今回はGoogleコラボラトリー上で構築したチャットボットを動かすために使用します。今回使用する範囲では無料で使用ができます。

img

ngrok - Online in One Line

ngrok is the fastest way to put anything onthe internet with a single command.

img

ngrok.com

セットアップ

まずはngrokのサイトにアクセスをしてSignUpをクリックします

img

必要な情報を入力して登録を進めます.

img

登録が完了すると次のような—ボードになります。

img

トークンの取得

左側のメニューのYour Authtokenをクリックしてトークンを取得します。

img

トークンが表示されるのでコピーします。

img

Google ColaboratoryでStreamlitアプリケーションを実行する方法

  1. Google Colaboratoryにアクセス: まず、Google Colaboratoryにアクセスし、新しいノートブックを作成します。
  2. 必要なライブラリのインストール: 最初のセルに以下のコードを入力し、必要なライブラリをインストールします。
!pip install streamlit==1.20.0 
!pip install pyngrok==4.1.1 
import streamlit as st
from pyngrok import ngrok
  1. Streamlitアプリケーションの作成: 次に、新しいセルを作成し、以下のコードを入力してStreamlitアプリケーションを作成します。マジックコマンドを使ってapp.pyというファイルを作成するコードになります。さらなる詳細は後ほどコード解説で説明していきます。今回はirisデータセットを使ってウェブアプリの入力画面でユーザーがで入力したがくの長さや幅などの情報から花の品種を予測する簡単なアプリケーションを作成するコードになります。
%%writefile app.py
import streamlit as st
import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier

# Irisデータセットの読み込み
iris = datasets.load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names

# 分類器の訓練
clf = RandomForestClassifier()
clf.fit(X, y)

# アプリケーションのタイトルと説明
st.title("Iris Flower Classification")
st.write("このアプリは、アヤメの花の種類を特徴に基づいて予測します。")

# ユーザーの入力の受け取り
sepal_length = st.slider("がく片の長さ", 4.0, 8.0, 5.0)
sepal_width = st.slider("がく片の幅", 2.0, 4.5, 3.0)
petal_length = st.slider("花弁の長さ", 1.0, 7.0, 4.0)
petal_width = st.slider("花弁の幅", 0.1, 2.5, 1.0)

custom_input = st.text_input("カスタム入力", "カンマ区切りで値を入力してください(例:5.1, 3.5, 1.4, 0.2)")

# ユーザーがカスタム入力を行った場合、それを利用
if custom_input and custom_input != "カンマ区切りで値を入力してください(例:5.1, 3.5, 1.4, 0.2)":
    custom_values = [float(x.strip()) for x in custom_input.split(",")]
    if len(custom_values) == 4:
        sepal_length, sepal_width, petal_length, petal_width = custom_values

# 予測結果の表示
features = [[sepal_length, sepal_width, petal_length, petal_width]]
prediction = clf.predict(features)

species = {
    0: "Setosa",
    1: "Versicolor",
    2: "Virginica"
}

st.write("特徴:")
feature_values = dict(zip(feature_names, [sepal_length, sepal_width, petal_length, petal_width]))
st.write(pd.DataFrame(feature_values, index=[0]))

st.write("予測された種類:", species[prediction[0]])
  1. アプリケーションの表示: APIキーを登録して、バックグラウンドジョブとしてアプリケーションを起動します。
!ngrok authtoken ここにAPIキーを入力
!streamlit run app.py &>/dev/null&  # 「&>/dev/null&」により、出力を非表示にしてバックグランドジョブとして実行

最後にngrokを使ってアプリケーションにアクセスできるようにします。

ngrok.kill()  # プロセスの修了
url = ngrok.connect(port="8501")  # 接続

帰ってきたURLがhttpの場合はhttpsでアクセスするようにURLを整形します.

if url.startswith("http://"):
    url = url.replace("http://", "https://", 1)
    print(url)

コードの解説

まず、以下のコードは必要なライブラリのインポートを行っています。

import streamlit as st
import pandas as pd
from sklearn import datasets
from sklearn.ensemble import RandomForestClassifier

次に、Irisデータセットを読み込んでいます。

iris = datasets.load_iris()
X = iris.data
y = iris.target
feature_names = iris.feature_names

その後、ランダムフォレスト分類器を訓練しています。

clf = RandomForestClassifier()
clf.fit(X, y)

アプリケーションのタイトルと説明を表示します。

pythonCopy codest.title("Iris Flower Classification")
st.write("このアプリは、アヤメの花の種類を特徴に基づいて予測します。")

次に、ユーザーからの入力を受け取るためのスライダーやテキスト入力を表示します。

sepal_length = st.slider("がく片の長さ", 4.0, 8.0, 5.0)
sepal_width = st.slider("がく片の幅", 2.0, 4.5, 3.0)
petal_length = st.slider("花弁の長さ", 1.0, 7.0, 4.0)
petal_width = st.slider("花弁の幅", 0.1, 2.5, 1.0)

custom_input = st.text_input("カスタム入力", "カンマ区切りで値を入力してください(例:5.1, 3.5, 1.4, 0.2)")

ユーザーがカスタム入力を行った場合は、入力値を処理します。

if custom_input and custom_input != "カンマ区切りで値を入力してください(例:5.1, 3.5, 1.4, 0.2)":
    custom_values = [float(x.strip()) for x in custom_input.split(",")]
    if len(custom_values) == 4:
        sepal_length, sepal_width, petal_length, petal_width = custom_values

予測結果を表示します。

features = [[sepal_length, sepal_width, petal_length, petal_width]]
prediction = clf.predict(features)

species = {
    0: "Setosa",
    1: "Versicolor",
    2: "Virginica"
}

st.write("特徴:")
feature_values = dict(zip(feature_names, [sepal_length, sepal_width, petal_length, petal_width]))
st.write(pd.DataFrame(feature_values, index=[0]))

st.write("予測された種類:", species[prediction[0]])

特徴の値と予測された種類が表示されます。

ブログ記事の画像を移行に備えて効率的に管理する方法

今回はブログ記事の画像管理で私が少し考えたことのメモを書いておきます。

記事を書いた当初はどこのサーバーやサービスを使ってブログ記事を公開するか決まっていない場合に、特にややこしいのが画像の管理になります。 テキスト部分は基本的にコピーアンドテイストでうまくできますしファイルのアップロードなので簡単にできますが、画像はサーバーが変わってしまうとそれに付随するリンクは変わるなど表示されないケースが出てきてしまいます。

また何らかの都合で画像が消失してしまった場合に対応できるようなバックアップに必要だと考えています。

今回はGoogleドライブを使って画像管理をしつつ、ワードプレスなどに簡単にアップロードする方法をメモしておきます。

記事の作成は、vscodeを使って行います。VSコードの拡張機能にPaste imageがあるのでそれを使って画像をローカルの保存しながら記事を作成していきます。 記事をワードプレスにアップロードする場合にはメディアに新規アップロードがあるのでそこから保存された画像ファイルをドラッグ&ドロップします。 VSコードでマークダウンを書くときには画像が以下のように入力されています

それをWordPressにアップロードしたメディアへのパスに一括置換を使って書き換えれば画像一つ一つをコピペして貼り直せなくても記事を丸ごとWordPressなどに移行することができます。

ChatGPT APIの使い方を1から解説!初心者でも大丈夫なサンプルコード有

ChatGPTに興味があるけどなかなか実際にどういう風に活用できるのか分かっていない。APIを試してみたいけどやり方があまり分かっていない、という方に向けて今回はチャットGPTAPIの使い方を解説していきます。

ChatGPTAPIの料金体系

まず初めにチャットGTP APIの料金体系を解説します。チャットGPTのAPIは有料ですがかなり低価格で利用が可能です。利用料金は以下のようになっており、GPT3.5ターボを使う場合とGPT4を使う場合で料金が変わってきます。GPT4はGPT3.5ターボの約10倍の料金が発生します料金の計算はトークンと呼ばれる単位によって計算されます。イメージとしては文字数に該当するのがトークンになります。

低価格とはいえ料金が発生するためクレジットカードの準備が必要です

 

 

API値の取得と各種設定

それでは早速ChatGPTAPIを使っていきたいと思います。今回利用するのはPythonを簡単に無料で実行することができるGoogleColaboratoryを使っていきたいと思います。

もしGoogleアカウントを持っていない人は作成しておいてください。

それではまず初めにOpenAIのAPIキーを取得していきます。これまでチャットGTPを使ったことがある人はオープンAIのアカウントを持っていると思いますが、まだ触ったことがなくアカウントを持っていない場合には最初にアカウントを作成します。

アカウントを持っていない場合は以下のページからアカウントの作成が可能です。メールアドレスと電話番号などを入力することで登録可能です。2023年6月現在では電話番号1つに対して2つのアカウントまでしか作成できないので注意してください。

 

 

アカウントを既に持っている場合や作成した後は以下のオープンAIのプラットフォームにアクセスします。

 

 

GPTやテキストの文字起こしなど様々なのサービスを利用できることを確認できます。

それでは早速登録を進めていきます。まずはアカウントにクレジットカードを登録します。右上にあるアイコンのPersonalをクリックしてManage Accountを選択します。

BillingのOverviewに表示されるSet up paid accountをクリックします。

まずは個人か法人かを選択します。

その後、クレジットカード情報を登録していきます。

最後にSet up payment methodを押して完了です。

続いて使いすぎを防止するために上限金額を設定していきます。この設定はとても重要ですので必ず行うようにしておきましょう。

支払い関連の画面のUsage limitsをクリックします

デフォルトでは上限金額は120ドルとなっています。ソフトリミットというのはその金額に達するとメールが届くというリミットになっていてハードリミットはその金額以上は使用されないというリミットになります。それぞれの金額を入力しておきましょう。入力した後は下側のsaveを押します。

APIキーの取得

ここまで準備ができたらAPIキーを取得します。

画面左側に表示されるAPI keysというタブをクリックします。

Create new secret keyからAPIキーを発行します。

APIキーは他人に知られると利用されてしまう可能性があるので、他人には知られないように管理しましょう。一度表示されたAPIキーの情報はOKを押すと消えてしまうので必ずどこかにメモしておきましょう。特にgithubなどに行動を上げる場合にはAPIキーがアップロードされないように注意する必要があります。

GoogleColaboratoryでAPIを使ってみよう

Googleドライブで安全にAPIキーにアクセスするために、Googleドライブでパラパラトリーを作成するフォルダーなどに.envのファイルを作成します。

ファイルの中身には先ほど取得したAPIキーを以下のように記入します。

OPENAI_API_KEY=""

あるいはローカルPC上で作成したファイルをアップロードする形でも問題ありません。

それではGoogleコラボラトリーのファイルを新しく作成します。

まずは、Google Colab(https://colab.research.google.com/)にアクセスします。アクセス後、Google Colab上部の「ファイル」から「ノートブックを新規作成」をクリックします。

クリックすると「ノートブック」が作成されます。

もしくは、すでにColaboratoryをアプリに追加している場合には、Driveの新規作成からも作成可能です。

まずは、Googleドライブをマウントします。

左側のフォルダーマークのアイコンをクリックしてGoogleドライブのマークをクリックします。するとGoogleドライブをマウントすることができます。

必要なライブラリーをpipでインストールします

!pip install openai
!pip install python-dotenv

続いて先ほど作成した環境変数ファイルを読み込めるように先ほど保存したファイルが存在するディレクトリまで移動しましょう。下の例ではマイドライブの下にChatGPTというフォルダを作成しその中に.envを入れている場合を示しています。

import os
os.chdir('/content/drive/MyDrive/ChatGPT/')

次にOpenAIのAPIキーを読み込みます

from dotenv import load_dotenv
# .envファイルの内容を読み込見込む TrueならOK
load_dotenv()
import openai
openai.api_key = os.environ["OPENAI_API_KEY"]

これで準備は完了ですそれでは早速APIキーを使ってChatGPTに質問してみましょう

# ChatGPT APIからのレスポンスを取得する
response = openai.ChatCompletion.create(
    model="gpt-3.5-turbo",
    messages=[
        {"role": "system", "content": "あなたはAIの専門家です。"},
        {"role": "user", "content":"ChatGPTとは何ですか?"}
        ]
)

“role”: “system”では前提となる役割を与えることができます。例えば、あなたはAIの専門家です。のような役割を記述することができます。

そして次に”role”: “user”としてメッセージを投げます。今回の場合は、ChatGPTとは何ですか?になります。

responseの中身は画像のようになります

choice message contentの中にChatGPTからの回答が含まれていることが分かりますのでその値を取得します。

print(response['choices'][0]['message']['content'])

今回は以下のような回答が返ってきました

ChatGPTは、人工知能技術を利用して人間との対話を行い、様々な質問に答えるAIチャットボットです。ChatGPTは、自然言語処理機械学習の技術に基づいており、ユーザーが入力したテキストデータを解析して、適切な回答を生成します。ChatGPTは、教育、健康、エンターテイメント、ビジネスなどの様々な分野で利用されています。

無事ChatGPTAPIを使ってChatGPTに質問することができました!

ブログ記事の画像を移行に備えて効率的に管理する方法

今回はブログ記事の画像管理で私が少し考えたことのメモを書いておきます。

記事を書いた当初はどこのサーバーやサービスを使ってブログ記事を公開するか決まっていない場合に、特にややこしいのが画像の管理になります。 テキスト部分は基本的にコピーアンドテイストでうまくできますしファイルのアップロードなので簡単にできますが、画像はサーバーが変わってしまうとそれに付随するリンクは変わるなど表示されないケースが出てきてしまいます。

また何らかの都合で画像が消失してしまった場合に対応できるようなバックアップに必要だと考えています。

今回はGoogleドライブを使って画像管理をしつつ、ワードプレスなどに簡単にアップロードする方法をメモしておきます。

記事の作成は、vscodeを使って行います。VSコードの拡張機能にPaste imageがあるのでそれを使って画像をローカルの保存しながら記事を作成していきます。 記事をワードプレスにアップロードする場合にはメディアに新規アップロードがあるのでそこから保存された画像ファイルをドラッグ&ドロップします。 VSコードでマークダウンを書くときには画像が以下のように入力されています

それをWordPressにアップロードしたメディアへのパスに一括置換を使って書き換えれば画像一つ一つをコピペして貼り直せなくても記事を丸ごとWordPressなどに移行することができます。