在當今數據驅動的世界中,即使是從少量數據中檢索準確信息的能力,對于尋求精簡、有效的快速部署、原型設計或實驗解決方案的開發者來說也至關重要。信息檢索領域的主要挑戰之一是管理非結構化數據集中的各種模式,包括文本、PDF、圖像、表格、音頻、視頻等。
多模態 AI 模型通過同時處理多個數據模式來應對這一挑戰,以不同的形式生成連貫一致的全面輸出。 NVIDIA NIM 微服務可簡化 AI 基礎模型 在語言、 計算機視覺 、語音、生物學等領域的安全可靠部署。
NIM 微服務可隨時隨地部署在 NVIDIA 加速基礎設施上,并提供行業標準 API,以快速集成應用和熱門 AI 開發框架 (包括 LangChain 和 LlamaIndex)。
本文將幫助您著手構建基于視覺語言模型(VLM)的多模態信息檢索系統,該系統能夠回答涉及文本、圖像和表格的復雜查詢。我們將引導您使用 LangGraph 部署應用程序、先進的 llama-3.2-90b-vision-instruct VLM、經過優化的 mistral-small-24B-instruct 大語言模型(LLM),以及用于部署的 NVIDIA NIM。
與傳統方法相比,這種構建簡單信息檢索系統的方法具有許多優勢。最新的 VLM NIM 微服務可在不犧牲一致性的情況下處理冗長而復雜的視覺文檔,從而增強上下文理解。通過集成 LangChain 的工具調用,系統能夠創建工具,動態選擇和使用外部工具,并提高從各種來源提取和解釋數據的精度。
此系統適用于企業應用,因為它生成結構化輸出,確保響應的一致性和可靠性。有關此系統的實施步驟的更多信息,請參閱 /NVIDIA/GenerativeAIExamples Github 倉庫。
簡單的 HTML 多模態檢索工作流
該系統由以下管道組成:
- 文檔提取和預處理:在圖像上運行 VLM 并將其轉換為文本。
- 問答:允許用戶提出系統問題。
這兩個工作流均集成了 NVIDIA NIM 和 LangGraph,可有效處理和理解文本、圖像、復雜的可視化效果和表格。
數據提取和預處理 pipeline
此階段會解析文檔,分別處理文本、圖像和表格。首先將表格轉換為圖像,然后由 NVIDIA 托管的 NIM 微服務 API 端點為 llama-3.2-90b-vision-instruct VLM 處理圖像,以生成描述性文本。
接下來,在文檔重建步驟中,描述性文本將與文檔的原始文本合并,然后由具有長上下文建模功能的 LLM 進行匯總。在此實施中,還可將 Llama-3.2-90b-vision-instruct 用作 LLM,不過也可部署其他 LLM(例如 mistral-small-24b-instruct)。
最后,完整的文本、摘要、圖像及其說明將存儲在 NoSQL 數據庫中,以及唯一的文檔標識符。 圖 1. 數據提取和預處理管道
采用長上下文建模的 LLMs 可以處理整個文檔,而不會出現碎片,從而在單個通道中增強對文檔的理解,并捕獲更長的文本跨度中的關系和細微差別,從而實現更準確的信息檢索。
相比之下,傳統模型可能會處理多達數千個 tokens 的輸入,因此需要將冗長的文檔拆分成較小的塊,以適應模型的上下文窗口。這種分塊過程會破壞一致性和上下文,使準確檢索相關信息并對其進行排名變得更加困難。
但是,長上下文建模會帶來與可擴展性和成本相關的挑戰,在以更高的準確性進行權衡時必須考慮這些挑戰。
QA 管道
所有文檔摘要及其標識符都會編譯成一個大型提示。發送查詢時,使用長上下文建模(本例中為 mistral-small-24b-instruct)的 LLM 會處理問題,評估每個摘要與查詢的相關性,并返回最相關文檔的標識符。 圖 2、問題回答管道
接下來,將最相關的文檔輸入到具有長上下文 (mistral-small-24b-instruct) 的 LLM 中。模型會根據文本內容生成查詢答案。如果模型根據描述性文本識別出圖像可能包含相關信息,則會觸發另一個步驟:將原始圖像和用戶的問題發送至 VLM (llama-3.2-90b-vision-instruct),VLM 可以根據實際視覺內容提供答案。
最后,該系統將文本和視覺見解相結合,以提供全面的答案。
結構化輸出可確保模型返回的數據符合預定義的格式,從而更輕松地提取特定信息并執行后續運算。相比之下,非結構化或可變輸出會在解析模型的響應時引入模糊性和困難,從而阻礙自動化以及與其他系統的集成。
從模型生成結構化數據通常需要精心設計的提示,以指導模型以特定格式(例如 JSON)做出響應。但是,由于模型自然傾向于生成自由格式文本,因此確保一致性遵循此結構可能具有挑戰性。
NVIDIA NIM 現在原生支持生成結構化輸出的功能。這意味著,您可以依靠內置功能來確保模型的響應格式保持一致,從而減少對復雜提示工程的需求。
將 NVIDIA NIM 與 LangChain 集成
NVIDIA NIM 為您的應用提供與熱門框架和最新 AI 模型的無縫兼容性。該流程的實施將 NVIDIA NIM 與 LangChain 相集成。LangChain 是一個用于構建代理應用以確定控制流的框架,已被開發者社區廣泛采用。為編排此工作流的工作流,該圖形主要由兩個節點組成:
- 助理節點:充當負責管理邏輯和決策過程的代理。它與用戶的輸入進行交互,并調用必要的工具。
- 工具節點:用于執行助手所需特定任務的工具集合。
圖 3、使用 LangGraph 為管道構建代理
助理節點
助手節點是根據圖 3 中概述的工作流程運行的主代理。主代理的代碼可在 /NVIDIA/GenerativeAIExamples GitHub repo 中找到。
智能體輸入如下:
Collection_name
:要在其上搜索的文檔集。Question
:用戶的問題。document_id
:(可選) 如果提供,代理會跳過文檔排名階段。
這是智能體流程:
- 文檔選擇 :如果未提供
document_id
,代理會調用find_best_document_id
工具,該工具可在指定集合中識別與用戶問題最相關的文檔。 - 問題回答:對于
document_id
,代理使用query_document
工具。此工具會嘗試使用 LLM (mistral-small-24b-instruct) 根據文檔中的文本和圖像描述來回答此問題。 - 圖像分析 (如有必要):如果
query_document
工具表明答案可能在圖像中 (通過返回image_hash
值),代理會調用query_image
工具。此工具會檢索實際圖像,并使用 VLM 分析圖像并尋找答案。
工具節點
我們為智能體實施了三個關鍵工具來執行任務。
Find_best_document_id
:在未提供document_id
時,確定與用戶問題最相關的文檔。有關更多信息,請參閱 /NVIDIA/GenerativeAIExamples Github 存儲庫。query_document
:在指定文檔中搜索答案。如果答案可能在圖像中,則會提供查詢圖像所需的詳細信息。有關更多信息,請參閱 /NVIDIA/GenerativeAIExamples GitHub 存儲庫。query_image
:當答案可能在圖像內容中時,使用 VLM 分析實際圖像。有關更多信息,請參閱/ NVIDIA/GenerativeAIExamples 。
將外部工具與模型綁定
工具調用是一項功能,可讓語言模型根據收到的提示集成外部工具或函數并與之交互。此機制使模型能夠決定使用哪些工具以及如何使用這些工具來完成特定任務。
工具綁定使模型能夠動態擴展其功能,在執行期間選擇合適的工具,以提供更準確的上下文感知響應。
綁定外部工具在代理框架中尤為重要,在這種框架中,代理必須選擇合適的工具并提供有效執行任務所需的參數。綁定外部工具的優勢包括:
- 擴展功能 :模型可以執行計算、數據檢索或 API 調用等復雜操作,而不僅僅是文本生成。
- 動態工具選擇 :模型可以實時評估哪些工具最適合任務,從而提高效率和相關性。
- 無縫集成:NVIDIA NIM 支持將 LangChain 和 LangGraph 等外部工具與 Llama 3.3 等開放式社區模型集成。您可以采用這些高級功能,而無需對現有系統進行重大更改。
在此實現中,使用 LangChain 的 @tool 裝飾器創建三個工具,然后使用 .bind_tools 方法將這些工具與模型綁定。
使用 PyTorch 定義結構化輸出
通過使用 Pydantic 定義輸出模式,并通過精確的提示引導 LLM NIM 微服務 (例如 mistral-small-24b-instruct) ,您可以確保響應一致、可靠,并且易于被系統中的其他組件使用。當將 LLM 集成到自動化工作流和基于代理的框架 (例如 LangChain) 時,這種方法至關重要。
定義結構
首先,使用 Pydantic 定義 LLM 的預期輸出結構。這可確保模型返回的數據保持一致,并可輕松解析以進行下游處理。
from typing import List, Optional from pydantic import BaseModel, Field class Document(BaseModel): """ Represents a document with an identifier and its summary. """ id: str = Field(..., description="Hash identifier of the document") summary: str = Field(..., description="The summary of the document as is") class BestDocuments(BaseModel): """ Contains a list of the best documents to answer the question and their summaries. """ documents: List[Document] = Field(..., description="List of best documents") class Answer(BaseModel): """ Represents the answer to the user's question. """ answer: str = Field(..., description="Answer to the question posed by the user")
接下來,指示 LLM 生成與定義的 Pydantic 結構保持一致的輸出。這是通過在提示符中加入特定指令并使用 LangChain 的 with_structured_output
方法實現的。
定義提示
prompt_document_expert
包含 LLM 的詳細說明,可指定預期的輸入格式 (帶有文檔摘要的 Markdown) 和所需的輸出格式 (與 BestDocuments
架構匹配的 JSON)。
from langchain.chat_models import ChatNVIDIA from langchain.prompts import ChatPromptTemplate # Initialize the LLM with desired parameters llm = ChatNVIDIA(model="mistralai/mistral-small-24b-instruct ", temperature=0, max_tokens=3000) # Define the prompt template for the document expert prompt_document_expert = ChatPromptTemplate.from_messages( [ ( "system", f""" # Extract Best Document Identifier from list of summaries, based on a question coming from the user. You are an expert in getting insights of a document, based on its summaries and you are able to figure the best matches to the question in terms of the summary of the document. Provide no more than 3 of these documents. ## Format of the Input - The input is a markdown file containing second level headers (##) with the chapter index in the form ## Document <document_id> where document_id is an integer pointing to the index of the document. After the document heading there is the summary of the document which is relevant to understand the content of the document. ## Format of the output - The output is going to be the list of the best documents indices and a few of the corresponding summaries that help to answer the question coming from the user. ## Content - Here is the input you can work on: {{documents_context}} """, ), ( "human", "Can you tell me what are the most relevant document ids for this question: {question}" ), ("human", "Tip: Make sure to answer in the correct format"), ] )
準備上下文
get_context
函數通過檢索文檔摘要并對其進行適當格式化來準備輸入數據。
def get_context(input_data: dict) -> dict: collection_name = input_data.get("collection_name") question = input_data.get("question") documents_context = get_document_summaries_markdown(collection_name) # print(context) return {"documents_context": documents_context, "collection_name": collection_name, "question": question}
綁定結構化輸出
llm.with_structured_output(BestDocuments)
方法指示 LLM 生成符合 BestDocuments
Pydantic 模型的輸出。此方法在內部處理 LLM 響應的解析和驗證,確保輸出與預期結構相匹配。
LangChain 的 with_structured_output
方法簡化了綁定模型以生成結構化輸出的過程。它抽象化了解析和驗證 LLM 響應的復雜性,使您能夠專注于定義所需的輸出結構和提示指令。
最后,創建一個鏈來處理輸入并生成結構化輸出:
chain_document_expert = ( RunnableLambda(get_context) | prompt_document_expert | llm.with_structured_output(BestDocuments) | (lambda x: x.dict()) )
端到端工具的實際應用
要開始使用多模態檢索系統,請克隆 /NVIDIA/GenerativeAIExamples GitHub 存儲庫,然后按照快速入門指南設置服務。在服務啟動并運行時,打開 Web 瀏覽器并導航至 http://localhost:7860 ,通過 Gradio 用戶界面訪問系統。
例如,在 NVIDIA 技術博客上探索系統如何處理查詢。在其中一篇博文中,您可以詢問有關顯示 NVIDIA H100 GPU 性能的條形圖的問題。“ Select Question ” 字段用于評估,真值答案字段值由人類提供。 圖 4、Agent 多文檔評估
該系統會根據條形圖生成準確的答案,并顯示相關圖像以供參考,例如圖表顯示 RetinaNet 達到了 54%。這可確保準確的答案,同時使用戶能夠以直觀方式驗證引用數據。 圖 5、Agent 結果與用于驗證的源圖形
視頻1. 如何使用 NVIDIA NIM 將 HTML 文檔插入多模態檢索器集合
視頻2. 如何使用 NVIDIA NIM 在多模態檢索器集合中搜索文本和圖像
挑戰和解決方案
隨著數據量的增加,處理和檢索相關信息的復雜性也隨之增加。高效處理大型數據集對于保持性能和確保用戶滿意度至關重要。在此信息檢索系統中,文檔摘要的數量甚至可能超過長上下文模型的上下文窗口,這使得在單個提示中處理所有摘要具有挑戰性。
處理大量數據還需要大量計算資源,這可能會導致成本增加和延遲增加。優化資源利用率對于提供快速準確的響應,同時最大限度地減少不必要的支出至關重要。
分層文檔重新排序解決方案
為應對可擴展性挑戰,我們在初始文檔重新排序階段實施了分層方法。我們不會同時處理所有文檔摘要,而是將其分為可管理的批量,以適應模型的上下文窗口。此過程涉及多個階段:
- 批量處理 :將摘要分組為模型可以處理的批量,且不會超過提示大小限制。
- 中級重新排序:模型分別評估每個批次,對每個組中的文檔進行排序。
- 選擇最優秀的候選文檔:從每個批次中選擇最相關的文檔,以進入下一階段。
- 最終重新排名:系統會對所有批次中排名靠前的候選文檔進行合并和重新評估,以確定相關性最高的文檔。
考慮到可擴展性和成本問題,這種分層方法可確保在不超出模型容量的情況下考慮所有文檔。它不僅提高了可擴展性,而且還通過系統縮小候選文檔的范圍來提高效率,直到識別出最相關的文檔。
小型模型的未來前景
使用語言模型,尤其是具有長上下文功能的語言模型,涉及處理大量 token,而這可能會產生巨大的成本。處理的每個 token 都會增加總支出,因此在大規模部署這些系統時,成本管理是一個重要考慮因素。
對成本的擔心確實是站得住腳的。然而,語言模型的格局正在迅速演變,小型模型的功能和效率也在不斷提升。隨著這些進步的繼續,這些較小的模型可能以遠低于成本提供相似的性能。
結束語
本文討論了如何使用 NVIDIA NIM 和 LangChain 實現簡單的多模態信息檢索工作流。與現有的信息檢索方法相比,Pipeline 具有以下優勢:
- 增強對文檔的理解
- 用于從圖像、表格和文本中提取信息的多模態模型
- 無縫集成外部工具
- 生成一致的結構化輸出
借助 NVIDIA NIM 和 LangGraph,您可以在此基礎上進行構建并對其進行定制,以滿足特定需求。首先,您可以在 /NVIDIA/GenerativeAIExamples GitHub repo 中找到源代碼。
NVIDIA NIM 還支持訪問更多針對 NVIDIA GPU 優化的模型。您可以探索 NVIDIA NeMo ,這是一個可擴展的生成式 AI 框架,專為研究 LLM、多模態模型等的研究人員和 PyTorch 開發者而設計。
如果您正在處理大型企業數據語料庫,并希望開發企業就緒的實時多語種和跨語言信息檢索系統來生成上下文感知響應,請詳細了解 NVIDIA NeMo Retriever 。
?