Closed5

LangChainとLlamaIndexで作成したインデックスでOpenAIを試す

suzuki-navisuzuki-navi

LangChainとLlamaIndexでインデックスを作成するところまでは先日やった。

$ pip install langchain llama_index
$ pip show openai langchain llama_index
Name: openai
Version: 0.27.8
Summary: Python client library for the OpenAI API
Home-page: https://github.com/openai/openai-python
Author: OpenAI
Author-email: support@openai.com
License:
Location: /home/ec2-user/.local/lib/python3.11/site-packages
Requires: aiohttp, requests, tqdm
Required-by: llama-index
---
Name: langchain
Version: 0.0.225
Summary: Building applications with LLMs through composability
Home-page: https://www.github.com/hwchase17/langchain
Author:
Author-email:
License: MIT
Location: /home/ec2-user/.local/lib/python3.11/site-packages
Requires: aiohttp, dataclasses-json, langchainplus-sdk, numexpr, numpy, openapi-schema-pydantic, pydantic, PyYAML, requests, SQLAlchemy, tenacity
Required-by: llama-index
---
Name: llama-index
Version: 0.7.2
Summary: Interface between LLMs and your data
Home-page: https://github.com/jerryjliu/llama_index
Author: Jerry Liu
Author-email:
License: MIT
Location: /home/ec2-user/.local/lib/python3.11/site-packages
Requires: beautifulsoup4, dataclasses-json, fsspec, langchain, nest-asyncio, numpy, openai, pandas, sqlalchemy, tenacity, tiktoken, typing-extensions, typing-inspect, urllib3
Required-by:
import langchain.embeddings
import llama_index

openai_api_key = '...'
openai_api_base =  'https://....openai.azure.com'
openai_api_type = 'azure'
openai_api_version = '2022-12-01'
openai_embedding_deployment_name = '...' # model: "text-embedding-ada-002"

embedding_llm = llama_index.LangchainEmbedding(
    langchain.embeddings.OpenAIEmbeddings(
        deployment=openai_embedding_deployment_name,
        openai_api_key=openai_api_key,
        openai_api_base=openai_api_base,
        openai_api_type=openai_api_type,
        openai_api_version=openai_api_version,
    ),
    embed_batch_size=1,
)

service_context = llama_index.ServiceContext.from_defaults(embed_model=embedding_llm)

document = llama_index.SimpleDirectoryReader(input_files=["sample.txt"]).load_data()

index = llama_index.GPTVectorStoreIndex.from_documents(document, service_context=service_context)

index.storage_context.persist(persist_dir="./indexdata")

このPythonソースコードを実行すると indexdata の中にJSONファイルが4つできる。

suzuki-navisuzuki-navi

学習元とした sample.txt は以下のページの本文をコピペして作ったテキストである。

https://ja.wikipedia.org/wiki/2022年ロシアのウクライナ侵攻

これで次のPythonコードを実行してみる。

import langchain.llms
import llama_index

openai_api_key = '...'
openai_api_base =  'https://....openai.azure.com'
openai_api_type = 'azure'
openai_api_version = '2022-12-01'
openai_deployment_name = '...' # mode: "text-davinci-003"
openai_embedding_deployment_name = '...' # model: "text-embedding-ada-002"

embedding_llm = llama_index.LangchainEmbedding(
    langchain.embeddings.OpenAIEmbeddings(
        deployment=openai_embedding_deployment_name,
        openai_api_key=openai_api_key,
        openai_api_base=openai_api_base,
        openai_api_type=openai_api_type,
        openai_api_version=openai_api_version,
    ),
    embed_batch_size=1,
)

llm_predictor = llama_index.LLMPredictor(
    llm=langchain.llms.AzureOpenAI(
        deployment_name=openai_deployment_name,
        openai_api_key=openai_api_key,
        openai_api_base=openai_api_base,
        openai_api_type=openai_api_type,
        openai_api_version=openai_api_version,
        max_tokens=1000,
        temperature=0.1,
    ),
)
prompt_helper = llama_index.PromptHelper()
service_context = llama_index.ServiceContext.from_defaults(llm_predictor=llm_predictor, embed_model=embedding_llm, prompt_helper=prompt_helper)

storage_context = llama_index.StorageContext.from_defaults(persist_dir="./indexdata")

index = llama_index.load_index_from_storage(storage_context, service_context=service_context)

query_engine = index.as_query_engine()
query = "ウクライナでの戦争の状況を教えてください。"
response = query_engine.query(query)

print(response.get_formatted_sources())

print(str(response))

結果

> Source (Doc id: f31952d1-1594-4ad7-bb8a-8a4b62984fde): ウクライナの各都市の地図 ユーロマイダンによるヤヌコーヴィチ解任後、ウクライナの一部地域において親露派による騒乱が勃発した[160]。リトル・グリーンメンはウクライナの戦略的に重要な地域やインフ...

> Source (Doc id: e4a2ca43-bbb1-4477-8f0f-f8ceb5ceea16): 13][232][233]。プーチンは国民向けのテレビ演説の中で、軍事作戦の目的を「ウクライナ政府によって8年間、虐げられてきた人々を保護するため」と述べた[65]。また、ウクライナの領土を占領...

2022年2月になってから、ウクライナ東部の紛争地域ドネツィク州グラニトノエで、ウクライナ軍が親露派武装勢力に向けてトルコから調達したドローンを使用した攻撃が行われた[13][232][233]。2022年1月10日にはNATO事務総長のイェンス・ストルテンベルグとウクライナ欧州大西洋統合担当副首相のオリハ・ステファニシナが共同記者会見を行い、ロシアのウクライナへの侵攻の見通しについて語った[170]。2021年10月26日には、ウクライナ東部の紛争地域ドネツィク州グラニトノエで、ウクライナ軍が親露派武装勢力に向けてトルコから調達したドローンを使用した攻撃が行われた[13][232][233]。2022年2月24日には、トルコが所有する貨物船がオデッサ沖でロシアからのミサイルにより被害を受けた[237][238]。翌25日には、黒海に面したユズニー港の南でモルドバ船籍の貨物船「ミレニアル・スピリット(ルーマニア語版)」がロシア軍の発砲を受けたとウクライナ軍参謀本部が発表した[236]。また同日、黒海上でパナマ船籍で日本の日鮮海運が所有する貨物船「ナムラ・クイーン(スペイン語版)」が、ユズニー港の停泊地でロケット弾の攻撃を受けたと発表した[236]。さらに、黒海沿岸の港湾都市オデッサ周辺では、ミサイル攻撃によって少なくとも18人の市民が死亡した[239]。2月25日には、キーウで住宅地に航空機が墜落した[240]。ロシア国防省からの情報として、キーウ周辺の飛行場占領の際にウクライナ特殊部隊員200人以上を殺害したと報道した[241]。これらの事件から、ウクライナでは2022年2月になってから、ロシア軍とウクライナ軍の間で激しい戦闘が行われていることがわかる。
suzuki-navisuzuki-navi

sample.txtHello とだけ書いて、インデックスを作成して、同じクエリを投げてみると

> Source (Doc id: 0adec6f8-02f8-4c47-89b9-329596eaa2d7): Hello...

ウクライナでは2014年以降、ロシアとの間で激しい内戦が続いています。ロシアは20142月にクリミア半島を併合し、その後もウクライナ東部のドネツク地方などで戦闘が続いています。ウクライナ政府軍とロシア政府軍の両軍は、20152月にミンスクで締結したミンスク協定に基づいて、停戦を維持していますが、戦闘は続いています。
suzuki-navisuzuki-navi

Helloしかないインデックスだと、レスポンスに2022年の情報が含まれない。

Wikipediaのテキストでのインデックスだと、2022年の情報が出てくる。ただし、Wikipediaには2023年の現時点までの情報があるはずだが、そこまでの内容は含まれない。

Wikipediaの長いテキストから断片に分けてベクトルデータを作成し、クエリ時にはテキスト断片の中で質問に近いものを2つだけ抽出して、クエリ時に渡しているということか。

このスクラップは2023/07/07にクローズされました