LLM之RAG實戰(zhàn)(七)| 使用llama_index實現(xiàn)多模態(tài)RAG
轉(zhuǎn)載自:LLM之RAG實戰(zhàn)(七)| 使用llama_index實現(xiàn)多模態(tài)RAG
https://mp.weixin.qq.com/s/FVF09cEO5nUipcL9R8ydXQ
一、多模態(tài)RAG
OpenAI開發(fā)日上最令人興奮的發(fā)布之一是GPT-4V API(https://platform.openai.com/docs/guides/vision)的發(fā)布。GPT-4V是一個多模態(tài)模型,可以接收文本/圖像,并可以輸出文本響應(yīng)。最近還有一些其他的多模態(tài)模型:LLaVa和Fuyu-8B。
在過去的一年里,大部分應(yīng)用程序開發(fā)都是圍繞文本輸入/文本輸出范式。最典型的例子之一是檢索增強生成(RAG)——將LLM與外部文本語料庫相結(jié)合,對模型未經(jīng)訓(xùn)練的數(shù)據(jù)進行推理。通過處理任意文檔(比如PDF、網(wǎng)頁),將其切分為塊并存儲到向量數(shù)據(jù)庫中,然后通過檢索到相關(guān)的塊輸入給LLM,讓LLM給出用戶期待的回復(fù)。
**與標(biāo)準(zhǔn)RAG pipeline對比,我們看一下多模態(tài)RAG的所有步驟:
輸入:輸入可以是文本或圖像。
檢索:檢索到的上下文可以是文本或圖像。
合成:答案可以在文本和圖像上合成。
響應(yīng):返回的結(jié)果可以是文本和/或圖像。
也可以在圖像和文本之間采用鏈?zhǔn)?順序調(diào)用,例如檢索增強圖像字幕或在多模態(tài)代理進行循環(huán)。
二、多模態(tài)LLM
OpenAIMultiModal類可以直接支持GPT-4V模型,ReplicateMultiModal類可以支持開源多模式模型(目前處于測試版,因此名稱可能會更改)。SimpleDirectoryReader能夠接收音頻、圖像和視頻,現(xiàn)在可以直接將它們傳遞給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
)
與默認(rèn)具有標(biāo)準(zhǔn)的完成/聊天端點的LLM類不同,多模態(tài)模型(MultiModalLLM)可以接受圖像和文本作為輸入。
三、多模態(tài)嵌入
我們介紹一個新的MultiModalEmbedding基類,它既可以embedding文本也可以embedding圖像。它包含了我們現(xiàn)有嵌入模型的所有方法(子類BaseEmbedding),但也公開了get_image_embedding。我們在這里的主要實現(xiàn)是使用CLIP模型的ClipEmbedding。
四、多模態(tài)索引與檢索
MultiModalVectorIndex可以從向量數(shù)據(jù)庫中索引文本和圖像。與我們現(xiàn)有的(最流行的)索引VectorStoreIndex不同,這個新索引可以存儲文本和圖像文檔。索引文本與之前是一樣的——使用文本嵌入模型嵌入的,并存儲在矢量數(shù)據(jù)庫中。圖像索引是一個單獨的過程,如下所示:、
- 使用CLIP嵌入圖像;
- 使用base64編碼或路徑表示圖像節(jié)點,并將其與嵌入一起存儲在矢量數(shù)據(jù)庫中(與文本分離)。
我們將圖像和文本分開存儲,因為我們可能希望對文本使用純文本嵌入模型,而不是CLIP嵌入(例如ada或sbert)。
在檢索期間,我們執(zhí)行以下操作:
- 通過在文本嵌入上進行矢量搜索來檢索文本;
- 通過在圖像嵌入上進行矢量搜索來檢索圖像
文本和圖像作為節(jié)點返回到結(jié)果列表中,然后再匯總這些結(jié)果。
五、多模態(tài)RAG實戰(zhàn)
下面我們以查詢特斯拉為例展示llama_index實現(xiàn)多模態(tài)RAG,根據(jù)給出特斯拉的網(wǎng)站或車輛、SEC填充物和維基百科頁面的截圖來查詢特斯拉。
加載文本和圖像混合文本:*
documents = SimpleDirectoryReader("./mixed_wiki/").load_data()
然后,我們在Qdrant中定義兩個獨立的矢量數(shù)據(jù)庫:一個用于存儲文本文檔,一個用于存儲圖像。然后我們定義一個MultiModalVectorStoreIndex。
# Create a local Qdrant vector store
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)
# Create the MultiModal index
index = MultiModalVectorStoreIndex.from_documents(
documents, storage_context=storage_context, image_vector_store=image_store
)
**最后,我們可以通過我們的多模態(tài)語料庫進行提問。
**示例1:檢索增強字幕
我們復(fù)制/粘貼初始圖像標(biāo)題作為輸入,以獲得檢索增強輸出:
retriever_engine = index.as_retriever(
similarity_top_k=3, image_similarity_top_k=3
)
# retrieve more information from the GPT4V response
retrieval_results = retriever_engine.retrieve(query_str)
檢索到的結(jié)果包含圖像和文本:
我們可以將其提供給GPT-4V,以提出后續(xù)問題或綜合一致的回答:
示例2:多模態(tài)RAG查詢
我們提出了一個問題,并從整個多模態(tài)RAG pipeline中得到回應(yīng)。SimpleMultiModalQueryEngine首先檢索相關(guān)圖像/文本集,并將其輸入給視覺模型,以便合成響應(yīng)。
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)
生成的結(jié)果+來源如下所示:
參考文獻:文章來源:http://www.zghlxwxcb.cn/news/detail-799357.html
[1] https://blog.llamaindex.ai/multi-modal-rag-621de7525fea
[2] https://github.com/run-llama/llama_index/blob/main/docs/examples/multi_modal/llava_multi_modal_tesla_10q.ipynb文章來源地址http://www.zghlxwxcb.cn/news/detail-799357.html
到了這里,關(guān)于RAG實戰(zhàn) 7 - 使用llama_index實現(xiàn)多模態(tài)RAG的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!