fc2ブログ

LlamaIndexを使う(1)

 ChatGPTにカスタム情報を入れてchatbotとして利用する方法を探している中で、LlamaIndex(ラマインデックス)で実現できることを知りました(いまさらですが・・)。
 取り急ぎ、考えていたことが簡単にできたのでその備忘録を残します。仕組みの詳細はこれから理解して、後日まとめようと思います。

 準備したのは、①Pythonプログラムと②カスタム情報の入ったデータの2つだけです。必要なPythonライブラリは事前にインストールしておきます。
pip install llama-index
①の実行したプログラムは以下の通りです。
# llamaindex_test.py
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader, StorageContext, load_index_from_storage

# Create and save an index
documents = SimpleDirectoryReader("./data/").load_data()
index = GPTVectorStoreIndex.from_documents(documents)
index.storage_context.persist()

# Load Index
storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)

# Question
query_engine = index.as_query_engine()
print(query_engine.query("Where is Dr.BobT's hometown?"))
print(query_engine.query("What does Dr.BobT do?"))
print(query_engine.query("Is Dr.BobT under 40 years old?"))
print(query_engine.query("Is Dr.BobT under 60 years old?"))
②はプログラムの入っているpathにdataフォルダを作成し、以下の内容をdata.txtとして保存しました。
Question: How old is Dr.BobT?
Answer: He is 51 years old.

Question: Where is Dr.BobT from?
Answer: He is from Fukuoka city.

Question: What is Dr.BobT's occupation?
Answer: His occupation is a software engineer.
質問内容は学習させたデータの文言そのままではなく、別の言葉で置き換えました。結果は以下の通りです。check_learn_run_230918.pngプログラム実行前にコマンドラインからOpenAIのkeyをexportしておきます(私の環境はMacです)。
export OPENAI_API_KEY="My key"

 あっさりと正しい回答が出てきたので驚きましたが、本当にOpenAI(ChatGPT)を利用しているのか不安になったので、APIの利用を確認しました。Usage_230918.png確かにOpenAIは利用されているようです。

 ちなみに同じ質問をAPI経由ではなく、ブラウザのChatGPTから実行させると以下の通りで、個人情報については回答できないとのこと。check_no_learn_run1_230918.pngcheck_no_learn_run2_230918.pngcheck_no_learn_run3_230918.png
 今までのプログラムの流れは一旦Indexを作成して保存し、次に作成したIndexを読み込んで実施するものでした。毎回Indexを作成する必要もないので、作成済の同じIndex情報を読み込んで再評価をしました。具体的には上記のプログラムの4〜7行目を削除したプログラムを実行しました。recheck_learn_230918.png結果は問題ありません。
加えて、OpenAIのAPIから「カスタム情報のないChatGPT」に同じ質問を行うべく、以下のプログラムを実行させました。
import openai

openai.api_key = "My key"

def generate_text(prompt, conversation_history):
conversation_history.append({"role": "user", "content": prompt})

response = openai.ChatCompletion.create(
model="gpt-3.5-turbo-16k-0613",
messages=conversation_history
)
message = ""

for choice in response.choices:
message += choice.message['content']

# 応答文を会話履歴に追加
conversation_history.append({"role": "assistant", "content": message})
return message

if __name__ == "__main__":
# 会話履歴を格納するためのリストを初期化
conversation_history = []

while True:
# ユーザーに質問を入力させる
input_prompt = input("プロンプト: ")
generated_text = generate_text(input_prompt, conversation_history)
print("応答:", generated_text)
結果は以下の通りで、ブラウザのChatGPTから実行させた結果と同じでした。recheck_no_learn_230918.png
 今回、LlamaIndexを用いて、個人のカスタムデータをChatGPTにつなぐことができることが分かりました。いろいろ応用が効きそうなので、面白いアイデアを考えてみようと思います。
スポンサーサイト



実家に帰省する

 金曜日(9/15)からの3日間、2か月ぶりに実家(博多)に帰省しました。帰省は年1、2回のペースなのですが、実家の年寄り関係で諸々の作業を行うため、今回は臨時の帰省をしました。以下、愚痴だらけなので、ここでスルーしていただいても構いません。自分の中で昇華するための記録です。

 前回の帰省が7月中旬の連休で、お盆期間は人が多いのではじめから見送りました。結局、お盆期間は台風が来て大幅に新幹線のダイヤが乱れたので、帰らなくて良かったのですが・・。

 今回の帰省は、実家で契約していたケーブルテレビJCOMの解約に伴う工事の立ち会いです。
 JCOMは父親が10年以上前の地デジ移行前に契約したもので、近所の人がみんな契約しているからとのことで、騙されて?加入したものでした。年寄り(当時70歳以上)なので、何も分からないまま、地デジになるので、TVが見れなくなるという脅し文句?で騙されたのでしょう。
 実家の近くに住む姉の子供が小さい頃で、ケーブルテレビでアニメや子供向け番組も契約しており、毎月7、8千円支払っていました。

 その父親が2回の脳梗塞後、要介護3になった今、この契約も放置状態だったので、昨年、まずアニメチャンネルを私の方で解約しました。ただし、デイケア(費用はすべて長男の私が負担)から将来、介護老人福祉施設に入るにあたり、親の年金ではお金が足りないので、無駄な出費を減らすべく、JCOMのテレビ自体から解約することにしました。結局、それでも私の継続費用負担は変わりませんが・・。そもそもJCOMの契約はケーブルテレビと電話の契約ですが、電話は新たに契約するのも大変なのでそのまま継続で、テレビのみを解約しました。

 ただ、この手続きに「NHK」が絡んで非常に面倒臭かったです。私は実家から離れた所で生活をしており、親の代わりに電話でやり取りを行う必要がありました。母親が全くこの手の話が分からないので・・。
 NHKのふれあいセンターという受信料のナビダイヤルがあるのですが、数回電話しましたが、まず、電話がつながるまで時間がかかり、担当者によって衛星放送から地デジ放送のみの契約への変更の段取りについて、言うことが全く違いました。思わず我慢できずに声を荒げて苦言と暴言を吐くまでに・・。やっぱりお役所はダメですね。
 民間のサービスならば、ここまでひどくはないと思います。NHKの窓口担当者は聞かれたことしか答えておらず(AIでもできそう)、ユーザの求めていることまで言及しない。何のために電話をしたのかを伝えているのに、その目的をフォローするだけのサービスが初めからありませんでした。期待しても無理でしょうね・・(呆れから諦めへ)。

 何とか怒りを抑えて「ケリ」は付いたのですが、JCOMにしても、NHKにしても、国の法律にしても、何事にしても、高齢者にとって契約等が分かりやすくなっておらず、その分、身内がフォローに入り、苦労することになりますね。詐欺まがいのことをしても高齢者は気付かないのではないかと思います。

 ようやく、私の子供も一人立ちできるようになり、自分の時間、夫婦の時間ができたと思ったら、親の介護の話です。私と同じ世代(50代)の方々は同じ経験をされているとは思いますが、私自身も歳を重ねるのが今から大変つらく感じています。

 父親の介護老人福祉施設への入所が要介護3の認定から7か月後の先週、ようやく正式に決まりました。個室にテレビを設置すべく、私が購入して今回設置しました。家電量販店にすべて頼んでいたら、何でもかんでもお金を取ろうとしますからね。配達もなしで数キロ離れた店に歩いて買いに行きました。帰省すると足(車)がないんですよね。いい運動になりました。
 母親は当初は施設に入れることに躊躇っていましたが、父親の介護の負担が軽減して自分の時間を持てるようになったのは唯一良かったことと思います。

 今後、高齢者が増えて行くのに、介護施設の絶対数が不足しており、待ち期間が長くなっています。待機児童ではなく、待機老人が増加しています。保険証のデジタル化よりも大事なことがあるのではないかと思います。

PandasAIを使う(3)

 PandasにChatGPTの機能を実装したPandasAIというライブラリをデータ分析に活用しようと模索しています。先月もスマートウォッチのFitbitのデータを処理するのに利用しました。このPandasaiは日々機能改善されているので、今回Updateしました。

 今まで利用していたライブラリのバージョンは「0.5.4」でした。pandasai_before_230917.png現在(23/09/17)の最新版は「1.2.2」です。pandasai_after_230917.png Update後、Update前に正常に動作していたプログラムを動かすと、以下のエラーが発生。Beautifulsoupをインストールしなさいとのこと。pandasai_run1_230917.png言われた通り、Beautifulsoupをインストールして、改めてプログラムを実行すると、以下の警告が発生。SmartDataframeクラスを利用しなさいとのこと。pandasai_run2_230917.pngネット情報を参考にして、最終的に正常に動いたプログラムは以下の通り。
import pandas as pd
from pandasai import SmartDataframe
from pandasai.llm import OpenAI

# Sample DataFrame
df = pd.DataFrame({
"country": ["United States", "United Kingdom", "France", "Germany", "Italy", "Spain", "Canada", "Australia", "Japan", "China"],
"gdp": [19294482071552, 2891615567872, 2411255037952, 3435817336832, 1745433788416, 1181205135360, 1607402389504, 1490967855104, 4380756541440, 14631844184064],
"happiness_index": [6.94, 7.16, 6.66, 7.07, 6.38, 6.4, 7.23, 7.22, 5.87, 5.12]
})

# Instantiate a LLM
llm = OpenAI(api_token="My key")

df = SmartDataframe(df, config={"llm": llm})
print(df.chat('Which are the 5 happiest countries?'))
結果が正しく表示されました。pandasai_run3_230917.png
 開発がホットな生成AI関連分野のライブラリは、日々の更新をウォッチしておかないとコールする関数が変わっていたりしますね。ChatGPTはともかく、ネット記事でも得られた情報の「新鮮度」を確認しつつ、利用しなくてはなりませんね。

BingとBardの画像認識を比較する(3)

 前回はWindowsのFormアプリの画面の「手書きデザイン」から生成AIでプログラムを書いてもらいました。言語は.NET系のC#でしたが、Bing-AI、Bardの両者、甲乙付けられないほど賢い回答を返してくれました。今回は、PythonでGUIも作成してもらいました。

1. Bing-AI
 プロンプトは以下の通りです。Prompt_bing_230910.png早速、プロクラムを回答してきました。Answer_bing_230910.pngプロンプトで指定はしていませんでしたが、予想通りtkinterを使ったプログラムを回答してきました。エラーを吐いたので一部修正を行いました。最終コードは以下の通りです。
# Import tkinter module
import tkinter as tk
import tkinter.ttk as ttk ## added ##

# Create a root window
root = tk.Tk()

# Create a frame to hold the widgets
frame = tk.Frame(root)
frame.pack()

# Create a label for the combo box
combo_label = tk.Label(frame, text="Combo Box")
combo_label.grid(row=0, column=0)

# Create a list of items for the combo box
items = ["Tokyo", "Osaka", "Nagoya", "Fukuoka", "Sapporo"]

# Create a variable to store the selected item
selected_item = tk.StringVar()

# Create a combo box with the items and the variable
#combo_box = tk.Combobox(frame, values=items, textvariable=selected_item)
combo_box = ttk.Combobox(frame, values=items, textvariable=selected_item)

combo_box.grid(row=1, column=0)

# Create a label for the text box
text_label = tk.Label(frame, text="Text Box")
text_label.grid(row=0, column=1)

# Create a variable to store the text content
text_content = tk.StringVar()

# Create a text box with the variable and a name
#text_box = tk.Entry(frame, textvariable=text_content, name="Disp-textBox")
text_box = tk.Entry(frame, textvariable=text_content) ## revised ##

text_box.grid(row=1, column=1)

# Define a function to display the selected item in the text box
def display():
# Get the selected item from the combo box
item = selected_item.get()
# Set the text content to the selected item
text_content.set(item)

# Create a button to call the display function
display_button = tk.Button(frame, text="Display", command=display)
display_button.grid(row=1, column=2)

# Start the main loop
root.mainloop()
追加・修正をした箇所は以下の通りです。
 1. 3行目を追加(23行目のエラーの対策)。
 2. 23行目で「AttributeError: module 'tkinter' has no attribute 'Combobox'」のエラーが出たので、24行目に修正。
 3. 36行目を37行目に修正。

実行結果です。Run_bing_230910.pngコンボボックス、テキストボックス、ボタンが一直線の配置で、手書きのレイアウトは反映されませんでしたが、動作は問題ありませんでした。

2. Google Bard
 プロンプトはBingの時と同じで以下の通りです。Prompt_bard_230910.pngBardも早速、プロクラムを回答してきました。これもtkinterを使ったプログラムを回答してきました。Answer_bard1_230910.pngプログラムの解説と実行の仕方まで丁寧に解説してくれました。Answer_bard2_230910.png
 Bardの作成したプログラムもエラーを吐いたので一部修正を行いました。最終コードは以下の通りです。
import tkinter as tk
import tkinter.ttk as ttk ## added ##

root = tk.Tk()
root.title("Combobox Example")

# Create the combobox
#selection_combobox = tk.ttk.Combobox(root, values=["Tokyo", "Osaka", "Nagoya", "Fukuoka", "Sapporo"])
selection_combobox = ttk.Combobox(root, values=["Tokyo", "Osaka", "Nagoya", "Fukuoka", "Sapporo"]) ## revised ##
selection_combobox.grid(row=0, column=0)

# Create the display button
display_button = tk.Button(root, text="Display", command=lambda: display_text())
display_button.grid(row=1, column=0)

# Create the text box
disp_text_box = tk.Entry(root)
disp_text_box.grid(row=2, column=0)

def display_text():

# Get the selected item from the combobox
selected_item = selection_combobox.get()

# Display the selected item in the text box
disp_text_box.delete(0, tk.END) ## added ##
disp_text_box.insert(0, selected_item)

root.mainloop()
追加・修正をした箇所は以下の通りです。
 1. 2行目を追加(8行目のエラーの対策)。
 2. 8行目で「AttributeError: module 'tkinter' has no attribute 'ttk'」のエラーが出たので、9行目に修正。
 3. Displayボタンを押すと前回の表示が消えなかったため(下図参照)、26行目を追加。Run_bard_230910.png追加・修正後のプログラムは正常に動作しました。レイアウトは下方向に並んだ形ですね。

前回に続いて、今回は同じ題目をPythonで試しました。追加・修正はBing-AI、Bardともにありましたが、両者、軽微なもので、今回も甲乙付けられないほど賢い結果でした。すごいですね・・。

BingとBardの画像認識を比較する(2)

 前回に続いて、今回も生成AIで「画像入力」が現時点(23/09/03)で無料でできるBingとBardを使います。今回はWindowsのFormアプリの画面の手書きデザインから生成AIにプログラムを書いてもらいました。

 題材は、ComboBox、ButtonとTextBoxの3つのオブジェクトを持ったForm画面です。Form_230903.pngComboBoxの要素は、Tokyo、Osaka、Nagoya、Fukuoka、Sapporoの5点です。その要素を1つ選択して、DisplayというButtonを押すと、TextBoxにComboBoxで選択したItem名を表示させる仕様です。早速、実行結果を見てみましょう。

1. Bing-AI
 プロンプトは以下の通りです。Bing1_230903.png早速、プロクラムを回答してきました。Bing2_230903.png解説は間違い箇所もありますが、許容範囲ですかね・・。Bing3_230903.png実際に動かしたプログラムは以下の通りです。
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Bing_ComboBox_Test
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
// コンボボックスにアイテムを追加
Selection_comboBox.Items.Add("Tokyo");
Selection_comboBox.Items.Add("Osaka");
Selection_comboBox.Items.Add("Nagoya");
Selection_comboBox.Items.Add("Fukuoka");
Selection_comboBox.Items.Add("Sapporo");
}

private void Display_Click(object sender, EventArgs e)
{
// コンボボックスで選択されたアイテムをテキストボックスに表示
Disp_textBox.Text = Selection_comboBox.SelectedItem.ToString();
}
}
}
Formのデザイン本体は詳細指示をしていなかったので、作成してもらえませんでしたが、最終的に、29行目のオブジェクト名を修正するだけで、正常に動きました。Bing4_230903.png
2. Google Bard
 プロンプトはBingの時と同じで以下の通りです。bard1_230903.pngBardも早速、プロクラムを回答してきました。bard2_230903.png解説も問題なしです。bard3_230903.png実際に動かしたプログラムは以下の通りです。
using System;
using System.Windows.Forms;

namespace ComboBoxDemo
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();

// Add items to the combobox
cmbSelection.Items.Add("Tokyo");
cmbSelection.Items.Add("Osaka");
cmbSelection.Items.Add("Nagoya");
cmbSelection.Items.Add("Fukuoka");
cmbSelection.Items.Add("Sapporo");

// Set the Text property of the textbox to blank
txtDisplay.Text = "";

// Add an event handler for the SelectedIndexChanged event of the combobox
cmbSelection.SelectedIndexChanged += new EventHandler(cmbSelection_SelectedIndexChanged);
}

private void cmbSelection_SelectedIndexChanged(object sender, EventArgs e)
{
// Get the text of the selected item in the combobox
string selectedText = cmbSelection.SelectedItem.ToString();

// Set the Text property of the textbox to the selected text
txtDisplay.Text = selectedText;
}
}
}
Bardについても、Formのデザイン本体は詳細指示をしておらず、作成してもらえなかったので、結局、自分で作成しました。ComboBox、Button、TextBoxのオブジェクト名が指示通りではなく、ComboBoxの選択変更イベントを受けてTextBoxに表示するため、Button不要のプログラムを作成してくれました。このプログラムは手直し・バグなしで動作しました。bard4_230903.png
 今回、Bing-AI、Bardに手書きのWindows Formスケッチからプログラムを作成してもらいましたが、結果、両者甲乙付けられないほど賢い回答を返してくれました。恐るべしです。

京都ラーメン街道に行く(4)

 久しぶりに気分転換で京都に行きました。8月の週末は熱中症警戒アラートが出るほど、京都の最高気温が高く、さすがに出かける気持ちになりませんでした。
 今日は、家にいてクーラーの部屋でゆっくりするだけでは、つまらないなと思って、重い腰を上げました。また、うまいラーメンでも食べに行こうかと京都一乗寺へ。

 このシリーズ?は4回目ですが、過去、髙安さん極鶏さん錦さんにお世話になりましたが、今回は「びし屋さん」です。Ramen_map_230902.pngいただいたのは、定番の豚骨醤油ラーメンと唐揚、ライスのセットです。Ramen_230902.pngとろみのある濃厚豚骨スープですが、天下一品のこってりほどヘビーではなく、胃にも優しかったですね。麺はちゃんぽんのような麺でモチモチしてGoodでした。焼き豚も大きく食べ応えあり。テーブルに特製にんにくが置いてあったので、入れるとさらに美味しかったです。満腹になって店を後にしました。

 それにしても京都の市バスは乗客が多いですね。京都駅から一乗寺に行くにも途中まで立っていました。座席数が少ないバスなんですよね。コロナ明けで観光客も多いし、車内も満員御礼です。景気が良いのはいいことなんですけどね・・。

ご訪問者数

(Since 24 July, 2016)

タグクラウド


プロフィール

Dr.BobT

Author: Dr.BobT
興味のおもむくままに生涯考え続けるエンジニアでありたい。

月別アーカイブ

メールフォーム

名前:
メール:
件名:
本文: