
LlamaIndex ã® ãã«ãã¢ãŒãã«RAG ã®ããã¿
以äžã®èšäºãé¢çœãã£ãã®ã§ãããããŸãšããŸããã
1. ãã«ãã¢ãŒãã«RAG
ãOpenAI Dev Dayãã§æããšããµã€ãã£ã³ã°ãªçºè¡šã®1ã€ã¯ããGPT-4V APIãã®ãªãªãŒã¹ã§ããããGPT-4Vãã¯ãããã¹ã/ç»åã®äž¡æ¹ãåã蟌ã¿ãããã¹ãå¿çãåºåã§ãããã«ãã¢ãŒãã«ã¢ãã«ã§ããããã«ãããLLMãæ°ããã¹ããŒãžã«æ¡åŒµãããŸãã
éå»1幎ãLLMã¢ããªã±ãŒã·ã§ã³ã¹ã¿ãã¯ã¯ããã¹ãã®å ¥åºåãäžå¿ã«åºçŸããŸãããæã泚ç®ãããäŸã®1ã€ããRAGã(æ€çŽ¢æ¡åŒµçæ) ã§ããLLMãšå€éšããã¹ããçµã¿åãããŠãã¢ãã«ãåŠç¿ããŠããªãããŒã¿ãæšè«ã§ããããã«ãªããŸãã
ãRAGãããšã³ããŠãŒã¶ãŒã«ãããããæã倧ããªåœ±é¿ã®1ã€ã¯ãéæ§é åããã¹ãããŒã¿ã®åæã«ãããæéã®ççž®ã§ããä»»æã®ããã¥ã¡ã³ã (PDFãWebããŒãž) ãåŠçããã¹ãã¬ãŒãžã«ããŒãããŠãLLMã®ã³ã³ããã¹ããŠã£ã³ããŠã«ãã£ãŒãããããšã§ãããããå¿ èŠãªæŽå¯ãæœåºã§ããŸãã
ãGPT-4V APIãã®å°å ¥ã«ããããRAGãã®æŠå¿µãããã¹ã/ç»åã®ãã€ããªããã«æ¡åŒµããããã«å€§éã®(ç»åãå«ã) ããŒã¿ã³ãŒãã¹ãã䟡å€ãåŒãåºãããšãã§ããŸãã
2. ãã«ãã¢ãŒãã«RAGã®ãã€ãã©ã€ã³
åºæ¬çãªãã«ãã¢ãŒãã«RAGã®ãã€ãã©ã€ã³ã®æµãã¯ã次ã®ãšããã§ãã
ã»Input : å ¥åã¯ããã¹ããŸãã¯ç»åã
ã»Retrieval :ååŸããã³ã³ããã¹ãã¯ããã¹ããŸãã¯ç»åã
ã»Synthesis : åçã¯ããã¹ããŸãã¯ç»åããããã¯ãã®äž¡æ¹ã«åæã
ã»Response : è¿ãçµæã¯ããã¹ããŸãã¯ç»åããããã¯ãã®äž¡æ¹ã
3. ãã«ãã¢ãŒãã«RAGã®æœè±¡å
ãLlamaIndexãã«ãã«ãã¢ãŒãã«RAGã®æœè±¡åãå°å ¥ãããæ¬¡ã®ããšãå¯èœã«ãªããŸããã
ã»ãã«ãã¢ãŒãã«LLM
ã»ãã«ãã¢ãŒãã«åã蟌ã¿
ã»ãã«ãã¢ãŒãã«ã€ã³ããã¯ã¹
3-1. ãã«ãã¢ãŒãã«LLM
ãOpenAIMultiModalãã¯ã©ã¹ã§ãGPT-4VãããReplicateMultiModalãã¯ã©ã¹ã§ãªãŒãã³ãœãŒã¹ãªãã«ãã¢ãŒãã«ã¢ãã«ããµããŒãããŸã (çŸåšBetaçã®ãããååã¯å€æŽãããå¯èœæ§ããããŸã)ã
ãSimpleDirectoryReaderãã¯ä»¥åããé³å£°ãç»åãåç»ãåã蟌ãããšãã§ããŸããããæ¬¡ã®ããã«ãGPT-4Vãã«çŽæ¥æž¡ããŠè³ªåã§ããããã«ãªããŸããã
from llama_index.multi_modal_llms import OpenAIMultiModal
from llama_index import SimpleDirectoryReader
image_documents = SimpleDirectoryReader(local_directory).load_data()
openai_mm_llm = OpenAIMultiModal(
model="gpt-4-vision-preview",
api_key=OPENAI_API_TOKEN,
max_new_tokens=300
)
response = openai_mm_llm.complete(
prompt="what is in the image?",
image_documents=image_documents
) æšæºã®ãLLMãã¯ã©ã¹ãšã¯ç°ãªãããMultiModalLLMãã¯ç»åãšããã¹ãã®äž¡æ¹ãå ¥åãšããŠåã蟌ãããšãã§ããŸãã

ãªãœãŒã¹ã¯ã次ã®ãšããã§ãã
ã»Multi-modal docs page
ã»GPT-4V
ã»Replicate
ä»åŸã®äºå®ã¯ã次ã®ãšããã§ãã
ã»ããå€ãã®ãã«ãã¢ãŒãã«LLMã®çµ±å
ã»ãã£ãããšã³ããã€ã³ã
ã»ã¹ããªãŒãã³ã°
3-2. ãã«ãã¢ãŒãã«åã蟌ã¿
ããã¹ããšç»åã®äž¡æ¹ãåã蟌ãããšãã§ãããMultiModalEmbeddingããäœæããŸãããããã«ã¯ãæ¢åã®åã蟌ã¿ã¢ãã«ã®ã¡ãœãããå«ãŸããŠããŸããã get_image_embedding ãå«ãŸããŠããŸããäž»ãªå®è£ ã¯ãCLIPã¢ãã«ã䜿çšãããClipEmbeddingãã«ãªããŸãã
ä»åŸã®äºå®ã¯ã次ã®ãšããã§ãã
ã»ããå€ãã®ãã«ãã¢ãŒãã«åã蟌ã¿ã®çµ±å
3-3. ãã«ãã¢ãŒãã«ã€ã³ããã¯ã¹
ãMultiModalVectorIndexããäœæããŸãããæ¢åã® (æã人æ°ã®ãã) ãVectorStoreIndexããšã¯ç°ãªããããã¹ããšç»åã®äž¡æ¹ãä¿åã§ããŸãã
ç»åã®ã€ã³ããã¯ã¹äœæã«ã¯ã次ã®ãããªå¥ã®ããã»ã¹ãå¿
èŠã«ãªããŸãã
(1) CLIPã䜿çšããŠç»åãåã蟌ã
(2) ç»åããŒãã Base64 ãšã³ã³ãŒããŸãã¯ãã¹ãšããŠè¡šããããããã®åã蟌ã¿ãšãšãã«ãã¯ãã« ããŒã¿ããŒã¹ã«ä¿å (ããã¹ããšã¯å¥ã®ã³ã¬ã¯ã·ã§ã³)
ããã¹ããšç»åã®äž¡æ¹ãçµæãšããŠè¿ããããããã®çµæãåæã§ããŸãã
ä»åŸã®äºå®ã¯ã次ã®ãšããã§ãã
ã»ç»åããã¯ã¿ãŒ ã¹ãã¢ã«ä¿åããããã®ãããã€ãã£ããªæ¹æ³Â
ã»ããæè»ãªãã«ãã¢ãŒãã«æ€çŽ¢ã®æœè±¡å
ã»ãã«ãã¢ãŒãã«å¿çåæã®æœè±¡å
4. ãŠã©ãŒã¯ã¹ã«ãŒ
4-1. ãã«ãã¢ãŒãã«ã€ã³ããã¯ã¹ã®äœæ
ã¯ããã«ãããã¥ã¡ã³ããããã¹ããšç»åã®çµã¿åãããšããŠèªã¿èŸŒã¿ãŸãã
documents = SimpleDirectoryReader("./mixed_wiki/").load_data()次ã«ã2ã€ã®å¥ã ã®ãã¯ãã«ããŒã¿ããŒã¹ã³ã¬ã¯ã·ã§ã³ (ããã¹ããšç»å) ãå®çŸ©ããŸãã
次ã«ããMultiModalVectorStoreIndexããå®çŸ©ããŸãã
# ããŒã«ã« Qdrant ãã¯ãã«ã¹ãã¢äœæ
client = qdrant_client.QdrantClient(path="qdrant_mm_db")
text_store = QdrantVectorStore(
client=client, collection_name="text_collection"
)
image_store = QdrantVectorStore(
client=client, collection_name="image_collection"
)
storage_context = StorageContext.from_defaults(vector_store=text_store)
# ãã«ãã¢ãŒãã«ã€ã³ããã¯ã¹ã®äœæ
index = MultiModalVectorStoreIndex.from_documents(
documents, storage_context=storage_context, image_vector_store=image_store
)ãã®åŸããã«ãã¢ãŒãã«ã³ãŒãã¹ã«å¯ŸããŠè³ªåãããããšãã§ããŸãã
4-2. ãã£ãã·ã§ãã³ã°
æåã®ç»åãã£ãã·ã§ã³ãå ¥åãšããŠã³ããŒ/ããŒã¹ãããæ€çŽ¢æ¡åŒµãããåºåãååŸããŸãã
retriever_engine = index.as_retriever(
similarity_top_k=3, image_similarity_top_k=3
)
# GPT-4Vã®ã¬ã¹ãã³ã¹ãã詳现æ
å ±ãååŸ
retrieval_results = retriever_engine.retrieve(query_str)ååŸãããçµæã«ã¯ç»åãšããã¹ãã®äž¡æ¹ãå«ãŸããŸãã

ããããGPT-4Vãã«ãã£ãŒãããŠãã©ããŒã¢ããã®è³ªåãããããäžè²«ããå¿çãåæãããã§ããŸãã

4-3. ã¯ãšãª
ããã§è³ªåãããŠããã«ãã¢ãŒãã«RAGãã€ãã©ã€ã³ããå¿çãååŸããŸãããSimpleMultiModalQueryEngineãã¯ãæåã«é¢é£ããããã¹ã/ç»åã®ã»ãããååŸããå¿çãåæããããã«å ¥åãVisionã¢ãã«ã«äŸçµŠããŸãã
from llama_index.query_engine import SimpleMultiModalQueryEngine
query_engine = index.as_query_engine(
multi_modal_llm=openai_mm_llm,
text_qa_template=qa_tmpl
)
query_str = "Tell me more about the Porsche"
response = query_engine.query(query_str)çµæã¯ã次ã®ãšããã§ãã

ãªãœãŒã¹ã¯ã次ã®ãšããã§ãã