「OpenAIキーなしでPDFおよび記事のための強力なチャットアシスタントを作成する」

「PDFおよび記事作成のための強力なチャットアシスタントをOpenAIキーなしで作成する」

イントロダクション

自然言語処理の世界は、特に大規模な言語モデルの登場により、膨大な拡大を遂げています。これらのモデルは、この分野を革新し、誰でも利用できるようにしました。この記事では、オープンソースライブラリを使用して、与えられた記事(またはPDF)を基に質問に応答できる強力なチャットアシスタントを作成するためのNLP(自然言語処理)のテクニックを探求し、実装していきます。OpenAIのAPIキーは必要ありません。

この記事は、データサイエンスブログマラソンの一環として公開されています。

ワークフロー

このアプリケーションのワークフローは以下の通りです:

ユーザーは、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!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

AI研究

「韓国のAI研究がマギキャプチャを紹介:主題とスタイルの概念を統合して高解像度のポートレート画像を生成するための個人化手法」

人々はよく、履歴書や結婚式などに適した高品質の肖像写真を作成するために、写真スタジオに通ったり、高価で時間のかかる画...

機械学習

ヴェクタラは、AI言語モデルの「幻覚」をベンチマーク化し、対処するための画期的なオープンソースモデルを立ち上げます

急速に進化するGenerative AI(GenAI)領域での責任追及を促進する前例のない取り組みとして、Vectaraはオープンソースの幻覚...

機械学習

ジャクソン・ジュエットは、より少ないコンクリートを使用する建物の設計をしたいと考えています

「博士課程の学生は、少ない材料で大規模な構造物を設計するためのアルゴリズムを磨いていますこれにより、建設業界の巨大な...

機械学習

このAI論文は、「GREAT PLEA」倫理的フレームワークを提案しています:医療における責任あるAIのための軍事に焦点を当てたアプローチ

ピッツバーグ大学、ウェル・コーネル・メディシン、テレメディシン&先進テクノロジー研究センター、統合失調症(USU)、ブル...

AI研究

Googleとジョージア工科大学の研究者が、セグメンテーションマスクを作成するための直感的な後処理AIメソッドであるDiffSegを紹介しました

セマンティックセグメンテーションとして知られるコンピュータビジョンのタスクの目的は、画像内の各ピクセルにクラスまたは...

データサイエンス

「解釈力を高めたk-Meansクラスタリングの改善」

「クラスタリングは、一組のオブジェクトをグループ化する非監督学習のタスクであり、同じグループ内のオブジェクトには他の...