📘

LangChainを活用したRAGの構築、59ページもあるデジタル庁が公開した「テキスト生成AI利活用におけるリスクへの対策ガイドブック」

2024/06/05に公開

テキスト生成AI利活用におけるリスクへの対策ガイドブック

59ページもある

3行まとめ

・LangChainで手軽にRAGを組んでみる
・Google Colaboratoryで動作を確認する
・RAGをざっくり理解する

RAGとは

検索拡張生成(Retrieval Augmented Generation、RAG)があり、これはLLMを文書検索を使用して拡張するもので、ときにはベクトルデータベース(英語版)を使うこともある。クエリが与えられると、文書検索ツールが呼び出され、もっとも関連性が高い文書が取得される(通常、初めにクエリと文書をベクトルで符号化し、次にクエリベクトルにユークリッドノルムで最も近いベクトルを持つ文書を検索する)。その後、LLMは、クエリと取得した文書の両方に基づいて出力を生成する。[1]

生成AIは非常に優れている技術ですが、弱点として、間違った情報を正しい情報のように答えてしまうハルシネーションが発生することが懸念されています。
またモデルが学習した時になかった情報については答えることができません。

そこで、インターナルなデータや公的機関が提供している正しい情報をベクトルストアとしてLLMと連携することにより、
質問者のクエリに対して文書検索をし、最も関連性が高いドキュメントをソースとして回答が生成されるようになります。
これはLLMの弱点を補う手法として期待されています。

・チャットボットアプリケーションの開発
例:)顧客からの問い合わせに対して、過去のFAQやサポートドキュメントを検索し、関連情報を提供する。

・マーケティングやデータ分析の支援
例:)顧客の過去の行動データや購入履歴を検索し、最も効果的なマーケティングメッセージを生成する。

・大学や研究機関の情報収集の支援
例:)研究者が特定のトピックに関する質問をした際に、関連する学術論文やデータを検索し、情報を提供する。

LangChainとは?

LangChain

LangChainは、大規模言語モデル(LLM)を活用したアプリケーション開発を容易にするオープンソースのフレームワークです。
ChatGPTなどのLLMの機能を拡張できるライブラリであり、以下の主な機能を提供しています。

モデル:
異なるモデルを組み合わせ: LangChainでは、大規模言語モデル(LLM)やチャットモデル、テキスト埋め込みモデルなど、様々なモデルを組み合わせて使用できます。これにより、コーディングの手間を省くことができます。

LLMs:
大規模言語モデルを呼び出す機能で、質疑応答や文章要約などのタスクを実行できます(例: GPT-3.5、GPT-4、Flan-T5)。

チャットモデル:
LLMをチャット形式で使用したい場合に用います。チャット形式でやり取りするための応用的な機能を提供します。

ベクトル変換モデル:
単語や文章をベクトルに変換する処理を行い、2つの文章の関連性を定量的に測定できるようにします。

プロンプト:
プロンプトの管理や最適化を行う機能で、アプリ開発において重要です。

RAG:
外部データの利用: PDFやExcel、CSVなどの外部データをもとに回答を生成できます。
ChatGPTに指示を出す際に、外部データを使用して効率的に指示を送ることができます。

ファイルのダウンロード

テキスト生成AI利活用におけるリスクへの対策ガイドブック
こちらのページにアクセスし、資料のダウンロードから、pdfをダウンロードします。

ファイル名:20240530_resources_generalitve-ai-guidebook_01.pdf

作業環境

Google Colaboratory T4を使います。

構築

必要なライブラリのインストール

コード全体

動作を確認するためには次のライブラリが必要です。

!pip install -q langchain-community
!pip install -q langchain-core
!pip install -q transformers[torch]
!pip install -q sentence-transformers
!pip install -q faiss-cpu
!pip install -q pypdf

必要なライブラリのインポート

from langchain.document_loaders import HuggingFaceDatasetLoader
from langchain.text_splitter import RecursiveCharacterTextSplitter
from langchain.embeddings import HuggingFaceEmbeddings
from langchain.vectorstores import FAISS
from transformers import AutoTokenizer, AutoModelForQuestionAnswering
from transformers import AutoTokenizer, pipeline
from langchain import HuggingFacePipeline
from langchain.chains import RetrievalQA

PDFファイルのロード

pdfのロードはPyPDFLoaderを使ってロードします。

from langchain_community.document_loaders import PyPDFLoader

loader = PyPDFLoader("/content/20240530_resources_generalitve-ai-guidebook_01.pdf")
pages = loader.load_and_split()
print(pages)

ドキュメントを分割する

# RecursiveCharacterTextSplitterのインスタンスを作成します。チャンクサイズ1000,チャンクの重複サイズは150
text_splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=150)

# ドキュメントを分割します
docs = text_splitter.split_documents(pages)

Sentence Transformersでドキュメントのテキストをベクトル化する

# 日本語対応しているモデルを指定する
modelPath = "sentence-transformers/stsb-xlm-r-multilingual"

# GPUを有効にする
model_kwargs = {'device':'cuda'}

# エンコードオプションをOFFにします。 'normalize_embeddings' to False
encode_kwargs = {'normalize_embeddings': False}

# 上記のオプションを有効にしてHuggingFaceEmbeddingsを初期化します。
embeddings = HuggingFaceEmbeddings(
    model_name=modelPath,     # Provide the pre-trained model's path
    model_kwargs=model_kwargs, # Pass the model configuration options
    encode_kwargs=encode_kwargs # Pass the encoding options
)

PDFドキュメントをベクトルストアに取り込む

db = FAISS.from_documents(docs, embeddings)

ドキュメントの内容を検索してみる

question = "テキスト生成 AIの利活用について説明しているページは?"
searchDocs = db.similarity_search(question)
print(searchDocs[0].page_content)

ドキュメントの内容をLLMに読み込ませる

日本語対応に必要なライブラリ群をインストールする

!pip install -q fugashi
!pip install -q unidic_lite
!pip install -q ipadic
# 事前に学習されたモデルを読み込み、トークナイザーを作成する
tokenizer = AutoTokenizer.from_pretrained("tohoku-nlp/bert-base-japanese")

# 事前に学習されたBERTモデルを読み込み、質疑応答モデルを作成する
model = AutoModelForQuestionAnswering.from_pretrained("tohoku-nlp/bert-base-japanese")

BERTモデルを準備する

# 使用するモデルを定義します。
model_name = "tohoku-nlp/bert-base-japanese"

# 指定された事前学習モデルのトークナイザーをロードします。
tokenizer = AutoTokenizer.from_pretrained(model_name, padding=True, truncation=True, max_length=512)

# モデルとトークナイザーを定義して質疑応答モデルのパイプラインを作成します。
question_answerer = pipeline(
    "question-answering", 
    model=model_name, 
    tokenizer=tokenizer,
    return_tensors='pt'
)

# HuggingFacePipelineのインスタンスを作成します。
llm = HuggingFacePipeline(
    pipeline=question_answerer,
    model_kwargs={"temperature": 0.7, "max_length": 512},
)

Retrieverを準備する

retriever = db.as_retriever()

ドキュメントとLLMを関連づける

# 最大4つの関連する分割/ドキュメントを取得する検索構成を使用して、「データベース」から取得オブジェクトを作成します。
retriever = db.as_retriever(search_kwargs={"k": 4})

# RetrievalQA クラスを使用して質問応答インスタンス (qa) を作成します。
# 言語モデル (LLM)、chain_type "refine" で構成します。
qa = RetrievalQA.from_chain_type(llm=llm, chain_type="refine", retriever=retriever, return_source_documents=False)

LLMに質問して生成する

question = "生成AIを適切に利活用するユースケースは?"
result = qa.run({"query": question})
print(result["result"])

OutPut1:

OutPut2:

question = "生成AIの利用上のリスクは?"
result = qa.run({"query": question})
print(result["result"])

OutPut3:

オープンソースモデルの課題

Given the context information and not prior knowledge, answer the question: 生成AIの利用上のリスクは?
 argument needs to be of type (SquadExample, dict)

オープンソースモデルを利用した場合、アウトプットは正常に生成されますが
辞書として入力するようにValueErrorが発生します。

最後に

今回の記事では、LangChainを使ってRAG(検索拡張生成)を作成し、
デジタル庁が提供している生成AIのリスク対策ガイドブックを効果的に解析する方法をご紹介しました。

生成AIが時々間違った情報を正しいように見せてしまうハルシネーションの問題に対処するためには、
ベクトルストアの活用が重要です。

RAGを使うことで、顧客サポートやマーケティング、学術研究など、さまざまな分野での情報検索と生成がより効果的になります。
LangChainとRAGを活用すれば、信頼性の高い情報提供と効率的なデータ活用が期待できます。

その他の方法としてはGCP Vertex AIやSnowflake Cortexが考えられます

GCP

Snowflake Cortexは、6/5時点では英語のみの対応でした
EMBED_TEXT_768
(日本語対応おねがいします)

引用

テキスト生成AI利活用におけるリスクへの対策ガイドブック(α版)

Hugging face RAG

LangChain

bert base japanese

脚注
  1. 大規模言語モデル(Wikipedia) ↩︎

株式会社マインディア テックブログ

Discussion