最近、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 が表示されます。
次のように、左側に入力しWhat did the author do in 9th grade?
、右側に出力します。
同時コンソール出力
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に参加することを歓迎します。