1. はじめに
1.1. 背景
OpenAI が提供する GPT シリーズ モデルを使用すると、中国の事実に関する質問など、いくつかの単純な質問に対して、AI が回答を捏造する傾向があることがわかります。そして、最近のニュースイベントについて質問されると、AI は今後 21 年間に何が起こるか分からないと率直に答えるでしょう。
この問題を解決するために、ChatGPT は最新の GPT-4 モデルのリリース後にプラグイン モジュールもリリースしました。これは、プラグインを介した外部サードパーティ アプリケーションへの接続をサポートできます。ただし、サードパーティのアプリケーションを使用した場合でも、要求された情報が偶然に他者から提供されることを保証することはできません。また、すべての情報や質問が全員に開示するのに適しているわけではなく、一部の情報は社内でのみ使用される場合があります。
今日は、OpenAI の大規模言語モデル機能を活用し、ニーズを満たすために指定されたデータのみを操作する方法を検討します。
1.2. 大規模言語モデルの不備
ChatGPT の常識レベルをテストするために、一般に知られている質問をしました。「魯迅氏が医学を学ぶために日本に行ったとき、彼の家庭教師は誰でしたか?」それは、よく知られている藤野氏ではなく、またしても橋本英夫氏でした。
この状況の発生は、大規模な言語モデルとトレーニング データセットの原理に関連しています。大規模言語モデルは、トレーニング サンプル内のテキスト間の文脈上の関係を使用して、次に出現するテキストから前のテキストまでの確率を予測します。トレーニング サンプル内で特定の答えが頻繁に発生する場合、モデルはその答えに収束し、正確な答えが得られます。ただし、関連性の低いテキストがある場合、トレーニング プロセスにある程度のランダム性が生じ、不正確または突飛な回答が得られる可能性があります。
GPT-3 モデルでは、全体的なトレーニング コーパスは非常に豊富ですが、中国語コーパスは 1% 未満です。したがって、中国語に関する知識や常識に関する質問をした場合、モデルが与える答えは信頼できないことがよくあります。
もちろん、高品質の中国語コーパスをさらに追加し、これらのデータを使用して新しいモデルを再トレーニングするという解決策を採用することもできます。さらに、AI に質問に正しく答えてもらいたい場合は、関連データを収集し、OpenAI が提供する「Fine-tune」インターフェイスを使用して、基本モデルでさらなるトレーニングを実施できます。
この解決策は確かに可能ですが、コストが高くなる可能性があります。上記の例では、テキスト データが不足しているだけの場合は、このアプローチが受け入れられる可能性があります。しかし、この方法は、高い適時性が要求される情報系の情報には適用できない。
たとえば、AI に前日の最新ニュースや特定の競技の結果を教えてもらいたいと考えますが、モデルを数時間ごとに個別にトレーニングしたり微調整したりするのは当然不可能であり、コストがかかりすぎます。
このような問題に対処する場合、他の解決策を検討する必要があるかもしれません。たとえば、サードパーティのデータ ソースや API を AI モデルに統合して、リアルタイムの更新情報を取得し、言語モデルと組み合わせて使用します。これにより、モデルの再トレーニングや微調整を行わずに、タイムリーで正確な回答が可能になります。
1.3. Bing Chat のソリューション
New Bing を使用したことのある友人は、各回答の前に、最初にインターネットを検索し、その後、組み合わせたプロンプトで回答結果を返すことをご存知かもしれません。Microsoft は、Bing 検索エンジンに ChatGPT の質問と回答機能を追加しました。その効果は次のとおりです。良い。それでは、Bing はどのようにしてこれを実現するのでしょうか? 考えられる解決策は、最初に検索してからプロンプトを表示することです (プロンプト)。
1) まず、質問に最も関連するコーパスを検索します。従来のキーワードベースの検索手法を使用することも、セマンティック検索手法に埋め込まれた類似性を使用することもできます。
2) 次に、質問のセマンティクスに最も近いいくつかのコンテンツをプロンプトとして AI に提供します。これらを参考にしてAIに質問に答えてもらいます。
AIに藤野氏から2つの文章を与え、それをもとに元の質問に答えてもらったところ、正解した。自分でテストすることもできます。
これは、大規模な言語モデルを悪用する一般的なパターンの 1 つです。なぜなら、大規模な言語モデル自体には 2 つの機能があるからです。
1つ目は、膨大なコーパスに含まれる知識情報を活用して解答する能力です。たとえば、AI に東坡肉の作り方を尋ねたとき、AI は正確な答えを返すことができました。その理由は、関連する知識がトレーニング コーパスにすでに存在しており、それを通常「世界知識」と呼んでいます。
2 番目の能力は、理解力と入力に基づく推論です。この機能では、トレーニング コーパスに同じコンテンツが存在する必要はありません。大きな言語モデル自体が「思考力」を持ち、読解を行うことができます。このプロセスでは、「知識」はモデル自体によって提供されるのではなく、モデルに一時的に提供されるコンテキスト情報によって提供されます。コンテキスト情報が提供されずに同じ質問が再度尋ねられた場合、モデルは回答できません。
1.4. LlamaIndex の適用シナリオ
前回の記事では、LangChainを中心にLLM関連の一連のトピックを紹介し、テキスト要約、文書検索、データベースクエリ、チャットロボットにおけるLangChainの適用事例を紹介しました。プロセス構成に大きな利点があります。生成と推論に関する LLM の能力と、GPT モデル (公開データでのみトレーニングされた) の限界を理解すると、実際、多くのビジネス シナリオでは、答えを得るために専門的な知識ベースを拡張することがより必要になる可能性があります。したがって、事前トレーニングされた知識ベースを拡張したい場合は、コンテキストを挿入するか、モデルを微調整する必要があります。後者のコストは現時点ではまだ比較的高く、従来の企業や個人には適さない可能性があります。
LLM の外部データ スケーリングの実行に役立つ包括的なツールキットが必要でした。そこでLlamaIndex の出番です。LlamaIndex は、LLM アプリケーションの構築に役立つ「データ フレーム」です。今日は、データの取り込みとインデックス作成のコンテキストに応じた戦闘にLlamaIndexを使用する方法を紹介します。ここでのLlamaIndex は、 Facebook が少し前にオープンソース化したLLaMAモデルとは何の関係もありません。LangChainとの関係については、プロジェクトが連携できるかどうかは後ほど紹介します。
2. LlamaIndexとは何ですか?
LlamaIndex (以前は GPT Index として知られていました) は、LLM と API、PDF、SQL などの外部データ ソースの間で対話するためのシンプルなインターフェイスを提供するオープンソース プロジェクトです。構造化データと非構造化データの両方のインデックスを作成し、データ ソース間の違いを抽象化するのに役立ちます。ヒンティング エンジニアリングに必要なコンテキストを保存し、コンテキスト ウィンドウが大きすぎる場合の制限を処理し、クエリ中のコストとパフォーマンスの間のトレードオフを容易にします。
LllamaIndex は、特殊なインデックスの形式で独自のデータ構造を提供します。
- Vector Store Indexes : 最も一般的に使用され、大規模なデータセットに対するクエリに答えることができます。
- ツリー インデックス: ドキュメントのコレクションを要約するのに役立ちます。
- リスト インデックス: 複数のデータ ソースからの情報を組み合わせた回答を合成するのに役立ちます。
- キーワード テーブル インデックス: クエリを別のデータ ソースにルーティングするために使用されます。
- 構造化ストレージインデックス: SQL クエリなどの構造化データに役立ちます。
- ナレッジ グラフ インデックス: ナレッジ グラフの構築に役立ちます。
LlamaIndexは、ローカル ディレクトリ、Notion、Google Docs、Slack、Discord などのさまざまなデータ ローダーを含むオープン ソース リポジトリであるLlamaHubを通じてデータ コネクタも提供します。
LlamaIndex の目標は、高度なテクノロジーでドキュメント管理を強化し、LLM と革新的なインデックス作成技術を使用してドキュメントを検索および要約する直感的かつ効率的な方法を提供することです。次の図は、LlamaIndex の全体的なワークフローを示しています。
ナレッジ ベース ドキュメントはシャード化されており、各シャードはノード オブジェクトに保存され、他のノードとともにグラフ (インデックス) を形成します。このスライスの主な理由は、LLM の入力トークン容量が限られていることであるため、ヒントで大きなドキュメントをスムーズかつ継続的に提供する戦略が役に立ちます。
グラフ インデックスは、単純なリスト構造、ツリー構造、またはキー テーブルにすることができます。また、異なるインデックスのインデックスを組み合わせることができます。これは、より良い検索結果を得るためにドキュメントを階層に整理する場合に便利です。たとえば、Confluence、Google ドキュメント、電子メールに個別のリスト インデックスを作成し、リスト インデックスの上にオーバーレイ ツリー インデックスを作成できます。
3. LangChainとは何ですか?
LangChain は、 LLM の力を利用してアプリケーションを構築するように設計されたオープンソース ライブラリです。LangChain はもともと Python で書かれていましたが、現在では JavaScript も実装されています。チャットボット、テキスト要約、データ生成、質問応答、その他のアプリケーション シナリオで使用できます。大まかに言うと、次のモジュールをサポートします。
- ヒント: LLM を入力テキストとして管理します。
- LLM:基礎となるLLMのAPI ラッパー。
- ドキュメント ローダー:ドキュメントやその他のデータ ソースをロードするためのインターフェイス。
- ユーティリティ: 埋め込み、検索エンジンなどの他のソースをコンピューティングまたは対話するためのユーティリティ。
- Chains : LLM とユーティリティが呼び出される順序、LLM チェーンの真の値。
- インデックス: 独自のデータをマージするためのベスト プラクティス。
- エージェント: LLM を使用して、どのアクションをどの順序で実行するかを決定します。
- メモリ: エージェントまたはチェーン呼び出し間の状態の永続性。
LangChainの具体的な活用事例については過去の記事を参照してください。
- Langchain、ChatGPT、Pinecone、Streamlit を使用してインタラクティブなチャットボットを構築する
- LangChain、Pinecone、GPT-4 や ChatGPT などの LLM を使用したドキュメントベースの質問応答システムの構築
- LangChain: 自然言語を使用したデータベースのクエリ
- Langchain Summarizer: ワンクリックでドキュメントの概要を生成できる最先端のテクノロジー
- LangChain アーティファクト: カスタム ナレッジ チャットボットを構築するためのわずか 5 ステップ
4. LangChainとLLamaIndexの違いと関係
LlamaIndex の焦点はインデックスです。つまり、さまざまな方法でテキストのインデックスを作成します。その一部は LLM を通過しますが、その多くは LLM に関連しません。LangChain は、Agent と Chain、つまりプロセスの組み合わせに焦点を当てています。用途に応じてこの 2 つを組み合わせることができますが、Q&A の効果が低いと思われる場合は、LlamaIndex をさらに検討してください。より多くの外部ツールや複雑なプロセスを利用したい場合は、LangChain についてさらに勉強してください。
LlamaIndex と LangChain は、主なセールスポイント、つまりデータ拡張された要約と質問応答において多くの重複がありますが、いくつかの違いもあります。LangChain は、よりきめ細かい制御を提供し、幅広いユースケースをカバーします。ただし、LlamaIndex の大きな利点は、階層インデックスを作成できることです。これは、コーパスがある程度のサイズに成長した場合に非常に役立ちます。
一般に、これら 2 つの便利なライブラリは非常に新しく、まだ開発段階にあり、比較的大規模な更新が毎週または毎月行われます。おそらく、近い将来、LangChain は LlamaIndex を併合し、完全で統合されたソリューションを提供するでしょう。
5. LLamaIndex を使用してローカル ドキュメント インデックスを構築およびクエリする方法
次に、LlamaIndex を使用して、取得用の外部ドキュメント インデックスを構築しますが、コードを最初から記述する必要はありません。このパターンは非常に一般的であるため、誰かがllama-indexという名前のオープンソース Python パッケージを作成しました。したがって、この例では、このパッケージを直接使用して、魯迅氏の「藤野氏」に関する質問に数行のコードで回答できるかどうかをテストします。
まず pip 経由で llama-index をインストールします。
pip install llama-index
pip install langchain
インターネットで見つけた「藤野さん」という記事をtxtファイルにして、data/index_luxunディレクトリに置きました。
import openai, os
from llama_index import GPTVectorStoreIndex, SimpleDirectoryReader
os.environ["OPENAI_API_KEY"] = "your-openai-api-key"
openai.api_key = os.environ.get("OPENAI_API_KEY")
documents = SimpleDirectoryReader('/content/data/luxun').load_data()
index = GPTVectorStoreIndex.from_documents(documents)
index.set_index_id("index_luxun")
index.storage_context.persist('./storage')
出力結果:
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: 6763 tokens
注: ログには、埋め込みを通じて消費したトークンの数が出力されます。
1) まず、SimpleDirectoryReader と呼ばれるデータ ローダーを通じて ./data/index_luxun ディレクトリ全体をロードします。その中のすべてのファイルはドキュメントとみなされます。
2) 次に、インデックスを構築するためにすべてのドキュメントを GPTSimpleVectorIndex に渡します。名前が示すように、ドキュメントのセグメントをベクトルに変換し、インデックスとして保存します。
3) 最後に、対応するインデックスを保存します。保存された結果は json ファイルになります。後で、このインデックスを対応する質問と回答に使用できます。
from llama_index import StorageContext, load_index_from_storage
# rebuild storage context
storage_context = StorageContext.from_defaults(persist_dir='./storage')
# load index
index = load_index_from_storage(storage_context, index_id="index_luxun")
query_engine = index.as_query_engine(response_mode="tree_summarize")
response = query_engine.query("根据上下文内容,告诉我鲁迅先生在日本学医的老师是谁?")
print(response)
Q&A の実施にも、わずか数行のコードが必要です。GPTSimpleVectorIndex のload_from_disk 関数を使用して、以前に生成されたインデックスをメモリにロードできます。次に、Index インスタンスでクエリ関数を呼び出すと、質問に対する答えを得ることができます。外部インデックスを使用すると、質問に対する正確な答えを得ることができます。
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 2984 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 34 tokens
鲁迅先生在日本学习医学的老师是藤野严九郎先生。
実際、外部インデックスを使用すると、質問に対する答えを簡単に得ることができます。別の質問を試して、正しく答えられるかどうかを確認してみましょう。
response = query_engine.query("根据上下文内容,鲁迅先生是去哪里学的医学?")
print(response)
出力結果:
> Got node text: 藤野先生
东京也无非是这样。上野的樱花烂熳的时节,望去确也像绯红的轻云,但花下也缺不了成群结队的“清国留学生”的速成班,头顶上盘着大辫子,顶得学生制帽的顶上高高耸起,形成一座富士山。也有解散辫子,盘得平的,除下帽来,油光可鉴,宛如小姑娘的发髻一般,还要将脖子扭几扭。实在标致极了。
中国留学生会馆的门房里有几本书买,有时还值得去一转;倘在上午,里面的几间洋房里倒也还可以坐坐的。但到傍晚,有...
INFO:llama_index.token_counter.token_counter:> [query] Total LLM token usage: 2969 tokens
INFO:llama_index.token_counter.token_counter:> [query] Total embedding token usage: 26 tokens
鲁迅先生去仙台的医学专门学校学习医学。
それでも質問には正しく答えられました。では、このプロセスでは、検索したコンテンツはどのようにして OpenAI に送信されるのでしょうか? 以下のコードを見てみましょう。
from llama_index import Prompt
query_str = "鲁迅先生去哪里学的医学?"
DEFAULT_TEXT_QA_PROMPT_TMPL = (
"Context information is below. \n"
"---------------------\n"
"{context_str}"
"\n---------------------\n"
"Given the context information and not prior knowledge, "
"answer the question: {query_str}\n"
)
QA_PROMPT = Prompt(DEFAULT_TEXT_QA_PROMPT_TMPL)
query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)
response = query_engine.query(query_str)
print(response)
このコードでは、QA_PROMPT オブジェクトを定義し、そのオブジェクトのテンプレートを設計します。
1) このテンプレートの冒頭で、AI にコンテキスト情報を提供することを AI に伝えます。
2) テンプレートでは 2 つの変数がサポートされており、1 つは context_str と呼ばれ、もう 1 つは query_str と呼ばれます。context_str の場所には、実際に呼び出されたときに、類似性の埋め込みによって見つかったコンテンツが埋められます。そして、query_str は実際の質問に置き換えられます。
3) 実際に質問するときは、文脈情報のみを考慮し、すでに持っている事前知識に基づいて質問に答えないよう AI に指示します。
このようにして、検索で見つかった関連コンテンツと質問をプロンプトに組み合わせて、AI が要件に従って質問に回答できるようにします。次に、答えが変わっていないかどうかを確認するためにもう一度 AI に質問します。
出力結果:
鲁迅先生去仙台的医学专门学校学习医学。
今回もAIは魯迅氏が仙台の医科大学に勉強に行ったと正しく答えた。もう一度、無関係な質問をしてみましょう。どのような答えが得られるでしょうか。たとえば、『西遊記』の著者は誰ですかと尋ねます。
QA_PROMPT_TMPL = (
"下面的“我”指的是鲁迅先生 \n"
"---------------------\n"
"{context_str}"
"\n---------------------\n"
"根据这些信息,请回答问题: {query_str}\n"
"如果您不知道的话,请回答不知道\n"
)
QA_PROMPT = Prompt(QA_PROMPT_TMPL)
query_engine = index.as_query_engine(text_qa_template=QA_PROMPT)
response = query_engine.query("请问西游记的作者是谁?")
print(response)
出力結果:
不知道
AIは意味のない答えをするのではなく、私たちの指示に従って答えなかったことがわかります。
6. LLamaIndex を使用してドキュメントの概要を生成する方法
llama-index Python ライブラリを使用するもう 1 つの一般的なアプリケーション シナリオは、記事の概要を生成することです。テキスト クラスタリングを完了するための適切なプロンプト (プロンプト) の使用についてはすでに紹介しました。ただし、論文や本を要約したい場合、OpenAI の API インターフェイスは最大 4096 トークンしかサポートできないため、明らかに十分ではありません。
この問題を解決するために。これを行うには、テキストをセクションに要約し、それらの要約を再度要約します。記事や書籍はツリー インデックスとして構築でき、各ノードはその子ノードの内容の概要を表します。最後に、記事または書籍全体の概要をツリー全体のルート ノードで取得できます。
実際、llama-index 自体にそのような機能が組み込まれています。この機能を実現するコードの書き方を見てみましょう。
まず、spaCy Python ライブラリをインストールし、中国語の単語分割と文分割に必要な対応モデルをダウンロードしましょう。
pip install spacy
python -m spacy download zh_core_web_sm
次のコードは非常に単純です。 llama-index で最も単純なインデックス構造GPTListIndexを選択しました。ただし、ニーズに応じて 2 つの最適化を行いました。
まず、 OpenAI にリクエストを行うときに ChatGPT モデルが使用されるように、インデックスでLLPredictorを指定します。このモデルは高速で比較的安価です。デフォルトでは、llama-index で使用されるモデルはtext-davinci-003ですが、これはgpt-3.5-turboよりも 10 倍高価です。数ラウンドの会話を行っただけでは、この価格差はまだそれほど顕著ではありません。しかし、何十冊もの本の内容を扱う場合、コストは大幅に増加します。したがって、ここでは、サマリーが長すぎないようにし、無関係なコンテンツのマージを避けるために、モデルの出力コンテンツを 1024 トークンの長さを超えないように設定します。
次に、中国語テキストのセグメンテーションにSpacyTextSplitterを使用します。デフォルトでは、llama-index は中国語をサポートしておらず、適切に動作しません。幸いなことに、カスタムのテキスト分割が可能です。選択した記事は中国語であり、句読点も中国語であるため、セグメンテーション操作には中国語モデルを選択しました。同時に、分割後の各セグメントの長さは 2048 トークン以下に制限されます。これらのパラメータ設定は、実際の加工品の内容や特性に応じてカスタマイズできます。
from langchain.chat_models import ChatOpenAI
from langchain.text_splitter import SpacyTextSplitter
from llama_index import GPTListIndex, LLMPredictor, ServiceContext
from llama_index.node_parser import SimpleNodeParser
# define LLM
llm_predictor = LLMPredictor(llm=ChatOpenAI(temperature=0, model_name="gpt-3.5-turbo", max_tokens=1024))
text_splitter = SpacyTextSplitter(pipeline="zh_core_web_sm", chunk_size = 2048)
parser = SimpleNodeParser(text_splitter=text_splitter)
documents = SimpleDirectoryReader('./data/luxun').load_data()
nodes = parser.get_nodes_from_documents(documents)
service_context = ServiceContext.from_defaults(llm_predictor=llm_predictor)
list_index = GPTListIndex(nodes=nodes, service_context=service_context)
query_engine = list_index.as_query_engine(response_mode="tree_summarize")
response = query_engine.query("下面鲁迅先生以第一人称‘我’写的内容,请你用中文总结一下:")
print(response)
出力結果:
鲁迅先生在文章中以第一人称‘我’写了他在仙台学医期间的经历,包括他与藤野先生的关系、学习医学的困难和他最终离开医学专业的决定。他对藤野先生的感激和敬仰一直延续至今。
GPTListIndexインデックスを構築するときに、 Embeddingが作成されないため、インデックスの作成速度が非常に速く、大量のトークンを消費しません。設定したインデックス構造とセグメント化方法に従って、リスト形式でインデックスを構築するだけです。
次に、AI にこの記事の要約を手伝ってもらいましょう。同様に、プロンプト自体が非常に重要であるため、魯迅氏が一人称「私」で記事を書いたことを強調します。ツリー構造に従って記事を要約したいので、パラメータresponse_mode = "tree_summarize"を設定します。このパラメータは、前述のツリー構造に従って記事全体を要約します。
実際には、クエリ内のヒントを使用して各テキストの一節を要約します。次に、クエリ内のプロンプトを通じて複数の要約の内容をさらに要約し続けます。
from llama_index import GPTTreeIndex
# define LLM
tree_index = GPTTreeIndex(nodes=nodes, service_context=service_context)
query_engine = tree_index.as_query_engine(mode="summarize")
response = query_engine.query("下面鲁迅先生以第一人称‘我’写的内容,请你用中文总结一下:")
print(response)
出力結果:
鲁迅先生在这篇文章中讲述了他在日本留学期间的经历,包括他遇到的人和事,以及他的学习情况。他特别提到了他的解剖学教授藤野严九郎,藤野先生对他的学习和讲义进行了指导和修改。此外,鲁迅还提到了一些关于中国文化的误解,比如中国女人裹脚的问题。最后,他还引用了《新约》上的句子,表达了他的思考和感悟。
ご覧のとおり、わずか数行のコードで記事全体の要約が正常に完成しました。全体として、返される結果は悪くありません。
7. マルチモーダル認識画像における LLamaIndex の適用
llama_index は、テキスト情報だけでなく、写真やイラストなどのマルチメディア情報を含む書籍のインデックスも作成できます。これはマルチモーダル機能と呼ばれます。もちろん、この機能を実現するには、テキストと画像を結び付けるいくつかのマルチモーダル モデルが必要です。後で、画像に関するマルチモーダル モデルを具体的に紹介します。
それでは、llama_index 公式サンプル ライブラリで提供されている例を見てみましょう。食事の際に小さなチケットの写真を撮り、何を食べ、いくら使ったかを尋ねます。
%pip install torch transformers sentencepiece Pillow
from llama_index import SimpleDirectoryReader, VectorStoreIndex
from llama_index.readers.file.base import (
DEFAULT_FILE_READER_CLS,
ImageReader,
)
from llama_index.response.notebook_utils import (
display_response,
display_image,
)
from llama_index.indices.query.query_transform.base import (
ImageOutputQueryTransform,
)
# NOTE: we add filename as metadata for all documents
filename_fn = lambda filename: {'file_name': filename}
receipt_reader = SimpleDirectoryReader(
input_dir='./data/image',
file_metadata=filename_fn,
)
receipt_documents = receipt_reader.load_data()
まず、上で定義したカスタム画像パーサーとメタデータ関数を使用してレシート画像を取り込みます。このようにして、テキストドキュメントだけでなく画像ドキュメントを取得できます。
いつものように単純なベクトルインデックスを構築しますが、以前とは異なり、インデックスにはテキストに加えて画像が含まれています。
receipts_index = VectorStoreIndex.from_documents(receipt_documents)
その後、自然言語で質問してインデックスをクエリするだけで、対応する画像を見つけることができます。質問するときは、主に結果を出力するときに Notebook に表示するために画像の外側に <img> タグを追加するために、ImageOutputQueryTransform を特別に設計しました。
from llama_index.query_engine import TransformQueryEngine
query_engine = receipts_index.as_query_engine()
query_engine = TransformQueryEngine(query_engine, query_transform=ImageOutputQueryTransform(width=400))
receipts_response = query_engine.query(
'When was the last time I went to McDonald\'s and how much did I spend?',
)
display_response(receipts_response)
出力結果:
The last time you went to McDonald's was on 03/10/2018 at 07:39:12 PM and you spent $26.15.
OpenAI と大規模言語モデル エコシステム全体の急速な発展に伴い、llama-index ライブラリも急速に反復されています。私自身も使用中に、さまざまな小さなエラーに遭遇しました。中国のサポートにもいくつかの小さな欠陥があります。ただし、オープンソース プロジェクトとして、特に多くの DataConnector オプションを備えた優れたエコシステムがすでに構築されています。これらのオプションには、PDF や ePub などの電子書籍形式のほか、YouTube、Notion、MongoDB などの外部データ ソース、API アクセス データ、さらにはローカル データベースのデータも含まれます。llamahub.ai では、コミュニティが開発したさまざまなデータ ソース形式用の DataConnector を表示できます。
8. まとめと展望
この記事の導入により、llama-index Python パッケージの簡単な使用方法をマスターできました。これを使用すると、外部データベースをインデックスにすばやく変換し、提供されたクエリ インターフェイスを通じてドキュメントをクエリできます。同時に、シャーディングやツリー構造管理インデックスを使用してサマリーを生成することもできます。
llama-index は機能が豊富なだけでなく、Python ライブラリとしてまだ進化し、改善されています。これにより、大規模な言語モデルに関連するアプリケーションの開発が大幅に容易になります。関連ドキュメントは公式 Web サイトで見つけることができ、コードもオープンソースです。問題が発生した場合は、ソース コードを直接表示して洞察を得ることができます。
実際、llama-index は、大規模な言語モデル アプリケーションに革新的な設計パターンを提供します。まず外部データベースのインデックスを構築し、次に質問されるたびにデータベースから関連するコンテンツを検索し、最後に AI の意味理解機能を使用して検索結果に基づいて質問に回答します。
インデックス作成と検索の最初の 2 つのステップでは、OpenAI の Embedding インターフェイス、または他の大規模言語モデルの Embedding インターフェイス、または従来のテキスト検索テクノロジを使用できます。質問応答の最後のステップでのみ、OpenAI のインターフェイスを使用する必要があります。テキスト情報をインデックスするだけでなく、画像をテキストに変換し、他のモデルを介してインデックスを作成することもでき、いわゆるマルチモーダル機能を実現します。
今日挙げたいくつかの例を通じて、皆さんも独自のローカル データベースの構築を開始し、インデックス作成のために独自のデータ セットを AI に引き渡すことができるようになることを願っています。このようにして、あなた専用の AI を手に入れることができます。
Jupyter Notebook の完全なコード: https://github.com/Crossme0809/langchain-tutorials/blob/main/Using_LlamaIndex_Query_Documents.ipynb
9. 推奨読書
llama-indexの機能は非常に強力で、ソース コードにはサンプル セクションも提供されています。公式ドキュメントと例を見て、それが何に使用できるかを確認できます。
公式ドキュメント: https://gpt-index.readthedocs.io/en/latest/
ソースコードと例: https://github.com/jerryjliu/llama_index