「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

コンピュータサイエンス

「世界で最も洗練された道路を建設するためのプロジェクトの作業が開始されました」

「ウェイン郡、ミシガン州のインターステート94における「世界で最も洗練された道路」とされる建設が始まったと、当局は発表...

AI研究

「このAppleのAI研究は、ジェンダーステレオタイプに関するLLMsの振る舞いの既知の問題を調査します」

大規模言語モデル(LLM)は、ここ数ヶ月で非常に進歩し、さまざまな分野で最先端のベンチマークを押し上げてきました。大規模...

AI研究

研究者は、解釈可能で効率的な量子風機械学習のためのテンソルネットワークを研究しています

<img alt=”” src=”https://ai.miximages.com/www.marktechpost.com/wp-content/uploads/2023/11/Screen...

データサイエンス

「なぜ機械は思考できるのか」というテーマに関して

17世紀に、レネ・デカルトは比較的新しい考えを紹介しましたーCogito ergo sum(「私は考える、ゆえに私は存在する」)この簡...

コンピュータサイエンス

アルゴリズムは、不妊症の男性の精子を医師よりも速く正確に見つけます

そのツールは即座に精子を識別し、その後、胚培養学者に判断を委ねます判断の内容は、精子が実際に存在しているかどうか、お...

データサイエンス

LAION AIは、Video2Datasetを紹介しますこれは、効率的かつスケールでビデオとオーディオのデータセットをキュレーションするために設計されたオープンソースツールです

CLIP、Stable Diffusion、Flamingoなどの大規模な基盤モデルは、過去数年間にわたり、マルチモーダルな深層学習を劇的に向上...