「OpenAIキーなしでPDFおよび記事のための強力なチャットアシスタントを作成する」
「PDFおよび記事作成のための強力なチャットアシスタントをOpenAIキーなしで作成する」
イントロダクション
自然言語処理の世界は、特に大規模な言語モデルの登場により、膨大な拡大を遂げています。これらのモデルは、この分野を革新し、誰でも利用できるようにしました。この記事では、オープンソースライブラリを使用して、与えられた記事(またはPDF)を基に質問に応答できる強力なチャットアシスタントを作成するためのNLP(自然言語処理)のテクニックを探求し、実装していきます。OpenAIのAPIキーは必要ありません。
この記事は、データサイエンスブログマラソンの一環として公開されています。
ワークフロー
このアプリケーションのワークフローは以下の通りです:
- アマゾンは、革新的なAIスタートアップのAnthropicに最大40億ドルの投資を計画しています
- 「ChatGPTの現実世界での応用」
- ‘未知に挑む検索 強化生成 (RAG) | AIが人間の知識と出会う場所’
ユーザーは、PDFファイルまたは記事のURLを提供し、質問を行います。このアプリケーションは、提供されたソースに基づいて質問に答えることを試みます。
私たちは、PYPDF2ライブラリ(PDFファイルの場合)またはBeautifulSoup(記事のURLの場合)を使用してコンテンツを抽出します。次に、langchainライブラリのCharacterTextSplitterを使用して、それをチャンクに分割します。
各チャンクに対して、all-MiniLM-L6-v2モデルを使用して、対応する単語埋め込みベクトルを計算します。このモデルは、文章や段落を384次元の密なベクトル空間にマッピングするためのものです(単語埋め込みは、単語/文章をベクトルとして表現する技術の一つです)。同じ技術がユーザーの質問にも適用されます。
これらのベクトルは、sentence_transformersというPythonのフレームワークが提供する意味的検索関数に入力されます。sentence_transformersは、最先端の文、テキスト、画像埋め込みを行うためのフレームワークです。
この関数は、答えを含む可能性があるテキストチャンクを返し、質問応答モデルは、semantic_searchとユーザーの質問の出力に基づいて最終的な答えを生成します。
注意
- すべてのモデルは、HTTPリクエストのみを使用してAPI経由でアクセス可能です。
- コードはPythonを使用して書かれます。
- FAQ-QNは、より詳細な情報についてはFAQセクションを参照することを示すキーワードです。
実装
このセクションでは、実装についてのみに焦点を当て、詳細はFAQセクションで提供されます。
依存関係
依存関係をダウンロードし、それらをインポートすることから始めます。
pip install -r requirements.txt
numpytorchsentence-transformersrequestslangchainbeautifulsoup4PyPDF2
import torchimport numpy as npfrom sentence_transformers import utilfrom langchain.text_splitter import CharacterTextSplitterfrom bs4 import BeautifulSoupimport requests
- torch:テンソルを扱う際に非常に便利なライブラリ(Pytorchライブラリ)。
- requests:HTTPリクエストを送信するためのライブラリです。
コンテンツの抽出
PDFの場合:
try: pdf=PdfReader(path_pdf_file) result='' for i in range(len(pdf.pages)): result+=pdf.pages[i].extract_text() except: print('PDFファイルが存在しません')) exit(0)
記事の場合、h1、p、li、h2などのHTMLタグ間のコンテンツを見つけることを試みます(これらのタグは、VoAGIなどのウェブサイトに適しており、他のウェブサイトでは異なる場合があります)。
try: request=requests.get(URL_LINK) request=BeautifulSoup(request.text,'html.parser') request=request.find_all(['h1','p','li','h2'])except: print('無効なURLリンクです') exit(0)result=[element.text for element in request]result=''.join(result)
チャンクに分割する
それぞれのチャンクには1000トークンが含まれ、チャンク同士を関連付け、分離を防ぐために200トークンがオーバーラップします。(FAQ-Q2)
text_splitter = CharacterTextSplitter( separator="\n", chunk_size=1000, chunk_overlap=200, length_function=len ) chunks = text_splitter.split_text(result)
ワード埋め込み
ハーフィングフェイスからall-MiniLM-L6-v2モデルをダウンロードするか、APIとしてHTTPリクエストでアクセスできます。 (FAQ-Q1)
注意:ハーフィングフェイスのAPIにアクセスするためには、サインアップ(無料)してトークンを取得する必要があります。
hf_token='ここにハーフィングフェイスのアクセストークンを入力'api_url= """https://api-inference.huggingface.co/pipeline/feature-extraction/sentence-transformers/all-MiniLM-L6-v2"""headers = {"Authorization": f"Bearer {hf_token}"} def query(texts): response = requests.post(api_url, headers=headers, json={"inputs": texts, "options":{"wait_for_model":True}}) return response.json()user_question = 'ここに質問を入力'question = query([user_question]) query_embeddings = torch.FloatTensor(question) output=query(chunks) output=torch.from_numpy(np.array(output)).to(torch.float)
query関数は384次元の密ベクトルを返し、semantic_search関数のために‘torch.Float’およびFloatTensorに変換する必要があります。
意味検索
最終結果は、回答が含まれる可能性のある2つのテキストチャンクです(QAモデルから正しい回答を得る確率を高めるために、top_k=2としました)。(FAQ-Q4)
result=util.semantic_search(query_embeddings, output,top_k=2)final=[chunks[result[0][i]['corpus_id']] for i in range(len(result[0]))]
質問応答モデル
テキストチャンク(コンテキスト)と質問があるため、使用するモデルは自由に選択できます(ハーフィングフェイスのQAモデルを使うためのアイデアを得るために、QAモデルのハーフィングフェイスを見てみることもできます)。私はAI21studioの質問応答モデルを選びましたが、アクセストークンを取得するために無料でサインアップします。
AI21_api_key = 'AI21studioのAPIキー'url = "https://api.ai21.com/studio/v1/answer" payload = { "context":' '.join(final), "question":user_question } headers = { "accept": "application/json", "content-type": "application/json", "Authorization": f"Bearer {AI21_api_key}" } response = requests.post(url, json=payload, headers=headers) if response.json()['answerInContext']: print(response.json()['answer'])else: print('ドキュメント内に回答が見つかりません ⚠️、質問を再度整理してください。')
このモデルは回答がコンテキストにあるかどうかを確認できます(大規模な言語モデルを使用する場合、提供されたコンテキストと関係のない質問に回答する問題が発生する可能性があります)。(FAQ-Q3)****
まとめ
このプロジェクトをさまざまなソース入力(PowerPointファイル、YouTubeビデオ/オーディオ、スライド、オーディオブック)に拡張することができ、比較的低コストで実現できますので、自由にカスタマイズしてご利用ください。また、このアプリケーションのためのシンプルなUIを作成してホストすることもできます。
私が使用したのはStreamlitです(githubリポジトリはこちらですが、スターのボタンをクリックするのを忘れないでください。
この記事では、PDFファイル/記事に対して強力なチャットアシスタントを作成しました。
- ソースからテキストを抽出するためにウェブスクレイピングの技術を使用しました。
- テキストを複数のチャンクに分割しました。
- 各チャンクとユーザーの質問に対してワード埋め込みベクトルを計算しました。
- 最も関連性の高いテキストチャンクを検出するために意味検索関数を適用しました。
- 質問応答モデルにより最終的な回答が提供されました。
ご協力いただき、ありがとうございます。さらなるご支援が必要な場合は、以下の連絡先にお問い合わせください:
LinkedIn : SAMY GHEBACHE
Email : [email protected]。
よくある質問
この記事に表示されるメディアはAnalytics Vidhyaの所有ではなく、著者の裁量により使用されています。
We will continue to update VoAGI; if you have any questions or suggestions, please contact us!
Was this article helpful?
93 out of 132 found this helpful
Related articles