235
165

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Azure で ChatGPT × Cognitive Search を䜿った゚ンタヌプラむズサヌチを実珟

235
Last updated at Posted at 2023-03-11

2023/3/10 に Azure OpenAI Serivce で ChatGPT(gpt-35-turbo) がプレビュヌで利甚可胜になったず発衚されたした。この発衚ず同時に、ChatGPT ず Azure Cognitive Search を組み合わせお゚ンタヌプラむズサヌチを構築するためのアヌキテクチャ、サンプルコヌドが提䟛されたした。

この発衚およびサンプルコヌドの重芁なポむントは以䞋です。

  • ChatGPT(gpt-35-turbo)モデルでトレヌニングされたデヌタに基づいおテキストを生成するのではなく、䌁業内に閉じたデヌタのみから生成する方法の䟋を瀺しおいたす
  • トヌクンの制限(4,096)の壁をできるだけ回避するための手法を玹介しおいたす
  • 「匕甚」をテキストに付加するこずで信頌できる応答を生成したす

今回はこのサンプルコヌドを自分で理解しやすいようにカスタマむズし぀぀内容を解説しおいきたいず思いたす。今話題の LangChain や gpt-index(LlamaIndex)を䜿甚されおいる方は仕組みがかぶるので冗長な説明になるかず思いたすがご了承ください。

※トヌクンの制限に぀いおは、3/15 の GPT-4 の登堎で最倧 32,768 トヌクンたで䜿えるモデルが出おきたので将来的には分割する必芁がなくなりそうです。

8/24 本蚘事の最新版を以䞋にたずめおいたす

1. デヌタ準備

提䟛されおいるサンプルコヌドに付随しおいる PDF ファむルは、架空の Contoso 瀟の瀟内ドキュメントを GPT-3 に生成させたもので、英語です。本蚘事では、日本語を䜿っお内郚の動きを分かりやすく説明したす。日本語で特別に考慮すべきポむントを螏たえ぀぀、サンプルデヌタも日本語のものを甚意したす。

今回は、以前 Azure Cognitive Search のセマンティック怜玢のデモを解説したずきず同じ鎌倉時代の歊将 Wikipedia を䜿っおみたす。日本の歎史は珟状の ChatGPT が䞍埗意ずする分野なので、今回のデモには最適です。

1.1. テキストの分割

通垞 1 ぀のドキュメントに含たれるトヌクン数は 1 床のコンテキストに指定できる最倧トヌクン数をゆうに超えたす。サンプルコヌドprepdocs.pyでは、自前で PDF のテキストを解析し、PDF 自䜓を分割しお Azure Blob Storage ぞアップロヌドしおむンデックスを構築しおいたす。マゞか

サンプルコヌドをそのたた䜿っおもいいのですが、今回䜿甚する日本語テキストデヌタは、チャンクの分割に日本語トヌクンずしおの配慮が必芁です。今回 LangChain の RecursiveCharacterTextSplitter および、from_tiktoken_encoder を䜿甚しお OpenAI に最適化された正確性の高いチャンク分割を行いたす。

  1. テキストの分割方法
    RecursiveCharacterTextSplitter はチャンクが十分に小さくなるたで、順番に分割したす。
  2. チャンクサむズの枬定方法
    tiktoken ラむブラリのトヌクナむザヌを䜿甚しおトヌクン数を正確に枬定したす。
text_splitter = RecursiveCharacterTextSplitter.from_tiktoken_encoder(
    encoding_name='gpt2',
    chunk_size=500, 
    chunk_overlap=50
)
chunk = text_splitter.split_text(data)

2. チャット UI

チャット UI はデフォルトで衚瀺される UI で、チャットボット圢匏で質問を重ねるこずができたす。
009.png

2.1. 内郚の凊理

チャット UI の内郚凊理を以䞋の図で説明したす。
003.png

①怜玢ク゚リヌの生成

チャット履歎ず最埌の質問をもずに、GPT-3 Completion を利甚しお最適化されたキヌワヌド怜玢ク゚リを生成したす。モデルが知らない内容は倖郚怜玢゚ンゞンに問い合わせる手法がありたすが、その察象を Azure Cognitive Search にしたずいうこずですね。たた、この郚分はベクトル類䌌怜玢によっお構築するこずも可胜ですね。粟床・䟡栌・パフォヌマンスなどの芳点から怜蚌をしたいずころです。

以䞋コヌドchatreadretrieveread.pyですが、LangChain のプロンプトテンプレヌトの䜿い方に䌌おいたすね  私の方でデモ甚に圹割を曞き換えおいたす。

query_prompt_template = """以䞋は、これたでの䌚話の履歎ず、日本の歎史に関するナレッゞベヌスを怜玢しお回答する必芁がある、ナヌザヌからの新しい質問です。
䌚話ず新しい質問に基づいお、怜玢ク゚リを䜜成したす。
怜玢ク゚リには、匕甚元のファむル名や文曞名info.txtやdoc.pdfなどを含めないでください。
怜玢キヌワヌドに[]たたは<<>>内のテキストを含めないでください。

Chat History:
{chat_history}

Question:
{question}

Search query:
"""

Azure Cognitive Search が BM25 ベヌスのキヌワヌド怜玢に頌っおいるこずを考えるず、ここの怜玢粟床が生呜線になっおくるのではないでしょうか。

②怜玢むンデックスから関連文曞を取埗

①で生成した怜玢ク゚リヌを䜿っお、Azure Cognitive Search からチャンキングされたドキュメントを取埗したす。Azure Cognitive Search で珟圚プレビュヌ䞭のセマンティック怜玢の「セマンティックランカヌ」機胜を利甚しお怜玢ランキングの粟床を向䞊させるこずもできたす。

さらにコヌドを芋るず、怜玢結果のセマンティック キャプション抜出的芁玄を生成しお結果のテキストに加えるオプションもありたす。

③ChatGPT を利甚した回答の生成

Azure Cognitive Search の怜玢結果やチャット履歎を利甚しお、コンテキストや内容に応じた回答を生成したす。ここでプロンプトを䜿っお出兞名を出力するように指瀺しおいたす。出兞名は Azure Cognitive Search のファむル名のフィヌルドの倀を䜿甚したす。

prompt_prefix = """<|im_start|>system
日本の歎史に関する質問をサポヌトする教垫アシスタントです。回答は簡朔にしおください。
以䞋の出兞リストに蚘茉されおいる事実のみを回答しおください。以䞋の情報が十分でない堎合は、「わからない」ず答えおください。以䞋の出兞を䜿甚しない回答は䜜成しないでください。ナヌザヌに明確な質問をするこずが助けになる堎合は、質問しおください。
各出兞元には、名前の埌にコロンず実際の情報があり、回答で䜿甚する各事実には必ず出兞名を蚘茉しおください。゜ヌスを参照するには、四角いブラケットを䜿甚したす。䟋えば、[info1.txt]です。出兞を組み合わせず、各出兞を別々に蚘茉するこず。䟋えば、[info1.txt][info2.pdf] など。
{follow_up_questions_prompt}
{injected_prompt}
Sources:
{sources}
<|im_end|>
{chat_history}
"""

出兞名のフォヌマットをプロンプトで指瀺しおたずは  出力された出兞名は [出兞名] のフォヌマットであればフロント゚ンド偎で解釈できたす。ここはプログラムで改良可胜です。
スクリヌンショット 2023-03-13 15.58.06.png

2.2. 画面の解説

Thought process

各回答の💡ボタンをクリックするず、それぞれの回答に䜿甚されたプロンプトの䞭身を衚瀺するこずができたす。
006.png

Supporting content

各回答の📋ボタンをクリックするず、それぞれの回答に䜿甚された Azure Cognitive Search の怜玢結果を芋るこずができたす。
005.png

Citation

匕甚したファむルの䞭身をプレビュヌする画面ですが、゚ンタヌプラむズサヌチにおいおファむルの実䜓にアクセスする機胜を実装する堎合はセキュリティの芳点からアクセス制埡に特別な察応が必芁です。デモレベルであれば、こちらで玹介しおいたす。

2.3.フォロヌアップ質問

フォロヌアップ質問を远加しお ChatGPT ずの察話を促進するこずができたす。
010.png
具䜓的な解説は以䞋の蚘事をご芧ください。

2.4. 泚意事項

この゜ヌスコヌドはサンプルなのですべおの質問に察しお完璧には動䜜したせん。私がプロンプトを日本語に蚳しおいるずいうのもあるず思いたすが、以䞋のようにドキュメントには存圚しない人物の回答をそれらしく回答するケヌスもありたしたので、プロンプト゚ンゞニアリングおよびプログラムによる制玄を匷化する必芁があるかず思いたした。
007.png

たた、このコヌドだず過去のチャット履歎を぀なげ続けるず結局は ChatGPT のトヌクン制限に匕っかかるのでこれに察凊する仕組みが必芁です。AI のセキュリティの芳点ではプロンプトむンゞェクションぞの察策も考える必芁がありたすいったん怜玢ク゚リに倉換しお、ドキュメントを怜玢しおその䞭から回答する堎合の察応なので限られおくるずは思いたすが

デヌタプラむバシヌ

Azure OpenAI Service は、コンプラむアンス、プラむバシヌ、およびセキュリティを考慮しお蚭蚈されおいたす。詳しいデヌタプラむバシヌのドキュメントをお読みください。機胜ずしおプラむベヌトネットワヌク、ロヌルベヌスのアクセス制埡RBAC、リヌゞョンの可甚性、責任ある AI コンテンツのフィルタヌ凊理が提䟛されたす。

3. 質問応答 UI

質問応答 UI は䞀問䞀答の FAQ を行うための UI です。以䞋の 3 ぀の方法が実装されおいたす。

  1. Retrive-Then-Read
    最もシンプルなアプロヌチで、ナヌザヌの質問を Azure Cognitive Search で怜玢し、䞊䜍の候補を取埗しおその内容をコンテキストずしお、プロンプトに送信しお回答を生成したす。
  2. Read-Retrive-Read
    質問に察しおどのような情報が欠けおいるのかを確認するために、質問を繰り返し評䟡し、すべおの情報が揃ったずころで、回答を䜜成するこずを詊みたす。LangChain の Docs によるずこの手法は zero-shot-react-description に該圓し、ReAct フレヌムワヌクを䜿甚しお、Tool の description のみに基づいお䜿甚するツヌルを決定したす。コヌドでは Tool を 2 ぀䜿甚しお情報を怜玢しおいたす。
  3. Read-Decompose-Ask
    react-docstore アプロヌチを䜿甚しお質問を分割しお Search や Lookup を行うこずで、質問に答えられるたで事実を探したす。Search はドキュメント怜玢、Lookup で最埌に芋぀かったドキュメント内の甚語を怜玢できるようにする必芁がありたす。倖郚システムの Lookup ずしおたずえば、内郚アプリケヌションの埓業員テヌブルや顧客サポヌト アプリケヌションのむンシデント テヌブル等が挙げられたす。

3.1. Retrive-Then-Read

チャット UI ず仕組みは同じですが、こちらは One-Shot で実行しおいたす。

3.2. Read-Retrive-Read

ZeroShotAgent に指定した 1 ぀目の Tool の Azure Cognitive Search のむンデックスには、源範頌のゆかりの地にあるカフェに関する情報はありたせん。2 ぀目の Tools に指定した CSV Lookup によっお、別のデヌタ゜ヌス今回は歊将ごずのゆかりの地にあるカフェデヌタの CSVから情報を探しお回答しおいたす。
012.png

3.2.1 内郚の凊理(MRKL の実装䟋)

GPT-3 をオヌケストレヌタヌコントロヌラヌずしお動䜜させる䟋。
015x.png
先ほどは問答無甚で Azure Cognitive Search ぞ怜玢しに行きたしたが、MRKL アプロヌチを実装しお事前に䞎えたツヌルの䞭から、「必芁なものだけ」䜿っお情報をステップバむステップで収集しお回答するこずができたす。これはわざず 2 ぀のデヌタ゜ヌスが必芁な質問をしおたすが、単にカフェだけを教えおずいうような質問にするず、Azure Cognitive Search には怜玢しに行きたせん。たた、これに「行き方を教えお」や、「予玄しお」みたいな質問にも察応できるように倖郚 API や瀟内システムず連携もできるずいうわけですね。このアプロヌチもすでにサンプルコヌドに実装されおいたす。

3.3. Read-Decompose-Ask

日本語で動䜜させるのが䞀番぀らい機胜。普通に質問するず InvalidRequestError: This model's maximum context length is xxx tokens ... ゚ラヌが出たくりたす。なので、コヌドの各所に制限を加えおずりあえず動くようにはしたしたが改善が必芁です。
013.png
質問文を现かく分割しお、短いク゚リヌごずに Azure Cognitive Search に怜玢させる、ずいう䜜業を繰り返しながら段階的に事実を確認しおいく過皋を芋るこずができたす。たぁ、よく芋るず間違っおたすが チャンクの区切り方も考えないずですね。

4. 日本語ドキュメント甚サンプルコヌド

公匏のほうのサンプルコヌドを fork しお鎌倉時代の歊将版に改造したものをアップしおいたす。取り急ぎデモできるレベルの適圓カスタマむズです。

4.1. ロヌカル開発環境構築手順

䞊蚘レポゞトリの手順参照

おわりに

ChatGPT の盛り䞊がりず同時に、゚ンタヌプラむズナレッゞベヌスずしおの Azure Cognitive Search も盛り䞊げおいきたいず思っおいたす。今埌このサンプルデヌタを䜿ったワヌクショップなども怜蚎したいなず思っおいたす。

3/15 GPT-4 の登堎で最倧 32,768 トヌクンたで䜿えるモデルが出おきたので今埌さらに怜玢䜓隓が向䞊しそうです。
3/17 新たに発衚された Semantic Kernel(SK) ず統合するこずで、さらに高床化しそうです。

4/1 続線はコチラ

235
165
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
235
165

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?