「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はモバイルネットワークをより効率的にする

新しい人工知能モデルは、英国の通信業者の帯域幅効率を向上させ、モバイルネットワークの環境持続可能性を向上させる可能性...

機械学習

「Amazon SageMakerを使用してクラシカルなMLとLLMsを簡単にパッケージ化し、デプロイする方法 - パート1:PySDKの改善」

Amazon SageMakerは、開発者やデータサイエンティストが迅速かつ簡単に、いかなるスケールでも機械学習(ML)モデルを構築、...

データサイエンス

中国の研究者たちは、構造化データ上でのLLMのゼロショット推論能力を向上させるためにStructGPTを提案しています

大規模言語モデル(LLM)は、最近、自然言語処理(NLP)の分野で大きな進展を遂げています。既存の研究によれば、LLMは、タス...

AI研究

メタとUNC-Chapel Hillの研究者は、「Branch-Solve-Merge」という革新的なプログラムを導入しました:複雑な言語課題における大規模言語モデルの性能を向上させるプログラム

「BRANCH-SOLVE-MERGE(BSM)」は、複雑な自然言語タスクにおける大規模な言語モデル(LLM)を向上させるためのプログラムで...

機械学習

このAIの論文では、プログラミング言語が指示調整を通じて互いを向上させる方法について説明しています

大型言語モデル(LLM)の導入は世界中で大きな話題となっています。これらのモデルは、人間のように独自で創造的なコンテンツ...