はじめに
最近はやりのChatGPT。確かに便利だけど、社内で使うドキュメントも学習させたい…という方向けにRAG(Retrieval-Augmented Generation:検索拡張生成)という技術を紹介。これを使えば、社内のパワポファイルとかの中身を比較的簡単にOpenAIなどの大規模言語モデルに組み込むことができる。今回は会社で使うことを想定して、ローカル環境で実施できる形で解説。
★関連リンク
業務で活用できるAI技集のまとめはこちら
会議時に自動で議事録をとりたい方はこちら
社内資料をAIを使って検索・要約したい方はこちら
資料用の簡単な図をChatGPTに書かせたい方はこちら
資料用の簡単な絵をChatGPTに書かせたい方はこちら
研修のワークやe-learningをAIにサポートしてもらいたい方はこちら
手順(OpenAIの場合)
⓪OpenAIのAPIを取得 [5分]
別ページで解説しているので、こちらを参照。
①必要ライブラリのインストール [3分]
まずはpipもしくはconda等を使って必要なライブラリを入れる。バージョンについては指定しないが、もし動作しなかった場合は参考の値を参照頂きたい。
pip install openai
pip install chromadb
pip install langchain
pip install pypdf
pip install tiktoken
[参考] ライブラリのVersion
openai 1.25.0
chromadb 0.5.0
langchain 0.1.17
pypdf 4.2.0
tiktoken 0.6.0
②各種設定・準備 [1分]
基本コピペで問題ないが、pdfファイルのパスとOpenAIのAPI KEYを入力する必要あり。pdfファイルはこのコードと同じ階層に保存するのであれば、ファイル名だけ記載でOK.
import os
import platform
import openai
import chromadb
import langchain
from langchain.embeddings.openai import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chat_models import ChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader
#任意のpdfファイルを指定
loader = PyPDFLoader("xxxxxx.pdf")
pages = loader.load_and_split()
#ご自身のOpenAIのAPIkeyを指定
os.environ["OPENAI_API_KEY"] = 'xxxxxxxxxx'
openai.api_key = os.getenv("OPENAI_API_KEY")
llm = ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo")
embeddings = OpenAIEmbeddings()
vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()
pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)
[参考] RAGのざっくり解説
RAGのポイントはpdfの中身をベクトル化して予めデータベースを作成しておくこと。そして質問をする際には、質問文のテキストをベクトル化してデータベースのベクトルと照合し、意味的に近しいものを抽出した上で、LLM(GPT-3.5等)を使ってしっかりした回答文を作っている。
[1~13行目] 前半部のimportとfromから始まる部分は必要なライブラリを読み込んでいる。
[16~17行目] pdfを読み込んで分割。
[20~22行目] OpenAIのAPI設定。ちなみにtempertureを上げると回答のバラつきが多くなる。
[24~26行目] 分割したpdfの中身をembedding(ベクトル化)して保存
[28行目] 前述のベクトルデータを参照しつつOpenAIのモデルを使うことを定義
③実行 [1分]
実行して問題なければ、質問に対する回答が出てくる。例えばGPT-3.5のカットオフ(学習データの期間)は2021年9月なので、それ以降に発生した事象については本来回答できないはずだが、対象のpdfにその内容が書いてあれば、このプログラムではしっかり回答を出してくれる。
query = "ここに好きな質問を記載する"
chat_history = []
result = pdf_qa({"question": query, "chat_history": chat_history})
result["answer"]
手順(AzureOpenAIの場合)
①必要ライブラリのインストール [3分]
まずはpipもしくはconda等を使って必要なライブラリを入れる。バージョンについては指定しないが、もし動作しなかった場合は参考の値を参照頂きたい。
pip install openai
pip install chromadb
pip install langchain
pip install pypdf
pip install tiktoken
[参考] ライブラリのVersion
openai 1.25.0
chromadb 0.5.0
langchain 0.1.17
pypdf 4.2.0
tiktoken 0.6.0
②各種設定・準備 [1分]
OpenAIのときと比較して設定する項目は多いが、仕組みは同じ。
import os
import platform
import openai
import chromadb
import langchain
from langchain.embeddings import AzureOpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.text_splitter import CharacterTextSplitter
from langchain.chat_models import AzureChatOpenAI
from langchain.chains import ConversationalRetrievalChain
from langchain.document_loaders import PyPDFLoader
#任意のpdfファイルを指定
loader = PyPDFLoader("xxxxxx.pdf")
pages = loader.load_and_split()
#ご自身のOpenAIのAPIkeyを指定
openai_api_type = 'azure'
openai_api_key = '長いランダムな英数字'
openai_api_version = 'バージョン(例:2023-12-01-preview)'
azure_endpoint = 'エンドポイント(例:https://zzzzzzzzzzz)'
name_model = 'model名(例:GPT-3.5-Turbo)'
name_embed = 'embed名(例:text-embedding-ada-002)'
deployment_model = 'modelのデプロイ名(例:gpt-35-turbo-0613)'
deployment_embed = 'embedのデプロイ名(例:text-embedding-ada-002)'
llm = AzureChatOpenAI(openai_api_version = openai_api_version,
azure_endpoint = azure_endpoint,
openai_api_key = openai_api_key,
model = name_model,
azure_deployment = deployment_model)
embeddings = AzureOpenAIEmbeddings(openai_api_version = openai_api_version,
azure_endpoint = azure_endpoint,
openai_api_key = openai_api_key,
model = name_embed,
azure_deployment = deployment_embed)
vectorstore = Chroma.from_documents(pages, embedding=embeddings, persist_directory=".")
vectorstore.persist()
pdf_qa = ConversationalRetrievalChain.from_llm(llm, vectorstore.as_retriever(), return_source_documents=True)
③実行 [1分]
実行して問題なければ、質問に対する回答が出てくる。例えばGPT-3.5のカットオフ(学習データの期間)は2021年9月なので、それ以降に発生した事象については本来回答できないはずだが、対象のpdfにその内容が書いてあれば、このプログラムではしっかり回答を出してくれる。
query = "ここに好きな質問を記載する"
chat_history = []
result = pdf_qa({"question": query, "chat_history": chat_history})
result["answer"]
コメント