.png)
API Hoàn thành trò chuyện so với API Trợ lý
Các nguyên hàm của API Chat Completions là Messages, trên đó bạn thực hiện lệnh a Completionvới Model( gpt-3.5-turbo, gpt-4, v.v.). API này nhẹ và mạnh mẽ, nhưng về bản chất là không có trạng thái, nghĩa là bạn phải quản lý trạng thái hội thoại, định nghĩa công cụ, tài liệu truy xuất và thực thi mã theo cách thủ công.
Các nguyên thủy của API Trợ lý là
Assistants, bao gồm một mô hình cơ sở, hướng dẫn, công cụ và tài liệu (bối cảnh),Threads, biểu thị trạng thái của một cuộc trò chuyện vàRuns, cung cấp năng lượng cho việc thực hiệnAssistanttrên aThread, bao gồm phản hồi bằng văn bản và sử dụng công cụ nhiều bước.
Mua tài khoản Chat GPT 4 chỉ với vài bước đơn giản tại Vua Quảng Cáo
Chúng ta sẽ xem xét cách sử dụng chúng để tạo ra những trải nghiệm mạnh mẽ và có trạng thái.
Cài đặt
Bộ công cụ phát triển Python
Lưu ý Chúng tôi đã cập nhật Python SDK để hỗ trợ API Trợ lý, vì vậy bạn cần cập nhật lên phiên bản mới nhất (
1.2.3tại thời điểm viết bài).
!pip install --upgrade openaiVà đảm bảo rằng nó được cập nhật bằng cách chạy:
!pip show openai | grep VersionPhiên bản: 1.2.3Trợ lý in ấn đẹp
import json
def show_json(obj): display(json.loads(obj.model_dump_json()))Ví dụ đầy đủ với API Trợ lý
Trợ lý
Cách dễ nhất để bắt đầu sử dụng API Trợ lý là thông qua Sân chơi Trợ lý .
.png)
Chúng ta hãy bắt đầu bằng cách tạo một trợ lý! Chúng ta sẽ tạo một Gia sư Toán giống như trong tài liệu của chúng tôi .

Bạn có thể xem Trợ lý bạn đã tạo trong Bảng điều khiển Trợ lý .

Bạn cũng có thể tạo Trợ lý trực tiếp thông qua API Trợ lý như sau:
from openai import OpenAI
import os
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", ""))
assistant = client.beta.assistants.create( name="Math Tutor", instructions="You are a personal math tutor. Answer questions briefly, in a sentence or less.", model="gpt-4-1106-preview",
)
show_json(assistant){'id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'created_at': 1699828331, 'description': None, 'file_ids': [], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời các câu hỏi ngắn gọn, trong một câu hoặc ít hơn.', 'metadata': {}, 'model': 'gpt-4-1106-preview', 'name': 'Gia sư toán', 'object': 'assistant', 'tools': []}Bất kể bạn tạo Trợ lý của mình thông qua Bảng điều khiển hay bằng API, bạn sẽ muốn theo dõi ID Trợ lý. Đây là cách bạn sẽ tham chiếu đến Trợ lý của mình trong suốt Threads and Runs.
Tiếp theo, chúng ta sẽ tạo một Luồng mới và thêm Tin nhắn vào đó. Luồng này sẽ giữ trạng thái cuộc trò chuyện của chúng ta, vì vậy chúng ta không phải gửi lại toàn bộ lịch sử tin nhắn mỗi lần.
Chủ đề
Tạo chủ đề mới:
thread = client.beta.threads.create()
show_json(thread){'id': 'thread_bw42vPoQtYBMQE84WubNcJXG', 'created_at': 1699828331, 'siêu dữ liệu': {}, 'đối tượng': 'thread'}Sau đó thêm Tin nhắn vào chuỗi:
message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="I need to solve the equation `3x + 11 = 14`. Can you help me?",
)
show_json(message){'id': 'msg_IBiZDAWHhWPewxzN0EfTYNew', 'assistant_id': Không có, 'content': [{'text': {'annotations': [], 'value': 'Tôi cần giải phương trình `3x + 11 = 14`. Bạn có thể giúp tôi không?'}, 'type': 'text'}], 'created_at': 1699828332, 'file_ids': [], 'metadata': {}, 'object': 'thread.message', 'role': 'user', 'run_id': Không có, 'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'}Lưu ý: Mặc dù bạn không còn gửi toàn bộ lịch sử mỗi lần nữa, bạn vẫn sẽ bị tính phí cho các mã thông báo của toàn bộ lịch sử cuộc trò chuyện với mỗi lần Chạy.
Chạy
Lưu ý rằng Thread chúng ta tạo ra không liên kết với Assistant chúng ta tạo ra trước đó! Thread tồn tại độc lập với Assistant, có thể khác với những gì bạn mong đợi nếu bạn đã sử dụng ChatGPT (trong đó thread được liên kết với một mô hình/GPT).
Để có được sự hoàn thành từ Trợ lý cho một Luồng nhất định, chúng ta phải tạo một Chạy. Việc tạo một Chạy sẽ chỉ ra cho Trợ lý rằng nó phải xem các tin nhắn trong Luồng và thực hiện hành động: bằng cách thêm một phản hồi duy nhất hoặc sử dụng các công cụ.
Lưu ý Runs là sự khác biệt chính giữa API Assistants và API Chat Completions. Trong khi ở Chat Completions, mô hình sẽ chỉ phản hồi bằng một tin nhắn duy nhất, thì ở API Assistants, Run có thể khiến Assistant sử dụng một hoặc nhiều công cụ và có khả năng thêm nhiều tin nhắn vào Thread.
Để Trợ lý của chúng ta phản hồi với người dùng, hãy tạo Run. Như đã đề cập trước đó, bạn phải chỉ định cả Trợ lý và Luồng.c
run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id,
)
show_json(run){'id': 'run_LA08RjouV3RemQ78UZXuyzv6', 'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'cancelled_at': Không có, 'completed_at': Không có, 'created_at': 1699828332, 'expires_at': 1699828932, 'failed_at': Không có, 'file_ids': [], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời câu hỏi một cách ngắn gọn, trong một câu hoặc ít hơn.', 'last_error': Không có, 'metadata': {}, 'model': 'gpt-4-1106-preview', 'object': 'thread.run', 'required_action': Không có, 'started_at': Không có, 'status': 'queued', 'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG', 'tools': []}Không giống như việc tạo hoàn thành trong API Hoàn thành trò chuyện, việc tạo Chạy là một hoạt động không đồng bộ . Nó sẽ trả về ngay lập tức với siêu dữ liệu của Chạy, bao gồm a statusban đầu sẽ được đặt thành queued. Sẽ statusđược cập nhật khi Trợ lý thực hiện các hoạt động (như sử dụng công cụ và thêm tin nhắn).
Để biết khi nào Trợ lý hoàn tất quá trình xử lý, chúng ta có thể thăm dò Run trong một vòng lặp. (Hỗ trợ phát trực tuyến sẽ sớm ra mắt!) Trong khi ở đây chúng ta chỉ kiểm tra trạng thái queuedhoặc in_progress, trên thực tế, Run có thể trải qua nhiều thay đổi trạng thái khác nhau mà bạn có thể chọn để hiển thị cho người dùng. (Những thay đổi này được gọi là Bước và sẽ được đề cập sau.)
import time
def wait_on_run(run, thread): while run.status == "queued" or run.status == "in_progress": run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id, ) time.sleep(0.5) return runrun = wait_on_run(run, thread)
show_json(run){'id': 'run_LA08RjouV3RemQ78UZXuyzv6', 'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'cancelled_at': Không có, 'completed_at': 1699828333, 'created_at': 1699828332, 'expires_at': Không có, 'failed_at': Không có, 'file_ids': [], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời câu hỏi một cách ngắn gọn, trong một câu hoặc ít hơn.', 'last_error': Không có, 'metadata': {}, 'model': 'gpt-4-1106-preview', 'object': 'thread.run', 'required_action': Không có, 'started_at': 1699828332, 'status': 'completed', 'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG', 'tools': []}Tin nhắn
Bây giờ khi Chạy đã hoàn tất, chúng ta có thể liệt kê các Tin nhắn trong Chuỗi để xem Trợ lý đã thêm những gì.
messages = client.beta.threads.messages.list(thread_id=thread.id)
show_json(messages){'dữ liệu': [{'id': 'msg_S0ZtKIWjyWtbIW9JNUocPdUS', 'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'nội dung': [{'văn bản': {'chú thích': [], 'giá trị': 'Có. Trừ 11 ở cả hai vế để có `3x = 3`, sau đó chia cho 3 để tìm `x = 1`.'}, 'type': 'text'}], 'created_at': 1699828333, 'file_ids': [], 'metadata': {}, 'object': 'thread.message', 'role': 'assistant', 'run_id': 'run_LA08RjouV3RemQ78UZXuyzv6', 'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'}, {'id': 'msg_IBiZDAWHhWPewxzN0EfTYNew', 'assistant_id': None, 'content': [{'text': {'annotations': [], 'value': 'Tôi cần giải phương trình `3x + 11 = 14`. Bạn có thể giúp tôi không?'}, 'type': 'text'}], 'created_at': 1699828332, 'file_ids': [], 'metadata': {}, 'object': 'thread.message', 'role': 'user', 'run_id': Không có, 'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'}], 'object': 'list', 'first_id': 'msg_S0ZtKIWjyWtbIW9JNUocPdUS', 'last_id': 'msg_IBiZDAWHhWPewxzN0EfTYNew', 'has_more': False}Như bạn có thể thấy, Tin nhắn được sắp xếp theo thứ tự thời gian ngược lại – điều này được thực hiện để các kết quả gần đây nhất luôn ở đầu tiên page (vì kết quả có thể được phân trang). Hãy chú ý đến điều này, vì đây là thứ tự ngược lại với tin nhắn trong API Hoàn thành trò chuyện.
Hãy yêu cầu Trợ lý của chúng tôi giải thích kết quả rõ hơn một chút nhé!
# Create a message to append to our thread
message = client.beta.threads.messages.create( thread_id=thread.id, role="user", content="Could you explain this to me?"
)
# Execute our run
run = client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant.id,
)
# Wait for completion
wait_on_run(run, thread)
# Retrieve all the messages added after our last user message
messages = client.beta.threads.messages.list( thread_id=thread.id, order="asc", after=message.id
)
show_json(messages){'data': [{'id': 'msg_9MAeOrGriHcImeQnAzvYyJbs', 'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'content': [{'text': {'annotations': [], 'value': 'Chắc chắn rồi. Để giải phương trình `3x + 11 = 14`:\n\n1. Trừ 11 vào cả hai vế: `3x + 11 - 11 = 14 - 11` được rút gọn thành `3x = 3`.\n2. Chia cả hai vế cho 3: `3x / 3 = 3 / 3` được rút gọn thành `x = 1`.\n\nVậy, nghiệm là `x = 1`.'}, 'type': 'text'}], 'created_at': 1699828335, 'file_ids': [], 'metadata': {}, 'object': 'thread.message', 'role': 'assistant', 'run_id': 'run_IFHfsubkJv7RSUbDZpNVs4PG', 'thread_id': 'thread_bw42vPoQtYBMQE84WubNcJXG'}], 'object': 'list', 'first_id': 'msg_9MAeOrGriHcImeQnAzvYyJbs', 'last_id': 'msg_9MAeOrGriHcImeQnAzvYyJbs', 'has_more': Sai}Điều này có vẻ như là rất nhiều bước để nhận được phản hồi, đặc biệt là đối với ví dụ đơn giản này. Tuy nhiên, bạn sẽ sớm thấy cách chúng ta có thể thêm chức năng rất mạnh mẽ vào Trợ lý của mình mà không cần thay đổi nhiều mã!
Ví dụ
Hãy cùng xem cách chúng ta có thể kết hợp tất cả những điều này lại với nhau. Dưới đây là tất cả mã bạn cần để sử dụng Trợ lý bạn đã tạo.
Vì chúng ta đã tạo Trợ lý Toán học, tôi đã lưu ID của nó trong MATH_ASSISTANT_ID. Sau đó, tôi đã định nghĩa hai hàm:
submit_message: tạo một Tin nhắn trên một Luồng, sau đó bắt đầu (và trả về) một Chạy mớiget_response: trả về danh sách các tin nhắn trong một chủ đề
from openai import OpenAI
MATH_ASSISTANT_ID = assistant.id # or a hard-coded ID like "asst-..."
client = OpenAI(api_key=os.environ.get("OPENAI_API_KEY", ""))
def submit_message(assistant_id, thread, user_message): client.beta.threads.messages.create( thread_id=thread.id, role="user", content=user_message ) return client.beta.threads.runs.create( thread_id=thread.id, assistant_id=assistant_id, )
def get_response(thread): return client.beta.threads.messages.list(thread_id=thread.id, order="asc")Tôi cũng đã định nghĩa một create_thread_and_runhàm mà tôi có thể sử dụng lại (thực tế gần giống với client.beta.threads.create_and_runhàm hợp chất trong API của chúng tôi ;) ). Cuối cùng, chúng ta có thể gửi từng yêu cầu người dùng giả định của mình tới một Luồng mới.
Lưu ý rằng tất cả các lệnh gọi API này đều là các hoạt động không đồng bộ; điều này có nghĩa là chúng ta thực sự có được hành vi không đồng bộ trong mã của mình mà không cần sử dụng thư viện không đồng bộ! (ví dụ asyncio)
def create_thread_and_run(user_input): thread = client.beta.threads.create() run = submit_message(MATH_ASSISTANT_ID, thread, user_input) return thread, run
# Emulating concurrent user requests
thread1, run1 = create_thread_and_run( "I need to solve the equation `3x + 11 = 14`. Can you help me?"
)
thread2, run2 = create_thread_and_run("Could you explain linear algebra to me?")
thread3, run3 = create_thread_and_run("I don't like math. What can I do?")
# Now all Runs are executing...Khi tất cả các lượt chạy đã diễn ra, chúng ta có thể đợi từng lượt và nhận phản hồi.
import time
# Pretty printing helper
def pretty_print(messages): print("# Messages") for m in messages: print(f"{m.role}: {m.content[0].text.value}") print()
# Waiting in a loop
def wait_on_run(run, thread): while run.status == "queued" or run.status == "in_progress": run = client.beta.threads.runs.retrieve( thread_id=thread.id, run_id=run.id, ) time.sleep(0.5) return run
# Wait for Run 1
run1 = wait_on_run(run1, thread1)
pretty_print(get_response(thread1))
# Wait for Run 2
run2 = wait_on_run(run2, thread2)
pretty_print(get_response(thread2))
# Wait for Run 3
run3 = wait_on_run(run3, thread3)
pretty_print(get_response(thread3))
# Thank our assistant on Thread 3 :)
run4 = submit_message(MATH_ASSISTANT_ID, thread3, "Thank you!")
run4 = wait_on_run(run4, thread3)
pretty_print(get_response(thread3))# Tin nhắn người dùng: Tôi cần giải phương trình `3x + 11 = 14`. Bạn có thể giúp tôi không? trợ lý: Được, trừ 11 ở cả hai vế để có `3x = 3`, sau đó chia cả hai vế cho 3 để tìm `x = 1`.
# Tin nhắn người dùng: Bạn có thể giải thích đại số tuyến tính cho tôi không? trợ lý: Đại số tuyến tính là nhánh toán học xử lý không gian vectơ, phương trình tuyến tính và ma trận, tập trung vào các tính chất và phép toán có thể áp dụng cho vectơ và phép biến đổi tuyến tính.
# Tin nhắn người dùng: Tôi không thích toán. Tôi có thể làm gì? trợ lý: Hãy thử tìm các khía cạnh của toán học liên quan đến sở thích hoặc cuộc sống hàng ngày của bạn và cân nhắc đến việc tìm gia sư hoặc các nguồn tài nguyên tương tác để việc học trở nên thú vị hơn.
# Tin nhắn người dùng: Tôi không thích toán. Tôi có thể làm gì? trợ lý: Hãy thử tìm các khía cạnh của toán học liên quan đến sở thích hoặc cuộc sống hàng ngày của bạn và cân nhắc đến việc tìm gia sư hoặc các nguồn tài nguyên tương tác để việc học trở nên thú vị hơn. người dùng: Cảm ơn bạn! trợ lý: Không có gì! Nếu bạn còn thắc mắc nào nữa, hãy thoải mái hỏi.Và thế là xong!
Bạn có thể nhận thấy rằng mã này thực sự không dành riêng cho Trợ lý toán học của chúng tôi... mã này sẽ hoạt động với bất kỳ Trợ lý mới nào bạn tạo chỉ bằng cách thay đổi ID Trợ lý! Đó là sức mạnh của API Trợ lý.
Công cụ
Một tính năng chính của API Trợ lý là khả năng trang bị cho Trợ lý của chúng tôi các Công cụ, như Trình thông dịch mã, Truy xuất và Chức năng tùy chỉnh. Hãy cùng xem xét từng tính năng.
Trình biên dịch mã
Hãy trang bị cho Gia sư Toán của chúng ta công cụ Code Interpreter , công cụ mà chúng ta có thể sử dụng từ Bảng điều khiển...

...hoặc API, sử dụng ID Trợ lý.
assistant = client.beta.assistants.update( MATH_ASSISTANT_ID, tools=[{"type": "code_interpreter"}],
)
show_json(assistant){'id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'created_at': 1699828331, 'description': None, 'file_ids': [], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời các câu hỏi một cách ngắn gọn, trong một câu hoặc ít hơn.', 'metadata': {}, 'model': 'gpt-4-1106-preview', 'name': 'Gia sư toán', 'object': 'assistant', 'tools': [{'type': 'code_interpreter'}]}Bây giờ, hãy yêu cầu Trợ lý sử dụng công cụ mới.
thread, run = create_thread_and_run( "Generate the first 20 fibbonaci numbers with code."
)
run = wait_on_run(run, thread)
pretty_print(get_response(thread))# Tin nhắn người dùng: Tạo 20 số Fibonacci đầu tiên bằng mã. Trợ lý: 20 số Fibonacci đầu tiên là: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584 và 4181.Và thế là xong! Trợ lý đã sử dụng Code Interpreter ở chế độ nền và đưa ra cho chúng tôi phản hồi cuối cùng.
Đối với một số trường hợp sử dụng, điều này có thể đủ - tuy nhiên, nếu chúng ta muốn biết thêm chi tiết về những gì Trợ lý đang thực hiện, chúng ta có thể xem các Bước chạy.
Các bước
Một Run bao gồm một hoặc nhiều Step. Giống như một Run, mỗi Step có một statuscái mà bạn có thể truy vấn. Điều này hữu ích để hiển thị tiến trình của một Step cho người dùng (ví dụ như một spinner trong khi Assistant đang viết code hoặc thực hiện truy xuất).
run_steps = client.beta.threads.runs.steps.list( thread_id=thread.id, run_id=run.id, order="asc"
)Chúng ta hãy xem xét từng bước step_details.
for step in run_steps.data: step_details = step.step_details print(json.dumps(show_json(step_details), indent=4)){'tool_calls': [{'id': 'call_WMNqd63PtX8vZzTwaA6eWpBg', 'code_interpreter': {'input': '# Hàm Python để tạo 20 số Fibonacci đầu tiên\ndef fibonacci(n):\n fib_sequence = [0, 1]\n while len(fib_sequence) < n:\n fib_sequence.append(fib_sequence[-1] + fib_sequence[-2])\n return fib_sequence\n\n# Tạo 20 số Fibonacci đầu tiên\nfirst_20_fibonacci = fibonacci(20)\nfirst_20_fibonacci', 'outputs': [{'logs': '[0,\n 1,\n 1,\n 2,\n 3,\n 5,\n 8,\n 13,\n 21,\n 34,\n 55,\n 89,\n 144,\n 233,\n 377,\n 610,\n 987,\n 1597,\n 2584,\n 4181]', 'loại': 'nhật ký'}]}, 'loại': 'code_interpreter'}], 'loại': 'tool_calls'}vô giá trị{'message_creation': {'message_id': 'msg_z593lE5bvcD6BngeDFHDxzwm'}, 'loại': 'message_creation'}vô giá trịChúng ta có thể thấy step_detailshai bước sau:
tool_calls(số nhiều, vì có thể có nhiều hơn một trong một Bước)message_creation
Bước đầu tiên là a tool_calls, cụ thể là sử dụng the code_interpretercó chứa:
input, đó là mã Python được tạo ra trước khi công cụ được gọi vàoutput, là kết quả của việc chạy Trình thông dịch mã.
Bước thứ hai là a message_creation, chứa nội messagedung được thêm vào Luồng để truyền đạt kết quả cho người dùng.
Lấy lại
Một công cụ mạnh mẽ khác trong API Trợ lý là Retrieval : khả năng tải lên các tệp mà Trợ lý sẽ sử dụng làm cơ sở kiến thức khi trả lời các câu hỏi. Tính năng này cũng có thể được bật từ Bảng điều khiển hoặc API, nơi chúng ta có thể tải lên các tệp mà chúng ta muốn sử dụng.

# Upload the file
file = client.files.create( file=open( "data/language_models_are_unsupervised_multitask_learners.pdf", "rb", ), purpose="assistants",
)
# Update Assistant
assistant = client.beta.assistants.update( MATH_ASSISTANT_ID, tools=[{"type": "code_interpreter"}, {"type": "retrieval"}], file_ids=[file.id],
)
show_json(assistant){'id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'created_at': 1699828331, 'description': None, 'file_ids': ['file-MdXcQI8OdPp76wukWI4dpLwW'], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời các câu hỏi ngắn gọn, trong một câu hoặc ít hơn.', 'metadata': {}, 'model': 'gpt-4-1106-preview', 'name': 'Gia sư toán', 'object': 'assistant', 'tools': [{'type': 'code_interpreter'}, {'type': 'retrieval'}]}thread, run = create_thread_and_run( "What are some cool math concepts behind this ML paper pdf? Explain in two sentences."
)
run = wait_on_run(run, thread)
pretty_print(get_response(thread))# Tin nhắn người dùng: Một số khái niệm toán học thú vị đằng sau bài báo ML pdf này là gì? Giải thích trong hai câu. trợ lý: Tôi không thể tìm thấy các phần cụ thể đề cập đến "các khái niệm toán học thú vị" trực tiếp trong bài báo bằng các công cụ có sẵn. Bây giờ tôi sẽ đọc phần đầu của bài báo để xác định bất kỳ khái niệm toán học nào là cơ bản đối với bài báo. trợ lý: Bài báo thảo luận về việc tận dụng các mô hình ngôn ngữ lớn như một khuôn khổ cho việc học đa nhiệm không giám sát, trong đó các nhiệm vụ được xác định ngầm theo ngữ cảnh trong các chuỗi văn bản. Bài báo khám phá khả năng học không cần thực hiện của các mô hình như vậy bằng cách chỉ ra rằng khi một mô hình ngôn ngữ được đào tạo trên một tập dữ liệu lớn, nó bắt đầu khái quát hóa và thực hiện các nhiệm vụ mà không cần giám sát rõ ràng, đạt được kết quả cạnh tranh trên nhiều tác vụ xử lý ngôn ngữ tự nhiên khác nhau bằng cách sử dụng một khuôn khổ xác suất dựa trên mô hình tuần tự và xác suất có điều kiện.Lưu ý: Có nhiều điều phức tạp hơn trong Retrieval, như Chú thích , có thể được đề cập trong một cuốn sách dạy nấu ăn khác.
Chức năng
Là một công cụ mạnh mẽ cuối cùng cho Trợ lý của bạn, bạn có thể chỉ định các Chức năng tùy chỉnh (giống như Gọi chức năng trong API Hoàn thành trò chuyện). Trong khi Chạy, Trợ lý sau đó có thể chỉ ra rằng nó muốn gọi một hoặc nhiều chức năng mà bạn đã chỉ định. Sau đó, bạn chịu trách nhiệm gọi Chức năng và cung cấp đầu ra trở lại cho Trợ lý.
Chúng ta hãy cùng xem ví dụ định nghĩa một display_quiz()Hàm cho Gia sư Toán của chúng ta.
Hàm này sẽ lấy một mảng gồm a titlevà một mảng gồm questions, hiển thị bài kiểm tra và nhận thông tin đầu vào từ người dùng cho từng mảng:
titlequestionsquestion_textquestion_type: [MULTIPLE_CHOICE,FREE_RESPONSE]choices: ["lựa chọn 1", "lựa chọn 2", ...]
Thật không may là tôi không biết cách lấy dữ liệu đầu vào của người dùng trong Python Notebook, vì vậy tôi sẽ mô phỏng các phản hồi bằng get_mock_response.... Đây là nơi bạn sẽ lấy dữ liệu đầu vào thực tế của người dùng.
def get_mock_response_from_user_multiple_choice(): return "a"
def get_mock_response_from_user_free_response(): return "I don't know."
def display_quiz(title, questions): print("Quiz:", title) print() responses = [] for q in questions: print(q["question_text"]) response = "" # If multiple choice, print options if q["question_type"] == "MULTIPLE_CHOICE": for i, choice in enumerate(q["choices"]): print(f"{i}. {choice}") response = get_mock_response_from_user_multiple_choice() # Otherwise, just get response elif q["question_type"] == "FREE_RESPONSE": response = get_mock_response_from_user_free_response() responses.append(response) print() return responsesSau đây là mẫu câu đố sẽ như thế nào:
responses = display_quiz( "Sample Quiz", [ {"question_text": "What is your name?", "question_type": "FREE_RESPONSE"}, { "question_text": "What is your favorite color?", "question_type": "MULTIPLE_CHOICE", "choices": ["Red", "Blue", "Green", "Yellow"], }, ],
)
print("Responses:", responses)Trắc nghiệm: Trắc nghiệm mẫu
Tên bạn là gì?
Màu sắc yêu thích của bạn là gì? 0. Đỏ 1. Xanh lam 2. Xanh lục 3. Vàng
Trả lời: ["Tôi không biết.", 'a']Bây giờ, hãy định nghĩa giao diện của hàm này theo định dạng JSON để Trợ lý của chúng ta có thể gọi nó:
function_json = { "name": "display_quiz", "description": "Displays a quiz to the student, and returns the student's response. A single quiz can have multiple questions.", "parameters": { "type": "object", "properties": { "title": {"type": "string"}, "questions": { "type": "array", "description": "An array of questions, each with a title and potentially options (if multiple choice).", "items": { "type": "object", "properties": { "question_text": {"type": "string"}, "question_type": { "type": "string", "enum": ["MULTIPLE_CHOICE", "FREE_RESPONSE"], }, "choices": {"type": "array", "items": {"type": "string"}}, }, "required": ["question_text"], }, }, }, "required": ["title", "questions"], },
}Một lần nữa, hãy cập nhật Trợ lý của chúng ta thông qua Bảng điều khiển hoặc API.

Lưu ý: Việc dán hàm JSON vào Dashboard hơi khó khăn do thụt lề, v.v. Tôi chỉ yêu cầu ChatGPT định dạng hàm của tôi giống như một trong các ví dụ trên Dashboard :).
assistant = client.beta.assistants.update( MATH_ASSISTANT_ID, tools=[ {"type": "code_interpreter"}, {"type": "retrieval"}, {"type": "function", "function": function_json}, ],
)
show_json(assistant){'id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'created_at': 1699828331, 'description': Không có, 'file_ids': ['file-MdXcQI8OdPp76wukWI4dpLwW'], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời các câu hỏi một cách ngắn gọn, trong một câu hoặc ít hơn.', 'metadata': {}, 'model': 'gpt-4-1106-preview', 'name': 'Gia sư toán', 'object': 'assistant', 'tools': [{'type': 'code_interpreter'}, {'type': 'retrieval'}, {'function': {'name': 'display_quiz', 'parameters': {'type': 'object', 'properties': {'title': {'type': 'string'}, 'questions': {'type': 'array', 'description': 'Một mảng các câu hỏi, mỗi câu hỏi có tiêu đề và các tùy chọn có thể có (nếu có nhiều lựa chọn).', 'items': {'type': 'object', 'properties': {'question_text': {'type': 'string'}, 'question_type': {'type': 'string', 'enum': ['MULTIPLE_CHOICE', 'FREE_RESPONSE']}, 'choices': {'type': 'array', 'items': {'type': 'string'}}}, 'required': ['question_text']}}}, 'required': ['title', 'questions']}, 'description': "Hiển thị một bài kiểm tra cho học sinh và trả về câu trả lời của học sinh. Một bài kiểm tra có thể có nhiều câu hỏi."}, 'type': 'function'}]}Và bây giờ, chúng tôi xin giới thiệu một bài trắc nghiệm.
thread, run = create_thread_and_run( "Make a quiz with 2 questions: One open ended, one multiple choice. Then, give me feedback for the responses."
)
run = wait_on_run(run, thread)
run.status'yêu cầu hành động'Tuy nhiên, bây giờ khi chúng ta kiểm tra Run, statuschúng ta thấy requires_action! Hãy xem xét kỹ hơn.
show_json(run){'id': 'run_98PGE3qGtHoaWaCLoytyRUBf', 'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'cancelled_at': Không có, 'completed_at': Không có, 'created_at': 1699828370, 'expires_at': 1699828970, 'failed_at': Không có, 'file_ids': ['file-MdXcQI8OdPp76wukWI4dpLwW'], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời các câu hỏi một cách ngắn gọn, trong một câu hoặc ít hơn.', 'last_error': Không có, 'metadata': {}, 'model': 'gpt-4-1106-preview', 'object': 'thread.run', 'required_action': {'submit_tool_outputs': {'tool_calls': [{'id': 'call_Zf650sWT1wW4Uwbf5YeDS0VG', 'function': {'arguments': '{\n "title": "Bài kiểm tra toán học",\n "questions": [\n {\n "question_text": "Giải thích tại sao căn bậc hai của một số âm không phải là một số thực.",\n "question_type": "FREE_RESPONSE"\n },\n {\n "question_text": "Giá trị của một góc trong ngũ giác đều là bao nhiêu?",\n "choices": [\n "72 độ",\n "90 độ",\n "108 độ",\n "120 độ"\n ],\n "question_type": "MULTIPLE_CHOICE"\n }\n ]\n}', 'name': 'display_quiz'}, 'type': 'function'}]}, 'type': 'submit_tool_outputs'}, 'started_at': 1699828370, 'status': 'requires_action', 'thread_id': 'thread_bICTESFvWoRdj0O0SzsosLCS', 'tools': [{'type': 'code_interpreter'}, {'type': 'retrieval'}, {'function': {'name': 'display_quiz', 'parameters': {'type': 'object', 'properties': {'title': {'type': 'string'}, 'questions': {'type': 'array', 'description': 'Một mảng các câu hỏi, mỗi câu hỏi có tiêu đề và các tùy chọn có thể có (nếu có nhiều lựa chọn).', 'items': {'type': 'object', 'properties': {'question_text': {'type': 'string'}, 'question_type': {'type': 'string', 'enum': ['MULTIPLE_CHOICE', 'FREE_RESPONSE']}, 'choices': {'type': 'array', 'items': {'type':
'string'}}}, 'required': ['question_text']}}}, 'required': ['title', 'questions']}, 'description': "Hiển thị một bài kiểm tra cho học sinh và trả về câu trả lời của học sinh. Một bài kiểm tra có thể có nhiều câu hỏi."}, 'type': 'function'}]}Trường này required_actioncho biết một Công cụ đang chờ chúng ta chạy nó và gửi đầu ra của nó trở lại Trợ lý. Cụ thể là hàm display_quiz! Chúng ta hãy bắt đầu bằng cách phân tích cú pháp namevà arguments.
Lưu ý Trong trường hợp này, chúng ta biết chỉ có một lệnh gọi Công cụ, nhưng trên thực tế, Trợ lý có thể chọn gọi nhiều công cụ.
# Extract single tool call
tool_call = run.required_action.submit_tool_outputs.tool_calls[0]
name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
print("Function Name:", name)
print("Function Arguments:")
argumentsTên hàm: display_quiz Tham số hàm:{'title': 'Bài kiểm tra toán', 'questions': [{'question_text': 'Giải thích tại sao căn bậc hai của một số âm không phải là một số thực.', 'question_type': 'FREE_RESPONSE'}, {'question_text': 'Giá trị của một góc trong một ngũ giác đều là bao nhiêu?', 'choices': ['72 độ', '90 độ', '108 độ', '120 độ'], 'question_type': 'MULTIPLE_CHOICE'}]}Bây giờ chúng ta hãy gọi display_quizhàm của mình bằng các đối số do Trợ lý cung cấp:
responses = display_quiz(arguments["title"], arguments["questions"])
print("Responses:", responses)Trắc nghiệm: Trắc nghiệm Toán học
Giải thích tại sao căn bậc hai của một số âm không phải là một số thực.
Giá trị của một góc trong một ngũ giác đều là bao nhiêu? 0,72 độ 1,90 độ 2,108 độ 3,120 độ
Trả lời: ["Tôi không biết.", 'a']Tuyệt! (Hãy nhớ rằng đây là những phản hồi mà chúng ta đã chế giễu trước đó. Trên thực tế, chúng ta sẽ nhận được dữ liệu đầu vào từ lệnh gọi hàm này.)
Bây giờ chúng ta đã có phản hồi, hãy gửi lại cho Trợ lý. Chúng ta sẽ cần ID tool_call, được tìm thấy trong phần tool_callchúng ta đã phân tích trước đó. Chúng ta cũng cần mã hóa listphản hồi của mình thành str.
run = client.beta.threads.runs.submit_tool_outputs( thread_id=thread.id, run_id=run.id, tool_outputs=[ { "tool_call_id": tool_call.id, "output": json.dumps(responses), } ],
)
show_json(run){'id': 'run_98PGE3qGtHoaWaCLoytyRUBf', 'assistant_id': 'asst_9HAjl9y41ufsViNcThW1EXUS', 'cancelled_at': Không có, 'completed_at': Không có, 'created_at': 1699828370, 'expires_at': 1699828970, 'failed_at': Không có, 'file_ids': ['file-MdXcQI8OdPp76wukWI4dpLwW'], 'instructions': 'Bạn là gia sư toán cá nhân. Trả lời các câu hỏi một cách ngắn gọn, trong một câu hoặc ít hơn.', 'last_error': Không có, 'metadata': {}, 'model': 'gpt-4-1106-preview', 'object': 'thread.run', 'required_action': Không có, 'started_at': 1699828370, 'status': 'queued', 'thread_id': 'thread_bICTESFvWoRdj0O0SzsosLCS', 'tools': [{'type': 'code_interpreter'}, {'type': 'retrieval'}, {'function': {'name': 'display_quiz', 'parameters': {'type': 'object', 'properties': {'title': {'type': 'string'}, 'questions': {'type': 'array', 'description': 'Một mảng các câu hỏi, mỗi câu hỏi có tiêu đề và có khả năng là các tùy chọn (nếu có nhiều lựa chọn).', 'items': {'type': 'object', 'properties': {'question_text': {'type': 'string'}, 'question_type': {'type': 'string', 'enum': ['MULTIPLE_CHOICE', 'FREE_RESPONSE']}, 'choices': {'type': 'array', 'items': {'type': 'string'}}}, 'required': ['question_text']}}}, 'required': ['title', 'questions']}, 'description': "Hiển thị bài kiểm tra cho học sinh và trả về câu trả lời của học sinh. Một bài kiểm tra có thể có nhiều câu hỏi."}, 'type': 'function'}]}Bây giờ chúng ta có thể đợi Run hoàn tất một lần nữa và kiểm tra Thread của mình!
run = wait_on_run(run, thread)
pretty_print(get_response(thread))# Tin nhắn người dùng: Tạo một bài kiểm tra với 2 câu hỏi: Một câu hỏi mở, một câu hỏi trắc nghiệm. Sau đó, hãy cho tôi phản hồi về các câu trả lời. trợ lý: Cảm ơn bạn đã làm bài kiểm tra.
Đối với câu hỏi đầu tiên, điều quan trọng là phải biết rằng căn bậc hai của một số âm không phải là một số thực vì các số thực bao gồm tất cả các số trên trục số và bao gồm tất cả các số dương, số không và số âm. Tuy nhiên, căn bậc hai của một số âm không nằm trên trục số này; thay vào đó, nó là thứ mà chúng ta gọi là số ảo. Khi chúng ta muốn lấy căn bậc hai của một số âm, chúng ta thường sử dụng đơn vị ảo \(i\), trong đó \(i\) được định nghĩa là \(\sqrt{-1}\).
Đối với câu hỏi thứ hai, câu trả lời đúng là "108 độ." Trong một ngũ giác đều, là một đa giác năm cạnh có các cạnh và góc bằng nhau, mỗi góc trong bằng \(108\) độ. Điều này là do tổng các góc trong của một ngũ giác là \(540\) độ, và khi chia cho \(5\) (số góc), nó sẽ cho \(108\) độ cho mỗi góc. Lựa chọn bạn đã chọn, "72 độ," thực ra đề cập đến góc ngoài của một ngũ giác đều, không phải góc trong.Tuyệt vời ????
Phần kết luận
Chúng tôi đã đề cập đến nhiều vấn đề trong sổ tay này, hãy tự khen ngợi bản thân! Hy vọng rằng bây giờ bạn đã có nền tảng vững chắc để xây dựng những trải nghiệm mạnh mẽ, có trạng thái với các công cụ như Code Interpreter, Retrieval và Functions!
Có một số phần chúng tôi không đề cập đến vì lý do ngắn gọn, vì vậy, đây là một số tài nguyên để bạn khám phá thêm:
- Chú thích : phân tích trích dẫn tệp
- Tệp : Phạm vi luồng so với Phạm vi trợ lý
- Gọi hàm song song : gọi nhiều công cụ trong một bước duy nhất
- Chạy luồng đa trợ lý: Luồng đơn với tin nhắn từ nhiều trợ lý
- Phát trực tuyến: sắp ra mắt!
Bây giờ hãy bắt đầu và xây dựng một cái gì đó tuyệt vời !
Xem thêm: mua tài khoản Chat GPT Plus chính hãng giá rẻ duy nhất hôm nay

Cách đổi Mật khẩu Chat GPT - Hướng dẫn đổi Pass Chat GPT 100% Thành công
Hướng dẫn Cách đăng nhập Chat GPT Nhanh nhất | Có hỗ trợ Miễn phí qua Teamview-Ultraview
Chat GPT Plus là gì? So sánh Chat GPT Plus với Chat GPT Miễn phí
Chat GPT bị giới hạn giải thích vì sao và cách khắc phục
Chat GPT là gì ? Cách đăng Ký Chat GPT Miễn Phí tại Việt Nam