「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

機械学習

vLLMについて HuggingFace Transformersの推論とサービングを加速化するオープンソースLLM推論ライブラリで、最大24倍高速化します

大規模言語モデル、略してLLMは、人工知能(AI)の分野において画期的な進歩として登場しました。GPT-3などのこのようなモデル...

機械学習

『DiffBIRを紹介:事前学習済みのテキストから画像への拡散モデルを使用して、盲目的な画像修復問題に対処するAIアプローチ』

人工知能の分野での重要な進歩により、自然言語処理、自然言語理解、コンピュータビジョンなどのAIのサブフィールドも急速に...

機械学習

鑑識分類器をだます:敵対的な顔生成における生成モデルの力

ディープラーニング(DL)の最近の進歩、特に生成的対抗ネットワーク(GAN)の領域では、存在しない高度にリアルかつ多様な人...

機械学習

「Flowsに会いましょう:複雑なAI-Humanの相互作用をモデル化するための革命的なAIフレームワーク」

人工知能の最近の進歩により、コンテキスト内の情報に驚くほど適応することができるため、構造化された推論の多くの機会が生...

機械学習

「BeLFusionに出会ってください:潜在的拡散を用いた現実的かつ多様な確率的人間の動作予測のための行動的潜在空間アプローチ」

人工知能(AI)が世界を魅了し続ける中で、コンピュータビジョンとAIの交差点において、人間の動き予測(HMP)という注目すべ...

AIニュース

3Dプリンターからの錠剤

ドイツのマックス・プランク情報学研究所とカリフォルニア大学デービス校の科学者たちは、液体溶解性の錠剤を3Dプリントしました