2023/09/18
LlamaIndexを使う(1)
ChatGPTにカスタム情報を入れてchatbotとして利用する方法を探している中で、LlamaIndex(ラマインデックス)で実現できることを知りました(いまさらですが・・)。取り急ぎ、考えていたことが簡単にできたのでその備忘録を残します。仕組みの詳細はこれから理解して、後日まとめようと思います。
準備したのは、①Pythonプログラムと②カスタム情報の入ったデータの2つだけです。必要なPythonライブラリは事前にインストールしておきます。
pip install llama-index①の実行したプログラムは以下の通りです。
# llamaindex_test.py②はプログラムの入っているpathにdataフォルダを作成し、以下の内容をdata.txtとして保存しました。
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?"))
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.

export OPENAI_API_KEY="My key"
あっさりと正しい回答が出てきたので驚きましたが、本当にOpenAI(ChatGPT)を利用しているのか不安になったので、APIの利用を確認しました。

ちなみに同じ質問をAPI経由ではなく、ブラウザのChatGPTから実行させると以下の通りで、個人情報については回答できないとのこと。



今までのプログラムの流れは一旦Indexを作成して保存し、次に作成したIndexを読み込んで実施するものでした。毎回Indexを作成する必要もないので、作成済の同じIndex情報を読み込んで再評価をしました。具体的には上記のプログラムの4〜7行目を削除したプログラムを実行しました。

加えて、OpenAIのAPIから「カスタム情報のないChatGPT」に同じ質問を行うべく、以下のプログラムを実行させました。
import openai結果は以下の通りで、ブラウザのChatGPTから実行させた結果と同じでした。
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)

今回、LlamaIndexを用いて、個人のカスタムデータをChatGPTにつなぐことができることが分かりました。いろいろ応用が効きそうなので、面白いアイデアを考えてみようと思います。