zalo
Chat ngay

Sử dụng GPT4 Vision với chức năng gọi

Mô hình tài khoản Chat GPT-4 Turbo mới, có sẵn dưới dạng gpt-4-turbo-2024-04-09 kể từ tháng 4 năm 2024, hiện cho phép gọi hàm với khả năng thị giác, suy luận tốt hơn và ngày giới hạn kiến ​​thức là tháng 12 năm 2023. Sử dụng hình ảnh với chức năng gọi hàm sẽ mở khóa các trường hợp sử dụng đa phương thức và khả năng sử dụng suy luận, cho phép bạn vượt ra ngoài OCR và mô tả hình ảnh.

Chúng tôi sẽ xem xét hai ví dụ để chứng minh cách sử dụng lệnh gọi hàm với GPT-4 Turbo với Vision:

+ Mô phỏng trợ lý dịch vụ khách hàng để hỗ trợ ngoại lệ giao hàng

+ Phân tích biểu đồ tổ chức để trích xuất thông tin nhân viên

Xem thêm: mua tài khoản ChatGPT Plus chính hãng giá rẻ chỉ với vài bước đơn giản

Cài đặt và thiết lập

!pip install pymupdf --quiet
!pip install openai --quiet
!pip install matplotlib --quiet
# instructor makes it easy to work with function calling
!pip install instructor --quiet

 

import base64
import os
from enum import Enum
from io import BytesIO
from typing import Iterable
from typing import List
from typing import Literal, Optional
import fitz
# Instructor is powered by Pydantic, which is powered by type hints. Schema validation, prompting is controlled by type annotations
import instructor
import matplotlib.pyplot as plt
import pandas as pd
from IPython.display import display
from PIL import Image
from openai import OpenAI
from pydantic import BaseModel, Field

Mô phỏng trợ lý dịch vụ khách hàng để hỗ trợ ngoại lệ giao hàng

Chúng tôi sẽ mô phỏng một trợ lý dịch vụ khách hàng cho một dịch vụ giao hàng được trang bị để phân tích hình ảnh của các gói hàng. Trợ lý sẽ thực hiện các hành động sau dựa trên phân tích hình ảnh:

+ Nếu hình ảnh cho thấy gói hàng bị hư hỏng, chúng tôi sẽ tự động xử lý hoàn tiền theo chính sách.

+ Nếu gói hàng trông có vẻ ướt, hãy tiến hành thay thế.

+ Nếu gói hàng có vẻ bình thường và không bị hư hỏng, hãy liên hệ với nhân viên.

Hãy xem các hình ảnh mẫu của các gói mà trợ lý dịch vụ khách hàng sẽ phân tích để xác định hành động phù hợp. Chúng tôi sẽ mã hóa các hình ảnh dưới dạng chuỗi base64 để mô hình xử lý.

# Function to encode the image as base64
def encode_image(image_path: str): # check if the image exists if not os.path.exists(image_path): raise FileNotFoundError(f"Image file not found: {image_path}") with open(image_path, "rb") as image_file: return base64.b64encode(image_file.read()).decode('utf-8')
# Sample images for testing
image_dir = "images"
# encode all images within the directory
image_files = os.listdir(image_dir)
image_data = {}
for image_file in image_files: image_path = os.path.join(image_dir, image_file) # encode the image with key as the image file name image_data[image_file.split('.')[0]] = encode_image(image_path) print(f"Encoded image: {image_file}")
def display_images(image_data: dict): fig, axs = plt.subplots(1, 3, figsize=(18, 6)) for i, (key, value) in enumerate(image_data.items()): img = Image.open(BytesIO(base64.b64decode(value))) ax = axs[i] ax.imshow(img) ax.axis("off") ax.set_title(key) plt.tight_layout() plt.show()
display_images(image_data)

 

Chúng tôi đã mã hóa thành công các hình ảnh mẫu dưới dạng chuỗi base64 và hiển thị chúng. Trợ lý dịch vụ khách hàng sẽ phân tích các hình ảnh này để xác định hành động phù hợp dựa trên tình trạng gói hàng.

Bây giờ chúng ta hãy xác định các chức năng/công cụ để xử lý đơn hàng, chẳng hạn như chuyển đơn hàng đến một đại lý, hoàn lại tiền cho đơn hàng và thay thế đơn hàng. Chúng ta sẽ tạo các hàm giữ chỗ để mô phỏng quá trình xử lý các hành động này dựa trên các công cụ đã xác định. Chúng ta sẽ sử dụng các mô hình Pydantic để xác định cấu trúc dữ liệu cho các hành động đặt hàng.

MODEL = "gpt-4-turbo-2024-04-09"
class Order(BaseModel): """Represents an order with details such as order ID, customer name, product name, price, status, and delivery date.""" order_id: str = Field(..., description="The unique identifier of the order") product_name: str = Field(..., description="The name of the product") price: float = Field(..., description="The price of the product") status: str = Field(..., description="The status of the order") delivery_date: str = Field(..., description="The delivery date of the order")
# Placeholder functions for order processing
def get_order_details(order_id): # Placeholder function to retrieve order details based on the order ID return Order( order_id=order_id, product_name="Product X", price=100.0, status="Delivered", delivery_date="2024-04-10", )
def escalate_to_agent(order: Order, message: str): # Placeholder function to escalate the order to a human agent return f"Order {order.order_id} has been escalated to an agent with message: `{message}`"
def refund_order(order: Order): # Placeholder function to process a refund for the order return f"Order {order.order_id} has been refunded successfully."
def replace_order(order: Order): # Placeholder function to replace the order with a new one return f"Order {order.order_id} has been replaced with a new order."
class FunctionCallBase(BaseModel): rationale: Optional[str] = Field(..., description="The reason for the action.") image_description: Optional[str] = Field( ..., description="The detailed description of the package image." ) action: Literal["escalate_to_agent", "replace_order", "refund_order"] message: Optional[str] = Field( ..., description="The message to be escalated to the agent if action is escalate_to_agent", ) # Placeholder functions to process the action based on the order ID def __call__(self, order_id): order: Order = get_order_details(order_id=order_id) if self.action == "escalate_to_agent": return escalate_to_agent(order, self.message) if self.action == "replace_order": return replace_order(order) if self.action == "refund_order": return refund_order(order)
class EscalateToAgent(FunctionCallBase): """Escalate to an agent for further assistance.""" pass
class OrderActionBase(FunctionCallBase): pass
class ReplaceOrder(OrderActionBase): """Tool call to replace an order.""" pass
class RefundOrder(OrderActionBase): """Tool call to refund an order.""" pass

 

Mô phỏng tin nhắn của người dùng và xử lý hình ảnh gói

Chúng tôi sẽ mô phỏng các thông điệp của người dùng có chứa hình ảnh gói và xử lý hình ảnh bằng mô hình GPT-4 Turbo với Vision. Mô hình sẽ xác định lệnh gọi công cụ phù hợp dựa trên phân tích hình ảnh và các hành động được xác định trước cho các gói bị hỏng, ướt hoặc bình thường. Sau đó, chúng tôi sẽ xử lý hành động đã xác định dựa trên ID đơn hàng và hiển thị kết quả.

# extract the tool call from the response
ORDER_ID = "12345" # Placeholder order ID for testing
INSTRUCTION_PROMPT = "You are a customer service assistant for a delivery service, equipped to analyze images of packages. If a package appears damaged in the image, automatically process a refund according to policy. If the package looks wet, initiate a replacement. If the package appears normal and not damaged, escalate to agent. For any other issues or unclear images, escalate to agent. You must always use tools!"
def delivery_exception_support_handler(test_image: str): payload = { "model": MODEL, "response_model": Iterable[RefundOrder | ReplaceOrder | EscalateToAgent], "tool_choice": "auto", # automatically select the tool based on the context "temperature": 0.0, # for less diversity in responses "seed": 123, # Set a seed for reproducibility } payload["messages"] = [ { "role": "user", "content": INSTRUCTION_PROMPT, }, { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{image_data[test_image]}" } }, ], } ] function_calls = instructor.from_openai( OpenAI(), mode=instructor.Mode.PARALLEL_TOOLS ).chat.completions.create(**payload) for tool in function_calls: print(f"- Tool call: {tool.action} for provided img: {test_image}") print(f"- Parameters: {tool}") print(f">> Action result: {tool(ORDER_ID)}") return tool
print("Processing delivery exception support for different package images...")
print("\n===================== Simulating user message 1 =====================")
assert delivery_exception_support_handler("damaged_package").action == "refund_order"
print("\n===================== Simulating user message 2 =====================")
assert delivery_exception_support_handler("normal_package").action == "escalate_to_agent"
print("\n===================== Simulating user message 3 =====================")
assert delivery_exception_support_handler("wet_package").action == "replace_order"

 

Đang xử lý hỗ trợ ngoại lệ giao hàng cho các hình ảnh gói hàng khác nhau...
======================== Mô phỏng tin nhắn người dùng 1 ===================== - Gọi công cụ: refund_order cho hình ảnh được cung cấp: broken_package - Tham số: rationale='Gói hàng bị hư hỏng rõ ràng với nhiều vết rách và dập nát, cho thấy khả năng gây hại cho nội dung.' image_description='Gói hàng trong hình ảnh cho thấy hư hỏng nghiêm trọng, bao gồm các nếp gấp sâu và vết rách trên bìa cứng. Gói hàng cũng được bọc bằng băng dính bổ sung, cho thấy đã có những nỗ lực trước đó để cố định gói hàng sau khi bị hư hỏng.' action='refund_order' message=None >> Kết quả hành động: Đơn hàng 12345 đã được hoàn lại tiền thành công.
=== ...
​ ​Gói hàng có vẻ bình thường và không bị hư hại. `
======================= Mô phỏng tin nhắn người dùng 3 ===================== - Gọi công cụ: replace_order cho img được cung cấp: wet_package - Tham số: rationale='Gói hàng có vẻ ướt, có thể làm hỏng nội dung, đặc biệt là vì nó được dán nhãn là dễ vỡ.' image_description="Gói hàng trong hình ảnh cho thấy bề mặt trên cùng bị ướt đáng kể, cho thấy khả năng bị hư hỏng do nước. Hộp được dán nhãn là 'DỄ VỠ', cho thấy nội dung bên trong rất mỏng manh và có thể dễ bị hư hỏng do độ ẩm hơn." action='replace_order' message=None >> Kết quả hành động: Đơn hàng 12345 đã được thay thế bằng đơn hàng mới.

 

Phân tích biểu đồ tổ chức để trích xuất thông tin nhân viên

Đối với ví dụ thứ hai, chúng ta sẽ phân tích hình ảnh biểu đồ tổ chức để trích xuất thông tin nhân viên, chẳng hạn như tên nhân viên, vai trò, người quản lý và vai trò của người quản lý. Chúng ta sẽ sử dụng GPT-4 Turbo với Vision để xử lý hình ảnh biểu đồ tổ chức và trích xuất dữ liệu có cấu trúc về nhân viên trong tổ chức. Thật vậy, lệnh gọi hàm cho phép chúng ta vượt ra ngoài OCR để thực sự suy luận và dịch các mối quan hệ phân cấp trong biểu đồ.

Chúng ta sẽ bắt đầu với một mẫu sơ đồ tổ chức ở định dạng PDF mà chúng ta muốn phân tích và chuyển đổi trang đầu tiên của PDF sang hình ảnh JPEG để phân tích.

# Function to convert a single page PDF page to a JPEG image
def convert_pdf_page_to_jpg(pdf_path: str, output_path: str, page_number=0): if not os.path.exists(pdf_path): raise FileNotFoundError(f"PDF file not found: {pdf_path}") doc = fitz.open(pdf_path) page = doc.load_page(page_number) # 0 is the first page pix = page.get_pixmap() # Save the pixmap as a JPEG pix.save(output_path)
def display_img_local(image_path: str): img = Image.open(image_path) display(img)
pdf_path = 'data/org-chart-sample.pdf'
output_path = 'org-chart-sample.jpg'
convert_pdf_page_to_jpg(pdf_path, output_path)
display_img_local(output_path)

 

 

Hình ảnh biểu đồ tổ chức đã được trích xuất thành công từ tệp PDF và hiển thị. Bây giờ chúng ta hãy định nghĩa một hàm để phân tích hình ảnh biểu đồ tổ chức bằng GPT4 Turbo mới với Vision. Hàm này sẽ trích xuất thông tin về nhân viên, vai trò của họ và người quản lý của họ từ hình ảnh. Chúng ta sẽ sử dụng lệnh gọi hàm/công cụ để chỉ định các tham số đầu vào cho cấu trúc tổ chức, chẳng hạn như tên nhân viên, vai trò và tên và vai trò của người quản lý. Chúng ta sẽ sử dụng các mô hình Pydantic để định nghĩa cấu trúc của dữ liệu.

base64_img = encode_image(output_path)
class RoleEnum(str, Enum): """Defines possible roles within an organization.""" CEO = "CEO" CTO = "CTO" CFO = "CFO" COO = "COO" EMPLOYEE = "Employee" MANAGER = "Manager" INTERN = "Intern" OTHER = "Other"
class Employee(BaseModel): """Represents an employee, including their name, role, and optional manager information.""" employee_name: str = Field(..., description="The name of the employee") role: RoleEnum = Field(..., description="The role of the employee") manager_name: Optional[str] = Field(None, description="The manager's name, if applicable") manager_role: Optional[RoleEnum] = Field(None, description="The manager's role, if applicable")
class EmployeeList(BaseModel): """A list of employees within the organizational structure.""" employees: List[Employee] = Field(..., description="A list of employees")
def parse_orgchart(base64_img: str) -> EmployeeList: response = instructor.from_openai(OpenAI()).chat.completions.create( model='gpt-4-turbo', response_model=EmployeeList, messages=[ { "role": "user", "content": 'Analyze the given organizational chart and very carefully extract the information.', }, { "role": "user", "content": [ { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{base64_img}" } }, ], } ], ) return response

 

Bây giờ, chúng ta sẽ định nghĩa một hàm để phân tích phản hồi từ GPT-4 Turbo với Vision và trích xuất dữ liệu nhân viên. Chúng ta sẽ lập bảng dữ liệu trích xuất để dễ hình dung. Xin lưu ý rằng độ chính xác của dữ liệu trích xuất có thể thay đổi tùy theo độ phức tạp và độ rõ nét của hình ảnh đầu vào.

# call the functions to analyze the organizational chart and parse the response
result = parse_orgchart(base64_img)
# tabulate the extracted data
df = pd.DataFrame([{ 'employee_name': employee.employee_name, 'role': employee.role.value, 'manager_name': employee.manager_name, 'manager_role': employee.manager_role.value if employee.manager_role else None
} for employee in result.employees])
display(df)
 tên_nhân_viênvai tròtên_quản_lývai trò quản lý
0Juliana SilvaTổng giám đốc điều hànhKhông cóKhông có
1Kim Chun HeiGiám đốc tài chínhJuliana SilvaTổng giám đốc điều hành
2Chad GibbonsGiám đốc công nghệJuliana SilvaTổng giám đốc điều hành
3Chiaki SatoGiám đốc điều hànhJuliana SilvaTổng giám đốc điều hành
4Ánh sáng nữ thầnGiám đốcKim Chun HeiGiám đốc tài chính
5Shawn GarciaGiám đốcChad GibbonsGiám đốc công nghệ
6Aaron LoebGiám đốcChiaki SatoGiám đốc điều hành
7Drew FeigNgười lao độngÁnh sáng nữ thầnGiám đốc
8Richard SanchezNgười lao độngÁnh sáng nữ thầnGiám đốc
9Sacha DuboisThực tập sinhÁnh sáng nữ thầnGiám đốc
10Olivia WilsonNgười lao độngShawn GarciaGiám đốc
11Matt TrươngThực tập sinhShawn GarciaGiám đốc
12Avery DavisNgười lao độngAaron LoebGiám đốc
13Harper RussoNgười lao độngAaron LoebGiám đốc
14Taylor AlonsoThực tập sinhAaron LoebGiám đốc

 

Dữ liệu trích xuất từ ​​biểu đồ tổ chức đã được phân tích thành công và hiển thị trong DataFrame. Phương pháp này cho phép chúng tôi tận dụng GPT-4 Turbo với khả năng Vision để trích xuất thông tin có cấu trúc từ hình ảnh, chẳng hạn như biểu đồ và sơ đồ tổ chức, và xử lý dữ liệu để phân tích thêm. Bằng cách sử dụng lệnh gọi hàm, chúng tôi có thể mở rộng chức năng của các mô hình đa phương thức để thực hiện các tác vụ cụ thể hoặc gọi các hàm bên ngoài.

Hot Deal

Họ tên (*)

Số điện thoại (*)

Email (*)

Dịch vụ

Đăng ký để nhận bản tin mới nhất !