【No.L016】社内ドキュメント学習: RAG(Retrieval-Augmented Generation)技術の実装手順と実行方法

はじめに

最近はやりの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"]

コメント