0


基于NVIDIA NIM 平台的知识问答系统实际操作以及10分钟开发一个OCR发票识别系统

随着AI在软件应用中的兴起和市场需求的快速增长,数据科学家和ML工程师在企业环境中扩展ML模型部署时面临着多样化的挑战。加上将AI工作流与现有软件开发流程集成的复杂性,以及在各种环境中灵活、安全部署的应用需求,使问题变得更加复杂。这种复杂性的叠加可能导致部署周期漫长且成本高昂,甚至许多情况下会导致AI应用计划的失败。

NVIDIA NIM 有助于克服构建 AI 应用程序的挑战,为开发者提供行业标准 API,用于构建功能强大的 Copilot、聊天机器人和 AI 助手,同时使 IT 和 DevOps 团队能够轻松地在自己的托管环境中自行托管 AI 模型。NIM 基于可靠的基础构建,包括 TensorRT、TensorRT-LLM 和 PyTorch 等推理引擎,旨在促进大规模无缝 AI 推理。

利用NVIDIA加速计算基础设施来优化AI应用性能,提供低延迟和高吞吐量,以便在大规模生产环境中实现具有可扩展性的LLM部署。


1. NIM平台搭建“基于NVIDIA NIM 平台的知识问答系统:

1.1 与流行库无缝兼容:

只需几行代码,即可使用现有工具和应用程序中的NVIDIA API。

在这里插入图片描述


1.2 使用你喜欢的工具:

使用您最喜欢的大型语言模型(LLM)编程框架,包括LangChain和LlamaIndex,轻松地将最新的AI模型集成到您的应用程序中,可以体验领先的开放式模型。

在这里插入图片描述


1.3 使用NVIDIA NIM加速您的AI部署:

作为NVIDIA AI Enterprise的一部分,NVIDIA NIM是一组易于使用的推理微服务,用于加速基础模型在任何云或数据中心的部署,并帮助保护您的数据安全。

在这里插入图片描述


1.4 部署NIM:

使用单个命令为您的模型部署NIM。您还可以使用微调的模型轻松运行NIM。运行推理,使用基于NVIDIA加速基础架构的最佳运行时引擎启动并运行NIM。构建,开发人员只需几行代码即可集成自托管NIM端点。

在这里插入图片描述


然后我们把下面的代码复制粘贴到一开始创建的 Python 文件中,例如“nim_test.py”:

# -*- coding: utf-8-*-

# 导入必要的库
from langchain_nvidia_ai_endpoints import NVIDIAEmbeddings, ChatNVIDIA
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.vectorstores importFAISSfrom langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.output_parsers import StrOutputParser
from langchain_core.runnables import chain
import os
import gradio as gr
from datetime import datetime
# Even if you do not know the full answer, generate a one-paragraph hypothetical answer to the below question in Chinese
# 定义假设性回答模板
hyde_template ="""Even if you do not know the full answer, generate a one-paragraph hypothetical answer to the below question:{question}"""

# 定义最终回答模板
template ="""Answer the question based only on the following context:{context}

Question:{question}"""

# 定义函数来处理问题
def process_question(url, api_key, model_name, question):
    # 初始化加载器并加载数据
    loader =WebBaseLoader(url)
    docs = loader.load()

    # 设置环境变量
    os.environ['NVIDIA_API_KEY']= api_key

    # 初始化嵌入层
    embeddings =NVIDIAEmbeddings()
    text_splitter =RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=50)
    documents = text_splitter.split_documents(docs)
    vector =FAISS.from_documents(documents, embeddings)
    retriever = vector.as_retriever()

    # 初始化模型
    model =ChatNVIDIA(model=model_name)

    # 创建提示模板
    hyde_prompt = ChatPromptTemplate.from_template(hyde_template)
    hyde_query_transformer = hyde_prompt | model |StrOutputParser()

    # 定义检索函数
    @chain
    def hyde_retriever(question):
        hypothetical_document = hyde_query_transformer.invoke({"question": question})return retriever.invoke(hypothetical_document)

    # 定义最终回答链
    prompt = ChatPromptTemplate.from_template(template)
    answer_chain = prompt | model |StrOutputParser()

    @chain
    def final_chain(question):
        documents = hyde_retriever.invoke(question)
        response =""for s in answer_chain.stream({"question": question,"context": documents}):
            response += s
        return response

    # 调用最终链获取答案
    returnstr(datetime.now())+final_chain.invoke(question)

# 定义可用的模型列表
models =["mistralai/mistral-7b-instruct-v0.2","meta/llama-3.1-405b-instruct"]

# 启动Gradio应用
iface = gr.Interface(
    fn=process_question,
    inputs=[
        gr.Textbox(label="输入需要学习的网址"),
        gr.Textbox(label="NVIDIA API Key"),
        gr.Dropdown(models, label="选择语言模型"),
        gr.Textbox(label="输入问题")],
    outputs="text",
    title="网页知识问答系统")

# 启动Gradio界面
iface.launch()

在这里插入图片描述
这里需要安装一下包和依赖:

pip install langchain_nvidia_ai_endpoints langchain-community langchain-text-splitters faiss-cpu gradio==3.50.0 setuptools beautifulsoup4

在浏览器中输入127.0.0.1之后,可以打开一个网址,先选择llama的模型,并输入问题“告诉我怎么样才能学好鸿蒙技术”,可以看到给我列出了一些信息,表示将这个网站进行了一下分析,然后通过AI的技术栈来获取知识,但是发现好像要60s才能解析出来。

在这里插入图片描述
我们可以看一下另外一个模型mistral,同样的问题,我们看到回答的信息相对要多一点,不过是英文的返回。
在这里插入图片描述


2. 体验一下API的Nim平台模型:

通过shell来使用一下api接口形式:

invoke_url='https://integrate.api.nvidia.com/v1/chat/completions'

authorization_header='Authorization: Bearer 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'
accept_header='Accept: application/json'
content_type_header='Content-Type: application/json'

data=$'{"messages":[{"role":"user","content":"Write a limerick about the wonders of GPU computing."}],"stream":true,"model":"meta/llama-3.1-405b-instruct","max_tokens":1024,"presence_penalty":0,"frequency_penalty":0,"top_p":0.7,"temperature":0.2}'

response=$(curl --silent -i -w "\n%{http_code}"--request POST \
  --url "$invoke_url" \
  --header "$authorization_header" \
  --header "$accept_header" \
  --header "$content_type_header" \
  --data "$data")

echo "$response"
# 先将上面的内容写入的文件中
vi shell.sh
# 再修改这个shell的权限
chmod -R777 shell.sh
# 执行这个shell脚本
./shell.sh

在这里插入图片描述
但是打印出来的信息是截取的字段类型,那我们可以通过将所有的data中的content加在一起看一下效果:

# 提取content并加总
content_total =0for item in data_list:
    content = item["choices"][0]["delta"]["content"]
    content_total +=len(content)print("通过提取content字段,整理为如下信息", content_total)

在这里插入图片描述
就可以得到一个加总后的信息。


4. 识别图片:

OcdrNet
申请地址
https://build.nvidia.com/nvidia/ocdrnet?snippet_tab=Python

模型介绍
用于光学字符检测和识别的预训练模型

在网上找一张图片:

在这里插入图片描述

使用以下脚本:

import os
import sys
import uuid
import zipfile

import requests

# NVCFAPI 的OC DRNet模型端点
nvai_url ="https://ai.api.nvidia.com/v1/cv/nvidia/ocdrnet"

# 授权头,需要API key,如果在NGC之外执行
header_auth = f"Bearer $API_KEY_REQUIRED_IF_EXECUTING_OUTSIDE_NGC"

def _upload_asset(input, description):"""
    上传一个资产到NVCFAPI。
    
    :param input: 要上传的二进制资产
    :param description: 资产的描述
    :return: 资产ID(UUID对象)
    """
    assets_url ="https://api.nvcf.nvidia.com/v2/nvcf/assets"
    
    # 设置请求头
    headers ={"Authorization": header_auth,"Content-Type":"application/json","accept":"application/json",}
    
    # 设置S3请求头
    s3_headers ={"x-amz-meta-nvcf-asset-description": description,"content-type":"image/jpeg",}
    
    # 设置请求负载
    payload ={"contentType":"image/jpeg","description": description}
    
    # 发送POST请求以获取上传URL和资产ID
    response = requests.post(assets_url, headers=headers, json=payload, timeout=30)
    response.raise_for_status()
    
    asset_url = response.json()["uploadUrl"]
    asset_id = response.json()["assetId"]
    
    # 发送PUT请求上传资产
    response = requests.put(
        asset_url,
        data=input,
        headers=s3_headers,
        timeout=300,)
    response.raise_for_status()
    
    # 返回资产IDreturn uuid.UUID(asset_id)if __name__ =="__main__":"""
    上传一张自选图片到NVCFAPI,并向光学字符检测和识别模型发送请求。
    响应保存到本地目录。
    
    注意:必须设置环境变量NGC_PERSONAL_API_KEY。
    """
    
    # 检查命令行参数数量
    iflen(sys.argv)!=3:print("Usage: python test.py <image> <output_dir>")
        sys.exit(1)
    
    # 上传资产并获取资产ID
    asset_id =_upload_asset(open(sys.argv[1],"rb"),"Input Image")
    
    # 设置请求负载
    inputs ={"image": f"{asset_id}","render_label": False}
    
    # 设置资产列表
    asset_list = f"{asset_id}"
    
    # 设置请求头
    headers ={"Content-Type":"application/json","NVCF-INPUT-ASSET-REFERENCES": asset_list,"NVCF-FUNCTION-ASSET-IDS": asset_list,"Authorization": header_auth,}
    
    # 发送POST请求到OC DRNet模型
    response = requests.post(nvai_url, headers=headers, json=inputs)
    
    # 保存响应内容到本地ZIP文件
    withopen(f"{sys.argv[2]}.zip","wb")as out:
        out.write(response.content)
    
    # 解压ZIP文件到输出目录
    with zipfile.ZipFile(f"{sys.argv[2]}.zip","r")as z:
        z.extractall(sys.argv[2])
    
    # 输出保存目录和目录内容
    print(f"Output saved to {sys.argv[2]}")print(os.listdir(sys.argv[2]))

代码相关解释:

这段代码是一个Python脚本,用于与NVIDIA Cloud AI Services(NVCF API)交互,上传一张图片,并使用其光学字符检测和识别(OC DRNet)模型对图片进行处理。处理完成后,结果将被保存到一个本地目录中。下面是对代码各部分的解释:

    1. 导入必要的库:- os:用于操作系统相关的功能,如文件操作。- sys:用于访问与Python解释器相关的变量和函数。- uuid:用于处理UUID(通用唯一标识符)。- zipfile:用于处理ZIP文件。- requests:用于发送HTTP请求。
    1. 设置API端点和授权头:- nvai_url:NVCF API的OC DRNet模型端点。- header_auth:授权头,需要API key。这里使用了一个占位符,实际使用时需要替换为有效的API key。
    1. 定义_upload_asset函数:- 这个函数用于上传一个资产(在这里是一张图片)到NVCF API。- 它接受两个参数:input(要上传的二进制资产)和description(资产的描述)。- 函数内部,首先通过发送POST请求获取上传URL和资产ID,然后使用PUT请求上传资产。- 最后返回资产ID(UUID对象)。
    1. 主程序逻辑:- 首先检查命令行参数数量,确保提供了图片路径和输出目录。- 使用_upload_asset函数上传图片并获取资产ID。- 设置请求负载,包括图片资产ID和其他参数。- 设置请求头,包括授权信息和资产引用。- 发送POST请求到OC DRNet模型进行处理。- 保存响应内容到本地ZIP文件,并解压到指定的输出目录。- 输出保存目录和目录内容。

注意:在实际运行此代码之前,需要确保已经安装了requests库,并且已经替换了header_auth中的占位符为有效的API key。此外,还需要提供正确的图片路径和输出目录作为命令行参数。

总的来说,这段代码演示了如何使用NVIDIA Cloud AI Services的API进行光学字符检测和识别任务,并将结果保存到本地目录中。

# 执行脚本
python3 tes.py 1.jpg img
Output saved to img
['out_a71bdf20-ce3c-4a7d-b192-d56dad1e79c7.jpg','a03aed07-dd73-4ac5-9cef-c106dd487f3d.response']

查看a03aed07-dd73-4ac5-9cef-c106dd487f3d.response数据:

在这里插入图片描述

标签: ocr 人工智能

本文转载自: https://blog.csdn.net/2401_86113894/article/details/142967143
版权归原作者 2401_86113894 所有, 如有侵权,请联系我们删除。

“基于NVIDIA NIM 平台的知识问答系统实际操作以及10分钟开发一个OCR发票识别系统”的评论:

还没有评论