使用GPT-4-Vision和LangChain进行多模态RAG

多模式RAG与GPT-4-Vision和LangChain指的是一个框架,它结合了GPT-4-Vision(OpenAI的GPT-4的多模态版本,可以处理和生成文本、图像,以及可能的其他数据类型)的能力与LangChain,一个旨在促进使用语言模型构建应用程序的工具。以下是关键概念的分解:

  1. 多模式RAG(检索增强生成):
  2. 多模态:这个术语指的是处理和生成多种类型的数据的能力,如文本、图像、音频等。GPT-4-Vision是一个多模态模型的例子,能够处理文本和视觉输入。
  3. 检索增强生成(RAG):RAG是一种技术,结合检索模型的优势(从数据库或知识库中获取相关信息)和生成模型的优势(生成内容)。在GPT-4-Vision的背景下,RAG可用于生成富有内涵的、基于文本和视觉数据的响应。

2. GPT-4-视觉:

  • GPT-4-Vision是GPT-4的一个版本,可以处理文本和图像,使其能够回答问题、生成描述以及执行需要理解视觉内容的任务。在这里我们可以使用gpt-4o-mini来提取文本/表格/图片。
  • 这种能力在需要视觉上下文重要的任务中特别有用,比如分析图像,创建视觉描述,或者将文本和图像数据结合以提供更丰富的输出。

以下是下面代码展示选项3。让我们看看这个概念如何在一些应用中实际使用,我们会看到文字/表格/图片是如何使用的。以下是每个部分的详细说明的代码:

!pip install langchain unstructured[all-docs] pydantic lxml openai chromadb tiktoken pytesseract

请在您的虚拟环境中安装上述软件包。除了上述的pip软件包外,您还需要在您的系统中安装poppler(安装说明)和tesseract(安装说明)。

from typing import Any
import os
from unstructured.partition.pdf import partition_pdf
import pytesseract
import uuid

from langchain.embeddings import OpenAIEmbeddings
from langchain.retrievers.multi_vector import MultiVectorRetriever
from langchain.schema.document import Document
from langchain.storage import InMemoryStore
from langchain.vectorstores import Chroma

import base64
from langchain.chat_models import ChatOpenAI
from langchain.schema.messages import HumanMessage, AIMessage
from dotenv import load_dotenv

from langchain.schema.runnable import RunnablePassthrough
from langchain.prompts import ChatPromptTemplate
from langchain.schema.output_parser import StrOutputParser
# Load environment variables from .env
load_dotenv()

这部分导入必要的库并使用dotenv从.env文件加载环境变量。这个文件可能包含像API密钥之类的敏感信息,应该保持私密。

pytesseract.pytesseract.tesseract_cmd = r'C:\Program Files\Tesseract-OCR\tesseract.exe'

设置Tesseract OCR可执行文件的路径。这允许程序使用OCR从PDF文档中嵌入的图像中提取文本。

input_path = os.getcwd()
output_path = os.path.join(os.getcwd(), "figures")

# Get elements
raw_pdf_elements = partition_pdf(
filename=os.path.join(input_path, "test.pdf"),
extract_images_in_pdf=True,
infer_table_structure=True,
chunking_strategy="by_title",
max_characters=4000,
new_after_n_chars=3800,
combine_text_under_n_chars=2000,
image_output_dir_path=output_path,
)

定义输入和输出路径。 input_path 是当前工作目录,output_path 是从 PDF 中提取的图像将被保存的位置。 从 PDF 文件中提取元素,包括文本、表格和图像。 参数控制文档如何被分块和图像存储的位置。

text_elements = []
table_elements = []
image_elements = []

# Function to encode images
def encode_image(image_path):
with open(image_path, "rb") as image_file:
return base64.b64encode(image_file.read()).decode('utf-8')

for element in raw_pdf_elements:
if 'CompositeElement' in str(type(element)):
text_elements.append(element)
elif 'Table' in str(type(element)):
table_elements.append(element)

table_elements = [i.text for i in table_elements]
text_elements = [i.text for i in text_elements]

# Tables
print("The length of table elements are :", len(table_elements))

# Text
print("The length of text elements are :", len(text_elements))

for image_file in os.listdir(output_path):
if image_file.endswith(('.png', '.jpg', '.jpeg')):
image_path = os.path.join(output_path, image_file)
encoded_image = encode_image(image_path)
image_elements.append(encoded_image)

# image
print("The length of image elements are :",len(image_elements))

初始化列表以存储从PDF提取的不同类型的元素:文本、表格和图片。定义一个函数以base64格式编码图片,使它们可以轻松地嵌入提示或存储。循环遍历提取的元素,将它们分类为文本和表格。每个元素的文本存储在相应的列表中。循环遍历输出目录中提取的图片,将其编码为base64,并将其存储在image_elements列表中。打印出已提取和处理的每个类别(文本、表格、图片)中的元素数量。

chain_gpt= ChatOpenAI(model="gpt-4o-mini", max_tokens=1024)

初始化ChatOpenAI模型的实例,用于为文本、表格和图像生成摘要。

# Function for text summaries
def summarize_text(text_element):
prompt = f"Summarize the following text:\n\n{text_element}\n\nSummary:"
response = chain_gpt.invoke([HumanMessage(content=prompt)])
return response.content

# Function for table summaries
def summarize_table(table_element):
prompt = f"Summarize the following table:\n\n{table_element}\n\nSummary:"
response = chain_gpt.invoke([HumanMessage(content=prompt)])
return response.content

# Function for image summaries
def summarize_image(encoded_image):
prompt = [
AIMessage(content="You are a bot that is good at analyzing images."),
HumanMessage(content=[
{"type": "text", "text": "Describe the contents of this image."},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{encoded_image}"
},
},
])
]
response = chain_gpt.invoke(prompt)
return response.content

定义函数以使用初始化的ChatOpenAI模型生成文本、表格和图片的摘要。图像摘要函数包括一个描述图像内容的提示。

# Initialize the vector store and storage layer
vectorstore = Chroma(collection_name="summaries", embedding_function=OpenAIEmbeddings())
store = InMemoryStore()
id_key = "doc_id"

# Initialize the retriever
retriever = MultiVectorRetriever(vectorstore=vectorstore, docstore=store, id_key=id_key)

初始化一个向量存储器(Chroma)来存储嵌入以及一个内存存储器来保留原始文档。id_key用于唯一识别文档。初始化一个MultiVectorRetriever,将用于根据查询检索相关文档。

# Function to add documents to the retriever
def add_documents_to_retriever(summaries, original_contents):
doc_ids = [str(uuid.uuid4()) for _ in summaries]
summary_docs = [
Document(page_content=s, metadata={id_key: doc_ids[i]})
for i, s in enumerate(summaries)
]
retriever.vectorstore.add_documents(summary_docs)
retriever.docstore.mset(list(zip(doc_ids, original_contents)))


# Add text summaries
add_documents_to_retriever(text_summaries, text_elements)

# Add table summaries
add_documents_to_retriever(table_summaries, table_elements)

# Add image summaries
add_documents_to_retriever(image_summaries, image_elements) # hopefully real images soon

让我们测试一下LLM如果我们给出一个问题,其中上下文涉及来自文本、图像和表格的所有信息,LLM如何回答。

template = """Answer the question based only on the following context, which can include text, images and tables:
{context}
Question: {question}
"""
prompt = ChatPromptTemplate.from_template(template)

model = ChatOpenAI(temperature=0, model="gpt-4o-mini")

chain = (
{"context": retriever, "question": RunnablePassthrough()}
| prompt
| model
| StrOutputParser()
)

print(chain.invoke(
"What do you see on the images in the database? display A graph with unique noun phrases and frequency "))

多模态RAG与GPT-4-Vision和LangChain代表了构建先进AI应用的强大组合。通过利用GPT-4-Vision的多模态能力和LangChain提供的灵活工具,开发人员可以创建既能处理又能生成文本和视觉内容的系统,从而实现更复杂和具有情境意识的AI解决方案。以下是我们在这个过程中涉及的关键内容。

  • 我们使用Unstructured来解析文档(PDF)中的图片、文本和表格。
  • 我们使用了多向量检索器与Chroma一起存储原始文本和图像及其摘要以供检索。
  • 我们使用GPT-4V(GPT-4o-mini)来进行图像摘要(用于检索),以及从图片和文字(或表格)的联合评论中进行最终答案合成。
  • 检索是基于图像摘要和文本块的相似性进行的。

参考:

  • 浪极品-食谱
  • https://blog.langchain.dev/semi-structured-multi-modal-rag/

2024-09-05 04:19:31 AI中文站翻译自原文