はじめに
複数のデータベースに埋もれてしまっているナレッジをChatGPTを利用していつでも取り出して再利用できる環境を整えたい。まずはRedmineのプラグインであるKnowledgebaseの内容をOpenAIのGPTで扱うことを試みる。
結論
ナレッジを取り出して再利用するために、RedmineのKnowledgebaseを利用し、OpenAIのGPTを使用して質問と回答の実験を行った。質問に対応したナレッジを検索しGPTに与えることでGTPが適切な回答を出力できることを確認した。
質問 | 回答 | |
---|---|---|
1 | ラズパイでスクリーンショットを撮りたい | 以下の手順でラズパイでスクリーンショットを撮ることができます。1. ラズパイにログインし、ターミナルを開きます。... |
2 | ナレッジDBをexportしたい | この場合、30分で作成されたエクスポートスクリプトを使用することができます。手順は以下の通りです。... |
用意するもの
本記事では実行環境としてGoogle Colabを利用する
- Google Colab アカウント : https://colab.research.google.com/?hl=ja
- OpenAI API キー : https://openai.com/blog/openai-api
前提
下記のページに記載している内容は省く
Knowledgebaseのデータを取り込む
RedmineのプラグインであるKnowledgebaseのデータをRedmineのIssueチケットのようにCSV形式で一括ダウンロードしたい。
データをExportする仕組みがない
驚いたことにKnowledgebaseのデータをExportするための仕組みが用意されていないようだ。
ブラウザ経由で力技でデータを取り込む
Webブラウザの操作を自動化するフレームワークであるSeleniumを使って力技でKnowledgebaseのデータをCSV形式で保存することにした。 M1 MacBook で動作確認したプログラムを示しておく。
取り込んだデータを下記のようにCSV形式でknowledge_db.csv
ファイルに保存しGoogle Colabへアップロードする
subject | description | source |
---|---|---|
タイトル 1 | 記事の内容 1 | 元データのURL 1 |
タイトル 2 | 記事の内容 2 | 元データのURL 2 |
... | ... | ... |
GPTを利用して埋もれたナレッジを取り出す
必要なライブラリをGoogle Colabの環境にインストールする
%%writefile requirements.txt
openai
tiktoken
chromadb
langchain
%pip install -U requests
%pip install -r requirements.txt
ソースコード
CharacterTextSplitterのセパレータがデフォルト値 "\n\n"
だとchunk_sizeが大きくなりgptの許容値を頻繁に越えるため "\n"
に変更した。
import os
import platform
import openai
import chromadb
import langchain
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders.csv_loader import CSVLoader
from langchain.text_splitter import CharacterTextSplitter
from langchain.text_splitter import RecursiveCharacterTextSplitter
# load
loader = CSVLoader(file_path='./knowledge_db.csv', source_column='source')
data = loader.load()
text_splitter = CharacterTextSplitter(
separator = "\n", # セパレータ
chunk_size = 1000, # チャンクの文字数
chunk_overlap = 0, # チャンクオーバーラップの文字数
)
docs = text_splitter.split_documents(data)
# Preprocessing for using Open AI
os.environ["OPENAI_API_KEY"] = '<Your API Key>'
openai.api_key = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()
# Stores information about the split text in a vector store
vectorstore = Chroma.from_documents(docs, embedding=embeddings, persist_directory=".")
vectorstore.persist()
# IF for asking OpenAI
csv_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)
質問1と回答
# Question
query = 'ラズパイでスクリーンショットを撮りたい'
chat_history = []
result = csv_qa({"question": query, "chat_history": chat_history})
print(result["answer"])
[GPTが作成した回答]
以下の手順でラズパイでスクリーンショットを撮ることができます。
1. ラズパイにログインし、ターミナルを開きます。
2. 以下のコマンドを入力して、scrotをインストールします。
sudo apt install scrot
3. 以下のコマンドを入力して、スクリーンショットを撮影します。
scrot
4. スクリーンショットが保存されます。
# Review the original set of texts related to the above responses.
for doc in result['source_documents']:
print(doc.page_content.split('\n', 1)[0])
print(doc.metadata)
GPTは主にRaspberryPi3 でのスクリーンショット取得方法
というタイトルを持つ記事を利用して回答を作成していた。記事内にラズパイ
やスクリーンショット
というキーワードが含まれておりGPTに必要な記事を渡せたようだ。
質問2と回答
# Question
query = 'ナレッジDBをexportしたい'
chat_history = []
result = csv_qa({"question": query, "chat_history": chat_history})
print(result["answer"])
[GPTが作成した回答]
この場合、30分で作成されたエクスポートスクリプトを使用することができます。手順は以下の通りです。
- カテゴリのtableのHTMLをdevtoolsでコピーする。 https://省略/knowledgebase/categories/124
- ChatGPTにHTMLを送信して、「このHTMLからURLのリストを取得してください」とリクエストします。
- URLのリストをChatGPTに送信して、「これらのURLのリストからPDFをダウンロードして、devtoolsで実行してください」とリクエストします。
- DevToolsにJSを送信して、PDFをダウンロードします。
この手順に従うことで、ナレッジDBをPDF形式でエクスポートすることができます。ただし、この手順はChatGPTによって作成されたものであり、実際に使用する場合は注意が必要です。
GPTはKnowledgebase の PDF 一括エクスポート方法(を ChatGPT に30分で作ってもらった)
というタイトルの記事を利用して回答を作成していた。