
LlamaIndex v0.8 ã¯ã€ãã¯ã¹ã¿ãŒãã¬ã€ã - Pythonç
Pythonçã®ãLlamaIndexãã®ã¯ã€ãã¯ã¹ã¿ãŒãã¬ã€ãããŸãšããŸããã
ã»LlamaIndex v0.8.59
ãææ°çã®æ å ±ã¯ä»¥äžã§ç޹ä»ã
1. LlamaIndex
ãLlamaIndexãã¯ããã©ã€ããŒãããã¡ã€ã³åºæã®ç¥èãå¿ èŠãšããå°éç¥èãå¿ èŠãšãã質åå¿çãã£ããããããç°¡åã«äœæã§ããã©ã€ãã©ãªã§ãã
2. LlamaIndexã®5ã€ã®ã¹ããŒãž
ãLlamaIndexãã«ã¯ã5ã€ã®ã¹ããŒãžããããŸãã

2-1. Loading
ããŒã¿ãœãŒã¹ (ããã¹ããã¡ã€ã«ãPDFãWebãµã€ããããŒã¿ããŒã¹ãAPIãªã©) ããããŒã¿ãèªã¿èŸŒã¿ãŸãã
ãLoadingãã®äž»èŠã³ã³ããŒãã³ãã¯ã次ã®ãšããã§ãã
ã»Document : ããŒã¿ãœãŒã¹ã®ã³ã³ãã
ã»Node : Documentãåå²ãããã®ããã£ã³ã¯ãšã¡ã¿ããŒã¿ãå«ãŸãã
ã»Connector : ããŒã¿ãœãŒã¹ããDocumentããã³Nodeã«åã蟌ãã¢ãžã¥ãŒã«ãLlamaHubã§æ°çŸã®ConnectorãæäŸ
2-2. Indexing
ããŒã¿ã®ã¯ãšãªãå¯èœã«ããããŒã¿æ§é ã«å€æããŸãã
ãIndexingãã®äž»èŠã³ã³ããŒãã³ãã¯ã次ã®ãšããã§ãã
ã»Index : ããŒã¿ã®ã¯ãšãªãå¯èœã«ããããŒã¿æ§é
ã»Embedding LLM : é¢é£ããŒã¿ãèŠã€ããããã®ãã¯ãã«è¡šçŸã«å€æããLLM
2-3. Storing
ã€ã³ããã¯ã¹ãäœæããåŸãã€ã³ããã¯ã¹ãšä»ã®ã¡ã¿ããŒã¿ãä¿åããããšã§ãåäœæããå¿ èŠããªããªããŸãã
2-4. Querying
ã€ã³ããã¯ã¹ããé¢é£ããŒã¿ãã¯ãšãªããŸãã
ãQueryingãã®äž»èŠã³ã³ããŒãã³ãã¯ã次ã®ãšããã§ã
ã»Retriever : ã¯ãšãªæã«Indexããé¢é£ããŒã¿ãå¹ççã«ååŸããæ¹æ³ãå®çŸ©
ã»Node Postprocessor : ååŸããããŒãã»ãããåãåãããããã«å€æããã£ã«ã¿ãªã³ã°ããªã©ã³ãã³ã°ãé©çš
ã»Response Synthesizer : ãŠãŒã¶ãŒã¯ãšãªãšååŸããããã¹ããã£ã³ã¯ã䜿çšããŠã¬ã¹ãã³ã¹ãçæ
2-3. Evaluation
ã¯ãšãªã«å¯Ÿããã¬ã¹ãã³ã¹ãã©ã®çšåºŠæ£ç¢ºãå¿ å®ãè¿ éã§ãããã客芳çã«æž¬å®ããŸãã
3. ããã¥ã¡ã³ãã®æºå
ä»åã¯ããã³ã¬ããã£ã¢ã®ããŒã£ã¡ã»ãã»ãã£ãïŒãã®ããã¥ã¡ã³ããçšæããŸããã
ã»bocchi.txt

4. 質åå¿ç
Google Colabã§ã®è³ªåå¿çã®å®è¡æé ã¯ã次ã®ãšããã§ãã
(1) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
# ããã±ãŒãžã®ã€ã³ã¹ããŒã«
!pip install llama-index==0.8.59(2) ç°å¢å€æ°ã®æºåã
以äžã®ã³ãŒãã® <OpenAI_APIã®ããŒã¯ã³> ã«ã¯OpenAI APIã®ããŒã¯ã³ãæå®ããŸãã(ææ)
import os
os.environ["OPENAI_API_KEY"] = "<OpenAI_APIã®ããŒã¯ã³>"(3) ãã°ã¬ãã«ã®èšå®ã
import logging
import sys
# ãã°ã¬ãã«ã®èšå®
logging.basicConfig(stream=sys.stdout, level=logging.DEBUG, force=True)ã»DEBUG : ãããã°æ å ±ã®åºå
ã»INFO : æ å ±ã®åºå (æ³å®éãã®äºè±¡ã®çºç)
ã»WARNING : èŠåã®åºå (æ³å®å€ã®äºè±¡ã®çºç)
ã»ERROR : ãšã©ãŒã®åºå (å®è¡ã®ç¶è¡äžèœ)
(4) Colabã«dataãã©ã«ããäœæããŠããã¥ã¡ã³ããé
眮ã
巊端ã®ãã©ã«ãã¢ã€ã³ã³ã§ãã¡ã€ã«äžèЧã衚瀺ããå³ã¯ãªãã¯ãæ°ãããã©ã«ããã§dataãã©ã«ããäœæããããã¥ã¡ã³ãããã©ãã°&ããããããŸãã

(5) ããã¥ã¡ã³ãã®èªã¿èŸŒã¿ã
from llama_index import SimpleDirectoryReader
# ããã¥ã¡ã³ãã®èªã¿èŸŒã¿
documents = SimpleDirectoryReader("data").load_data()(6) ã€ã³ããã¯ã¹ã®äœæã
ãã€ã³ããã¯ã¹ãã¯ãããã¥ã¡ã³ãã®æ
å ±ãä¿æããã¢ãžã¥ãŒã«ã§ããããã¥ã¡ã³ãããã£ã³ã¯ã«åå²ãããã£ã³ã¯æ¯ã«åã蟌ã¿ã«å€æããŠä¿æãŸãããã£ã³ã¯ã¯é¡äŒŒæ€çŽ¢ã®å¯Ÿè±¡ãšãªãããŒã¿åäœã«ãªããŸãã
from llama_index import VectorStoreIndex
# ã€ã³ããã¯ã¹ã®äœæ
index = VectorStoreIndex.from_documents(documents)DEBUG:llama_index.node_parser.node_utils:> Adding chunk: çµæãã³ã åŸè€ã²ãšãã¯åéãäœããªãé°ãã£ã§ãã€ãäžäººã§éãããŠããããäžåп代ã«ãã¬ãã®ã€...
DEBUG:llama_index.node_parser.node_utils:> Adding chunk: æåç¥ã©ã€ã å€äŒã¿ã«å
¥ããåŸè€ã²ãšãã¯ç¥ãåããå¢ããŠããããèªåããéã³ã«èªãããšãã§ãã...
DEBUG:llama_index.node_parser.node_utils:> Adding chunk: ã²ãããè
ãªãšãšã³ã¯ãçµæãã³ããã©ã€ãã«èŠããªãããã圌女ãã¡ã«ã¢ããã€ã¹ãéãããã¡ã³ãã¡...
:(7) ã¯ãšãªãšã³ãžã³ã®äœæã
ãã¯ãšãªãšã³ãžã³ãã¯ããŠãŒã¶ãŒå
¥å(ã¯ãšãª)ãšé¢é£ããæ
å ±ãã€ã³ããã¯ã¹ããååŸãããããããšã«å¿çãçæããã¢ãžã¥ãŒã«ã§ãã
# ã¯ãšãªãšã³ãžã³ã®äœæ
query_engine = index.as_query_engine()(8) 質åå¿çã
# 質åå¿ç
print(query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ"))åŸè€ã²ãšãã®åŸæãªæ¥œåšã¯ã®ã¿ãŒã§ãã
ãã°ã確èªãããšã以äžã®ã³ã³ããã¹ããååŸããŠããããšãããããŸãã
[Similarity score: 0.832151] èªåã«ã¯äœã®åãæããªãã®ãçæããŠãããããäžåŠã®é ã«æãæ§æ Œã®äººéããã³ãããã£ãŠäººæ°è
ã«ãªã£ãã€ã³ã¿ãã¥ãŒãèªãã§ãã®ã¿ãŒãå§ãããæ¯æ¥ç·Žç¿ãããé°ã§ã®ã¿ãŒã®è
åã¯ããçŽã«ãªã£ãããçµå±ã...
[Similarity score: 0.829139] å€ããè
ã§äžäººã§ããã®ã奜ãã ããåŸè€ã²ãšããšéã£ãŠç¹ã«ã³ãã¥éãšããããã§ã¯ãªãã鳿¥œã«é¢ããŠã¯ç¬èªã®äŸ¡å€èгãæã£ãŠãããæµè¡ïŒã¯ãïŒãã«æµãããã®ãå«ãããã³ãã®åæ§ãéèŠããŠããããã®ãã...OpenAI APIã®éä¿¡å 容ã確èªã§ããŸããUnicodeãšã¹ã±ãŒãã·ãŒã±ã³ã¹ãæ¥æ¬èªã«æ»ããŠãŸãã
Context information is below.
---------------------
èªåã«ã¯äœã®åãæããªãã®ãçæããŠãããããäžåŠã®é ã«æãæ§æ Œã®äººéããã³ãããã£ãŠäººæ°è
ã«ãªã£ãã€ã³ã¿ãã¥ãŒãèªãã§ãã®ã¿ãŒãå§ãããæ¯æ¥ç·Žç¿ãããé°ã§ã®ã¿ãŒã®è
åã¯ããçŽã«ãªã£ãããçµå±ã...
å€ããè
ã§äžäººã§ããã®ã奜ãã ããåŸè€ã²ãšããšéã£ãŠç¹ã«ã³ãã¥éãšããããã§ã¯ãªãã鳿¥œã«é¢ããŠã¯ç¬èªã®äŸ¡å€èгãæã£ãŠãããæµè¡ïŒã¯ãïŒãã«æµãããã®ãå«ãããã³ãã®åæ§ãéèŠããŠããããã®ãã...
---------------------
Given the context information and not prior knowledge, answer the question. If the answer is not in the context, inform the user that you can't answer the question.
Question: ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ
Answer: 5. ã€ã³ããã¯ã¹ã®ä¿å
äœæããã€ã³ããã¯ã¹ã¯ä¿åããŠãããšã次åã«åäœæããå¿ èŠããªããªããŸãã
(1) ã€ã³ããã¯ã¹ã®ä¿åã
# ã€ã³ããã¯ã¹ã®ä¿å
index.storage_context.persist()(2) ã€ã³ããã¯ã¹ã®èªã¿èŸŒã¿ã
from llama_index import StorageContext, load_index_from_storage
# ã€ã³ããã¯ã¹ã®èªã¿èŸŒã¿
storage_context = StorageContext.from_defaults(persist_dir="./storage")
index = load_index_from_storage(storage_context)6. ã«ã¹ã¿ãã€ãº
ãŠãŒã¹ã±ãŒã¹ã«åãããŠä»¥äžã®ã³ãŒããã«ã¹ã¿ãã€ãºããŸãã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# ã«ã¹ã¿ãã€ãºããã³ãŒã
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine()
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
print(response)6-1. ãã£ã³ã¯ãµã€ãºã®å€æŽ
ä»åã¯ããã£ã³ã¯ãµã€ãºã500ã«èšå®ããŸãã
(1) ServiceContextã§ãã£ã³ã¯ã®æå€§ãµã€ãºãæå®ã
from llama_index import ServiceContext
# ServiceContextã®æºå
service_context = ServiceContext.from_defaults(
chunk_size=500 # ãã£ã³ã¯ã®æå€§ãµã€ãº
)(2) VectorStoreIndexã«ServiceContextãèšå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# VectorStoreIndexã«ServiceContextãèšå®
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(
documents,
service_context=service_context # ServiceContextã®èšå®
)
query_engine = index.as_query_engine()
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
print(response)ãã£ã³ã¯æ°ã¯ã以äžã®ã³ãŒãã§ç¢ºèªã§ããŸãã
print(len(index.index_struct.nodes_dict))15ãã33ã«å¢ããŸããã
6-2. ã¯ãšãªã§ååŸããã³ã³ããã¹ãæ°ã®å€æŽ
ä»åã¯ã5åã®ã³ã³ããã¹ããååŸããããã«ããŸããããã©ã«ãã§ã¯2åååŸããŠããŸãã
(1) index.as_query_engine()ã®similarity_top_kã«ã³ã³ããã¹ãæ°ãæå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# ã¯ãšãªããæã«ããå€ãã®ã³ã³ããã¹ããååŸ
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(similarity_top_k=5) # ã³ã³ããã¹ãæ°
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
print(response)6-3. VectorStoreã®å€æŽ
ãLlamaIndexãã§å©çšå¯èœãªãVectorStoreãã¯ããUsing Vector Storesãã§ç¢ºèªã§ããŸãã
ä»åã¯ããChromaãã䜿çšããŸãã
(1) ããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
# ããã±ãŒãžã®ã€ã³ã¹ããŒã«
!pip install chromadb(2) StorageContextã®æºåã
import chromadb
from llama_index.vector_stores import ChromaVectorStore
from llama_index import StorageContext
# StorageContextã®æºå
chroma_client = chromadb.PersistentClient()
chroma_collection = chroma_client.create_collection("quickstart")
vector_store = ChromaVectorStore(chroma_collection=chroma_collection)
storage_context = StorageContext.from_defaults(vector_store=vector_store)(3) VectorStoreIndexã«StorageContextãèšå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# VectorStoreIndexã«StorageContextãèšå®
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(
documents,
storage_context=storage_context # StorageContextã®èšå®
)
query_engine = index.as_query_engine()
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
print(response)6-4. LLMã®å€æŽ
ãLlamaIndexãã§ã¯ããLangChainãã®ãLLMããChatModelããå©çšã§ããŸãã
ã»LLMs
ã»Chat Models
ä»åã¯ããgpt-4ãã䜿çšããŸããããã©ã«ãã¯ããgpt-3.5-turboãã§ãã
(1) ServiceContextã®æºåã
from llama_index import ServiceContext
from langchain.chat_models import ChatOpenAI
# ServiceContextã®æºå
service_context = ServiceContext.from_defaults(
llm=ChatOpenAI(model_name="gpt-4")
)(2) VectorStoreIndexã«ServiceContextãèšå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# å¥ã®LLMã®äœ¿çš
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(
service_context=service_context # ServiceContextã®èšå®
)
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
print(response)6-5. ã¬ã¹ãã³ã¹ã¢ãŒãã®å€æŽ
ãLlamaIndexãã®äž»ãªã¬ã¹ãã³ã¹ã¢ãŒãã¯ã次ã®3ã€ã§ãã
ã»refine : ããŒãããšã«å¥ã ã®LLMåŒã³åºããŠå¿çãè¿ãã粟床éèŠ
ã»compact : refineãšäŒŒãŠããããäºåã«ãã£ã³ã¯é£çµããLLMåŒã³åºãã®ã³ã¹ããåæžãããã©ã«ã
ã»tree_summarize : ååž°çãªããªãŒã®ããŒã¿æ§é ãæ§ç¯ããã«ãŒãããŒãã®å¿çãè¿ããèŠçŽã«æé©
ä»åã¯ãã¬ã¹ãã³ã¹ã¢ãŒãããrefineãã«ããŸããããã©ã«ãã¯ãcompactãã§ãã
(1) index.as_query_engine()ã®response_modeã«ã¬ã¹ãã³ã¹ã¢ãŒããèšå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# ã¬ã¹ãã³ã¹ã¢ãŒãã®å€æŽ
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(response_mode="refine")
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
print(response)ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ã®ã¿ãŒã§ãã圌ã¯ãã³ãçµéšããããæŒå¥æè¡ãçµæãã³ãã®äžã§ã矀ãæããŠé«ãã§ãã圌ã¯ç¬èªã®é³æ¥œã®äŸ¡å€èгãæã£ãŠããããã³ãã®åæ§ãéèŠããŠããŸãããã°ã§OpenAI APIã®éä¿¡å 容ã確èªã§ããŸãã
Context information is below.
---------------------
èªåã«ã¯äœã®åãæããªãã®ãçæããŠãããããäžåŠã®é ã«æãæ§æ Œã®äººéããã³ãããã£ãŠäººæ°è
ã«ãªã£ãã€ã³ã¿ãã¥ãŒãèªãã§ãã®ã¿ãŒãå§ãããæ¯æ¥ç·Žç¿ãããé°ã§ã®ã¿ãŒã®è
åã¯ããçŽã«ãªã£ãããçµå±ã...
---------------------
Given the context information and not prior knowledge, answer the question. If the answer is not in the context, inform the user that you can't answer the question.
Question: ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ
Answer: You are an expert Q&A system that stricly operates in two modeswhen refining existing answers:
1. **Rewrite** an original answer using the new context.
2. **Repeat** the original answer if the new context isn't useful.
Never reference the original answer or context directly in your answer.
When in doubt, just repeat the original answer.New Context: å€ããè
ã§äžäººã§ããã®ã奜ãã ããåŸè€ã²ãšããšéã£ãŠç¹ã«ã³ãã¥éãšããããã§ã¯ãªãã鳿¥œã«é¢ããŠã¯ç¬èªã®äŸ¡å€èгãæã£ãŠãããæµè¡ïŒã¯ãïŒãã«æµãããã®ãå«ãããã³ãã®åæ§ãéèŠããŠããããã®ãã...
Query: ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ
Original Answer: ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ã®ã¿ãŒã§ãã
New Answer:6-6. ãšã³ãžã³ã®å€æŽ
ãLlamaIndexãã«ã¯ã次ã®3ã€ã®ãšã³ãžã³ããããŸãã
ã»Query Engine : ããŒã¿ã«å¯ŸããŠè³ªåããããã®ãšã³ãžã³ãã¯ãšãªãåãåããLLMã«åç §ã³ã³ããã¹ããšãšãã«æž¡ããŠã¬ã¹ãã³ã¹ãååŸ
ã»Chat Engine : ããŒã¿ãšäŒè©±ããããã®ãšã³ãžã³ãäžåäžçã§ã¯ãªãããã«ãã¿ãŒã³ã§ãäŒè©±å±¥æŽãã¬ã¹ãã³ã¹çæã«å©çš
ã»Agent : ã¿ã¹ã¯ãå®äºããããã«ä»»æã®æ°ã®ã¹ããããå®è¡ããæé©ãªè¡åæ¹éãåçã«æ±ºå®ãäžé£ã®ãToolããä»ããŠäžçãšå¯Ÿè©±
ä»åã¯ãChat Engineãã䜿ããŸããããã©ã«ãã¯ãQuery Engineãã§ã
(1) index.as_chat_engine()ã§ãã£ãããšã³ãžã³ãååŸããŠchat()ã§äŒè©±ã
VectorStoreã®ã³ã³ããã¹ããå©çšããŠäŒè©±ããŸãã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# ãã£ããã§äŒè©±
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
chat_engine = index.as_chat_engine()
response = chat_engine.chat("åŸè€ã²ãšãã®æ§æ Œã¯ïŒ")
print(response)åŸè€ã²ãšãã¯å€ããè ã§äžäººã§ããããšã奜ã¿ãŸãããã³ãã¥ãã±ãŒã·ã§ã³ãèŠæãšããããã§ã¯ãããŸããã圌ã¯ç¬èªã®é³æ¥œã®äŸ¡å€èгãæã¡ãæµè¡ã«æµãããããšãå«ããŸãããã³ãã®åæ§ãéèŠããŠãããæŒå¥æè¡ãé«ãã§ãããã ãã圌ã¯ãã¹ããªã¢ã¹ãªé°å²æ°ãæã£ãŠãããåšå²ããã¯å匷ãåŸæãšæãããŠããŸããããå®éã«ã¯åŠåã¯äžåŠçã¬ãã«ã§ãããæçžŸã¯åžžã«èµ€ç¹ã§ãã圌ã¯èŠé ãè¯ãããã髿 ¡åéšã®éã«ã¯äžå€æŒ¬ãã§ä¹ãåã£ããšèšãããŠããŸãã
(2) äŒè©±å±¥æŽãå¿
èŠãªå
容ã§äŒè©±ã
ãã£ãããšã³ãžã³ã¯äŒè©±å±¥æŽãå©çšããŠäŒè©±ããŸãã
response = chat_engine.chat("ãã®äººç©ã«ã€ããŠã©ãæããŸããïŒ")
print(response)ç§ã¯åŸè€ã²ãšãã«ã€ããŠã¯åæ§çã§è峿·±ã人ç©ã ãšæããŸãã圌ã®é³æ¥œãžã®ç¬èªã®äŸ¡å€èгããã³ããžã®ãã ããã¯çŽ æŽããããšæããŸãããæŒå¥æè¡ã®é«ããé åçã§ãããŸããäžäººã§ããããšã奜ããšããäžé¢ãè峿·±ãã§ããããã ããåŠåãäœããšããç¹ã¯å°ãé©ãã§ããã圌ã®èŠé ã®è¯ããäžå€æŒ¬ãã§é«æ ¡åéšãä¹ãåã£ããšãããšããœãŒããè峿·±ãã§ããå šäœçã«ã¯åŸè€ã²ãšãã¯é åçãªäººç©ã ãšæããŸãã
6-7. ã¹ããªãŒãã³ã°ã®æå¹å
ã¬ã¹ãã³ã¹ã®ã¹ããªãŒãã³ã°ãæå¹åããŸãã
(1) index.as_query_engine()ã®streamingã«Trueãèšå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# ã¬ã¹ãã³ã¹ãã¹ããªãŒãã³ã°ã«å€æŽ
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(streaming=True)
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
response.print_response_stream()6-8. ããã³ãããã³ãã¬ãŒãã®å€æŽ
ä»åã¯ãæ¥æ¬èªã®ããã³ãããã³ãã¬ãŒãã«åãæ¿ããŸãã
(1) QAããã³ãããã³ãã¬ãŒããšRefineããã³ãããã³ãã¬ãŒãã®æºåã
from llama_index.llms import ChatMessage, MessageRole
from llama_index.prompts import ChatPromptTemplate
# Text QA Prompt
chat_text_qa_msgs = [
ChatMessage(
role=MessageRole.SYSTEM,
content="""ããªãã¯äžçäžã§ä¿¡é ŒãããŠããQAã·ã¹ãã ã§ãã
äºåç¥èã§ã¯ãªããåžžã«æäŸãããã³ã³ããã¹ãæ
å ±ã䜿çšããŠã¯ãšãªã«åçããŠãã ããã
åŸãã¹ãããã€ãã®ã«ãŒã«:
1. åçå
ã§æå®ãããã³ã³ããã¹ããçŽæ¥åç
§ããªãã§ãã ããã
2. ãã³ã³ããã¹ãã«åºã¥ããŠã...ãããã³ã³ããã¹ãæ
å ±ã¯...ãããŸãã¯ããã«é¡ãããããªèšè¿°ã¯é¿ããŠãã ããã""",
),
ChatMessage(
role=MessageRole.USER,
content="""ã³ã³ããã¹ãæ
å ±ã¯ä»¥äžã®ãšããã§ãã
---------------------
{context_str}
---------------------
äºåç¥èã§ã¯ãªãã³ã³ããã¹ãæ
å ±ãèæ
®ããŠãã¯ãšãªã«çããŸãã
Query: {query_str}
Answer: """
),
]
text_qa_template = ChatPromptTemplate(chat_text_qa_msgs)
# Refine Prompt
chat_refine_msgs = [
ChatMessage(
role=MessageRole.SYSTEM,
content="""ããªãã¯äžçäžã§ä¿¡é ŒãããŠããQAã·ã¹ãã ã§ãã
äºåç¥èã§ã¯ãªããåžžã«æäŸãããã³ã³ããã¹ãæ
å ±ã䜿çšããŠã¯ãšãªã«åçããŠãã ããã
åŸãã¹ãããã€ãã®ã«ãŒã«:
1. åçå
ã§æå®ãããã³ã³ããã¹ããçŽæ¥åç
§ããªãã§ãã ããã
2. ãã³ã³ããã¹ãã«åºã¥ããŠã...ãããã³ã³ããã¹ãæ
å ±ã¯...ãããŸãã¯ããã«é¡ãããããªèšè¿°ã¯é¿ããŠãã ããã""",
),
ChatMessage(
role=MessageRole.USER,
content="""ããªãã¯ãæ¢åã®åçãæ¹è¯ããéã«2ã€ã®ã¢ãŒãã§å³å¯ã«åäœããQAã·ã¹ãã ã®ãšãã¹ããŒãã§ãã
1. æ°ããã³ã³ããã¹ãã䜿çšããŠå
ã®åçã**æžãçŽã**ã
2. æ°ããã³ã³ããã¹ãã圹ã«ç«ããªãå Žåã¯ãå
ã®åçã**ç¹°ãè¿ã**ã
åçå
ã§å
ã®åçãã³ã³ããã¹ããçŽæ¥åç
§ããªãã§ãã ããã
çåãããå Žåã¯ãå
ã®çããç¹°ãè¿ããŠãã ããã
New Context: {context_msg}
Query: {query_str}
Original Answer: {existing_answer}
New Answer: """
),
]
refine_template = ChatPromptTemplate(chat_refine_msgs)(2) index.as_query_engine()ã®text_qa_templateã«QAããã³ãããã³ãã¬ãŒããrefine_templateã«Refineããã³ãããã³ãã¬ãŒããèšå®ã
from llama_index import VectorStoreIndex, SimpleDirectoryReader
# ã¬ã¹ãã³ã¹ãã¹ããªãŒãã³ã°ã«å€æŽ
documents = SimpleDirectoryReader("data").load_data()
index = VectorStoreIndex.from_documents(documents)
query_engine = index.as_query_engine(
text_qa_template=text_qa_template, # QAããã³ãããã³ãã¬ãŒãã®èšå®
refine_template=refine_template # Refineããã³ãããã³ãã¬ãŒãã®èšå®
)
response = query_engine.query("ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ")
response.print_response_stream()ãã°ã§ããã³ãããã³ãã¬ãŒãã倿ŽãããŠããããšã確èªã§ããŸãã
ã³ã³ããã¹ãæ
å ±ã¯ä»¥äžã®ãšããã§ãã
---------------------
èªåã«ã¯äœã®åãæããªãã®ãçæããŠãããããäžåŠã®é ã«æãæ§æ Œã®äººéããã³ãããã£ãŠäººæ°è
ã«ãªã£ãã€ã³ã¿ãã¥ãŒãèªãã§ãã®ã¿ãŒãå§ãããæ¯æ¥ç·Žç¿ãããé°ã§ã®ã¿ãŒã®è
åã¯ããçŽã«ãªã£ãããçµå±ã...
å€ããè
ã§äžäººã§ããã®ã奜ãã ããåŸè€ã²ãšããšéã£ãŠç¹ã«ã³ãã¥éãšããããã§ã¯ãªãã鳿¥œã«é¢ããŠã¯ç¬èªã®äŸ¡å€èгãæã£ãŠãããæµè¡ïŒã¯ãïŒãã«æµãããã®ãå«ãããã³ãã®åæ§ãéèŠããŠããããã®ãã...
---------------------
äºåç¥èã§ã¯ãªãã³ã³ããã¹ãæ
å ±ãèæ
®ããŠãã¯ãšãªã«çããŸãã
Query: ãŒã£ã¡ã¡ããã®åŸæãªæ¥œåšã¯ïŒ
Answer: 7. LlamaHub
ãLlamaIndexããããã¥ã¡ã³ããšããŠèªã¿èŸŒããã®ã¯ãããã¹ãã ãã§ã¯ãããŸããããLlamaHubãã§æäŸããŠããããŒã¿ã³ãã¯ã¿ãå©çšããããšã§ãããŸããŸãªãã¡ã€ã« (PDFãePubãWordãPowerPointãAudioãªã©) ãWebãµãŒãã¹ (NotionãSlackãWikipediaãªã©) ãããã¥ã¡ã³ãã®ããŒã¿ãœãŒã¹ãšããŠå©çšã§ããŸãã
ä»åã¯ãPDFã«ã€ããŠLlamaIndexã§è³ªåããŠã¿ãŸãã
(1) llama_hubããã±ãŒãžã®ã€ã³ã¹ããŒã«ã
# llama_hubããã±ãŒãžã®ã€ã³ã¹ããŒã«
!pip install llama_hub(2) ã¿ãŒã²ãããšãªãPDFã®æºåã
ä»åã¯ãPDFãGPT-4V(ision) System CardããæºåããŸããã
# PDFã®æºå
!wget https://cdn.openai.com/papers/GPTV_System_Card.pdf(3) ãLlamaHubãã®ãµã€ããéããç®çã®ããŒã¿ã³ãã¯ã¿ãæ¢ãã
ä»åã¯ããfile/pdfããã¯ãªãã¯ããŸãã

(4) äœ¿ãæ¹ (Usage) ã®æé ã«æ²¿ã£ãŠããµã³ãã«ã³ãŒããã³ããããPDFã®ãã¡ã€ã«åã倿Žã
from pathlib import Path
from llama_index import download_loader
PDFReader = download_loader("PDFReader")
loader = PDFReader()
documents = loader.load_data(file=Path('./GPTV_System_Card.pdf'))(5) ã€ã³ããã¯ã¹ãšã¯ãšãªãšã³ãžã³ã®äœæãÂ
from llama_index import VectorStoreIndex
# ã€ã³ããã¯ã¹ã®äœæ
index = VectorStoreIndex.from_documents(documents)
# ã¯ãšãªãšã³ãžã³ã®äœæ
query_engine = index.as_query_engine()(5) 質åå¿çã
# 質åå¿ç
print(query_engine.query("GPT-4Vã®ç¹åŸŽã¯ïŒ"))GPT-4Vã®ç¹åŸŽã¯ããŠãŒã¶ãŒãæäŸããç»åå ¥åãåæããèœåãæã€ããšã§ããããã«ãããGPT-4Vã¯åŸæ¥ã®èšèªã¢ãã«ã«ã¯ãªãæ°ããã€ã³ã¿ãŒãã§ãŒã¹ãšæ©èœãæäŸããæ°ããã¿ã¹ã¯ã解決ãããããŠãŒã¶ãŒã«æ°ããäœéšãæäŸããããšãå¯èœã§ãããŸããGPT-4Vã¯ããã¹ããšããžã§ã³ã®äž¡æ¹ã®ã¢ããªãã£ã®å¶çŽãšèœåãæã¡ãå€§èŠæš¡ãªã¢ãã«ã«ãã£ãŠæäŸãããç¥èœãšæšè«ã«ãã£ãŠçãŸããæ°ããèœåãåããŠããŸãã
é¢é£
ã»LlamaIndex
ã»LlamaIndex.ts
ã»Chat LlamaIndex
ã»LlamaIndex Document
ã»LlamaIndex Hub