独自のドキュメント Q&A ボットをカスタマイズする

最近、ChatGPT が非常に人気があり、その機能は非常に強力であり、強力な論理的推論能力とデータ バックグラウンドを備えています。しかし、ChatGPT がトレーニングしていない知識や独自のデータについてチャットするために ChatGPT を使用したい場合、ChatGPT はこの知識を学習していないため、答えは正確ではありません。

以下では、llama-index と ChatGPT API に基づいて提供されたデータに基づいてプライベート チャットボットをカスタマイズする方法を紹介します。

探査方法

1. 独自のデータをもとにロボットをカスタマイズしようと思ったら、まず思いつくのが微調整の方法。大量のデータを持つ GPT モデルを微調整して、提供するドキュメントを理解できるモデルを実現します。ただし、微調整には多額の費用がかかり、インスタンスを含む大規模なデータセットが必要です。また、ファイルが変更されるたびに微調整することもできません。より重要な点は、モデルが微調整のためにドキュメント内のすべての情報を「知る」ことは不可能ですが、モデルに新しいスキルを教えることができないということです。したがって、微調整はお勧めできません。

2. プライベート テキスト コンテンツをプロンプトのコンテキストとして使用して、ChatGPT で質問します。ただし、openai api の最大長には制限があり、ChatGPT 3.5 のトークンの最大数は 4096 であり、長さの制限を超えるとドキュメントが直接切り捨てられ、コンテキストが失われるという問題があります。また、API を呼び出すコストはトークンの長さに比例し、トークンの数が多すぎると、各呼び出しのコストが高くなります。

トークンは限られているため、トークンの数が制限を超えないようにテキスト コンテンツを前処理するためのツールはありますか。llama-index はそのようなツールの 1 つです. llama-index を使用すると、テキストから関連する部分のみを抽出して、プロンプトにフィードバックすることができます。

次に、llama-index と ChatGPT API を使用して、独自のデータに基づいて Q&A チャットボットを実装するためのステップバイステップのチュートリアルを提供します。

初期の準備:

  • OpenAI API キーは、https://platform.openai.com/account/api-keys で表示できます。まだ申請していない場合は、情報を参照して OpenAI API キーを申請できます。OpenAI API キーを使用して、openai が提供するさまざまなモデルを操作します。

  • 文書データベース。llama-index は、API、PDF、ドキュメント、SQL、Google ドキュメントなど、さまざまなデータ ソースをサポートしています。このチュートリアルでは、デモ用に単純なテキスト ファイルを使用します。

  • ローカルの Python 環境またはオンラインの Google Colab。このチュートリアルでは、デモンストレーションにローカルの Python 環境を使用します。

プロセス:

インストールの依存関係:

pip install openai
pip install llama-index
from llama_index import SimpleDirectoryReader, GPTListIndex, GPTSimpleVectorIndex, LLMPredictor, PromptHelper,ServiceContext
from langchain import OpenAI 
import gradio as gr 
import sys 
import os 
os.environ["OPENAI_API_KEY"] = 'your openai api key'
data_directory_path = 'your txt data directory path'
index_cache_path = 'your index file path'

#构建索引
def construct_index(directory_path): 
        max_input_size = 4096 
        num_outputs = 2000 
        max_chunk_overlap = 20 
        chunk_size_limit = 500
      
        llm_predictor = LLMPredictor(llm=OpenAI(temperature=0, model_name="text-davinci-003", max_tokens=num_outputs))
        # 按最大token数500来把原文档切分为多个小的chunk
        service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor, chunk_size_limit=chunk_size_limit)
        # 读取directory_path文件夹下的文档
        documents = SimpleDirectoryReader(directory_path).load_data() 
 
        index = GPTSimpleVectorIndex.from_documents(documents, service_context=service_context)
        # 保存索引
        index.save_to_disk(index_cache_path) 
        return index 
        
def chatbot(input_text): 
        # 加载索引
        index = GPTSimpleVectorIndex.load_from_disk(index_cache_path) 
        response = index.query(input_text, response_mode="compact") 
        return response.response 
        
if __name__ == "__main__":
        #使用gradio创建可交互ui  
        iface = gr.Interface(fn=chatbot, 
                        inputs=gr.inputs.Textbox(lines=7, label="Enter your text"), 
                        outputs="text", 
                        title="Text AI Chatbot") 
        index = construct_index(data_directory_path) 
        iface.launch(share=True)

construct_index メソッドでは、llama_index の関連メソッドを使用して、data_directory_path パスの下にある txt ドキュメントを読み取り、index ファイルを生成して index_cache_path ファイルに格納します。この python ファイルが実行されると、construct_index メソッドが実行され、コンソールに出力されます。

INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total LLM token usage: 0 tokens
INFO:llama_index.token_counter.token_counter:> [build_index_from_nodes] Total embedding token usage: 27740 tokens
Running on local URL:  http://127.0.0.1:7860

出力された元のドキュメントには 27740 個のトークンがあることがわかります。これは、埋め込みインターフェイスを要求するための呼び出しコストでもあります。このトークンは llama_index によって生成され、ChatGPT API のトークンを占有しません。

次に、ブラウザにコンソール出力の URL を入力します: http://127.0.0.1:7860. 次のように、gradio フレームワークによってレンダリングされた UI が表示されます。

633f20d508b7a3fe49ef5f7e5133bc52.png

次のように、左側に入力しWhat did the author do in 9th grade?、右側に出力します。

cd4d727bc818b08bbd79c9419afc2923.png

同時コンソール出力

INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 563 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 10 tokens

OpenAI text-davinci-003 モデルを使用して使用したトークンは 563 トークンです。この方法により、28,000 トークン近くだったクエリ呼び出しコストが約 500 トークンに削減されました。

llama-index は次のように機能します。

  • テキスト ブロック インデックスの作成

  • 最も関連性の高いテキストのチャンクを見つける

  • 関連するテキスト ブロックを使用して GPT-3 (または他の OpenAI モデル) の質問をする

  • クエリ インターフェイスを呼び出すと、llama-index はデフォルトで次のプロンプトを作成します。

"Context information is below. \n"
    "---------------------\n"
    "{context_str}"
    "\n---------------------\n"
    "Given the context information and not prior knowledge, "
    "answer the question: {query_str}\n"
  • 上記のプロンプトを使用して openai モデルをリクエストすると、モデルはその論理的推論能力を使用して、提供するコンテキストと質問に応じて、必要な回答を取得します。

拡大:

上記は、llama-index を使用して txt テキスト ドキュメントを関連付け、ChatGPT モデルの推論機能を質問と回答に使用する方法を示しています。他の使用方法に拡張できます。

llama-index ライブラリは、txt テキスト ドキュメントをリンクできるだけでなく、PDF や ePub などの電子書籍形式や、YouTube、Notion、MongoDB、 API アクセス データ、またはローカル データベースからのデータ。オープン ソース ライブラリ (https://github.com/jerryjliu/llama_index/blob/main/gpt_index/readers/file/base.py) または llamahub.ai ( https://llamahub.ai/) コミュニティによって開発された DataConnector を参照して、さまざまなデータ ソース形式を読み取ってください。

llama-index と pdf ドキュメント間のリンクを利用して、chatpdf (https://www.chatpdf.com/) と同様の機能を実現できます。llama-index の ImageParser を使用して写真を識別し、写真の内容について ChatGPT と通信することもできます... より多くの使用シナリオがあなたの発見と拡張を待っています。

要約:

この記事では、ChatGPT と llama-index を組み合わせて、ドキュメントの質問に答えるチャットボットを構築します。ChatGPT (およびその他の LLM) はそれ自体でも強力ですが、他のツール、データ、またはプロセスと組み合わせると、その力は大幅に増幅されます。この記事の導入を通じて、あなたも自分のデータ セットを AI に渡してインデックスを作成し、あなただけの AI ロボットを手に入れていただければ幸いです。

参照リソース

https://github.com/jerryjliu/llama_index

https://zhuanlan.zhihu.com/p/613155165

https://www.wbolt.com/building-a-chatbot-based-on-documents-with-gpt.html

https://time.geekbang.org/column/article/645305

この記事で使用するドキュメントは、llama_index の例のドキュメントです: https://github.com/jerryjliu/llama_index/blob/c811e2d4775b98f5a7cf82383c876018c4f27ec4/examples/paul_graham_essay/data/paul_graham_essay.txt

- 終わり -

斉武団について

Qi Wu Troupe は 360 Group の最大のフロントエンド チームであり、グループを代表して W3C および ECMA メンバー (TC39) の作業に参加しています。Qi Wu Troupeは人材育成を重視しており、エンジニア、講師、翻訳者、ビジネスインターフェース担当者、チームリーダーなど、従業員が選択できるさまざまな開発方向があり、対応する技術、専門、一般、リーダーシップのトレーニングを提供することで補完されています。もちろんです。Qi Dance Troupeは、あらゆる種類の優れた才能に注意を払い、オープンで才能を求める態度でQi Dance Troupeに参加することを歓迎します。

7aceb666dde7fb7370d769f3ba3233a0.png

おすすめ

転載: blog.csdn.net/qiwoo_weekly/article/details/130278688