链载Ai

标题: 使用 GPT-4-Vision 和 LangChain 的多模态 RAG [打印本页]

作者: 链载Ai    时间: 昨天 11:33
标题: 使用 GPT-4-Vision 和 LangChain 的多模态 RAG

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">多模态 RAG 与 GPT4Vision 和 LangChain是指一个框架,它结合了 GPT-4-Vision(OpenAI 的 GPT-4 的多模态版本,能够处理和生成文本、图像以及可能的其他数据类型)的能力与 LangChain,这是一个旨在促进使用语言模型构建应用程序的工具。以下是关键概念的分解:

    ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;letter-spacing: normal;orphans: 2;text-align: start;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;" class="list-paddingleft-1">
  1. 多模态 RAG(检索增强生成):
    *多模态:这个术语指的是处理和生成多种类型数据的能力,例如文本、图像、音频等。GPT-4-Vision 是一个能够处理文本和视觉输入的多模态模型的例子。
    *检索增强生成(RAG):RAG 是一种结合了基于检索模型(从数据库或知识库中获取相关信息)与基于生成模型(创建内容)的优点的技术。在 GPT-4-Vision 的上下文中,RAG 可用于生成丰富、信息丰富的响应,这些响应基于文本和视觉数据。

  2. GPT-4-Vision:

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">下面的代码演示了选项 3。让我们看看这个概念如何在一些应用中实际使用,在这些应用中我们将看到文本/表格/图像的使用。以下是每个部分的详细解释的代码:

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

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">请在您的虚拟环境中安装上述软件包。除了上述 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
# 从 .env 加载环境变量
load_dotenv()

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">此部分导入必要的库,并使用dotenv.env文件加载环境变量。该文件可能包含敏感信息,例如 API 密钥,应保持私密。

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

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">设置 Tesseract OCR 可执行文件的路径。这使程序能够使用 OCR 从嵌入在 PDF 文档中的图像中提取文本。

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

# 获取元素
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,
)

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">定义输入和输出路径。input_path是当前工作目录,output_path是提取的 PDF 图像将被保存的位置。提取 PDF 文件中的元素,包括文本、表格和图像。参数控制文档的分块方式以及图像的存储位置。

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

# 编码图像的函数
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]

# 表格
print("表格元素的数量为 :", len(table_elements))

# 文本
print("文本元素的数量为 :", 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)

# 图像
print("图像元素的数量为 :",len(image_elements))

ingFang SC", Cambria, Cochin, Georgia, serif;font-size: medium;font-style: normal;font-variant-ligatures: normal;font-variant-caps: normal;font-weight: 400;orphans: 2;text-indent: 0px;text-transform: none;widows: 2;word-spacing: 0px;-webkit-text-stroke-width: 0px;white-space: normal;text-decoration-thickness: initial;text-decoration-style: initial;text-decoration-color: initial;">初始化列表以存储从 PDF 中提取的不同类型的元素:文本、表格和图像。定义一个函数以 base64 格式编码图像,这使得它们可以轻松嵌入到提示中或存储。循环遍历提取的元素,将它们分类为文本和表格。每个元素的文本存储在相应的列表中。循环遍历输出目录中提取的图像,将它们编码为 base64,并存储在 image_elements 列表中。打印出每个类别(文本、表格、图像)中提取和处理的元素数量。

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

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

# 文本摘要的函数
def summarize_text(text_element):
prompt = f"总结以下文本:\n\n{text_element}\n\n摘要:"
response = chain_gpt.invoke([HumanMessage(content=prompt)])
return response.content

# 表格摘要的函数
def summarize_table(table_element):
prompt = f"总结以下表格:\n\n{table_element}\n\n摘要:"
response = chain_gpt.invoke([HumanMessage(content=prompt)])
return response.content

# 图像摘要的函数
def summarize_image(encoded_image):
prompt = [
AIMessage(content="你是一个擅长分析图像的机器人。"),
HumanMessage(content=[
{"type": "text", "text": "描述这张图像的内容。"},
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{encoded_image}"
},
},
])
]
response = chain_gpt.invoke(prompt)
return response.content

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

# 初始化向量存储和存储层
vectorstore = Chroma(collection_name="summaries", embedding_function=OpenAIEmbeddings())
store = InMemoryStore()
id_key = "doc_id"

# 初始化检索器
retriever = MultiVectorRetriever(vectorstore=vectorstore, docstore=store, id_key=id_key)

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

# 将文档添加到检索器的函数
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_documents_to_retriever(text_summaries, text_elements)

# 添加表格摘要
add_documents_to_retriever(table_summaries, table_elements)

# 添加图像摘要
add_documents_to_retriever(image_summaries, image_elements) # 希望很快能有真实图像

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

template = """仅根据以下上下文回答问题,该上下文可以包括文本、图像和表格:
{context}
问题:{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(
"数据库中的图像显示了什么?展示一个包含独特名词短语和频率的图表。"))

多模态 RAG 与 GPT4Vision 和 LangChain 代表了构建先进 AI 应用程序的强大组合。通过利用 GPT-4-Vision 的多模态能力和 LangChain 提供的灵活工具,开发人员可以创建处理和生成文本和视觉内容的系统,从而导致更复杂和上下文感知的 AI 解决方案。以下是我们所涵盖的关键内容。






欢迎光临 链载Ai (https://www.lianzai.com/) Powered by Discuz! X3.5