Nâng cao tiêu chuẩn cho SWE-bench được xác minh với Claude 3.5 Sonnet
Anthropic giới thiệu cách Claude 3.5 Sonnet được sử dụng để xác minh SWE-bench, nâng cao tiêu chuẩn cho việc đánh giá hiệu suất mô hình.
- 18 min read
Nâng cao hiệu suất trên SWE-bench được xác minh với Claude 3.5 Sonnet
Mô hình mới nhất của chúng tôi, phiên bản nâng cấp của Claude 3.5 Sonnet, đã đạt được 49% trên SWE-bench Verified, một bài kiểm tra đánh giá kỹ năng kỹ thuật phần mềm, vượt qua mức 45% của mô hình trước đó. Bài viết này sẽ giải thích về “tác nhân” (agent) mà chúng tôi đã xây dựng xung quanh mô hình, và nhằm mục đích giúp các nhà phát triển khai thác hiệu suất tốt nhất có thể từ Claude 3.5 Sonnet.
SWE-bench là một bộ tiêu chuẩn đánh giá AI, đo lường khả năng của mô hình trong việc hoàn thành các tác vụ kỹ thuật phần mềm thực tế. Cụ thể, nó kiểm tra cách mô hình có thể giải quyết các vấn đề trên GitHub từ các kho lưu trữ Python mã nguồn mở phổ biến. Đối với mỗi tác vụ trong bộ tiêu chuẩn, mô hình AI được cung cấp một môi trường Python và bản sao làm việc cục bộ của kho lưu trữ ngay trước khi vấn đề được giải quyết. Sau đó, mô hình cần hiểu, sửa đổi và kiểm tra mã trước khi gửi giải pháp đề xuất của mình.
Mỗi giải pháp sẽ được chấm điểm dựa trên các bài kiểm tra đơn vị thực tế từ yêu cầu kéo (pull request) đã đóng vấn đề GitHub gốc. Điều này kiểm tra xem mô hình AI có thể đạt được chức năng tương tự như tác giả ban đầu của PR hay không.
SWE-bench không chỉ đánh giá riêng mô hình AI mà còn đánh giá toàn bộ hệ thống “tác nhân”. Trong bối cảnh này, “tác nhân” đề cập đến sự kết hợp giữa mô hình AI và các khung phần mềm xung quanh nó. Khung này chịu trách nhiệm tạo ra các lời nhắc (prompt) cho mô hình, phân tích đầu ra của mô hình để thực hiện hành động và quản lý vòng lặp tương tác, nơi kết quả của hành động trước đó của mô hình được tích hợp vào lời nhắc tiếp theo của nó. Hiệu suất của một tác nhân trên SWE-bench có thể thay đổi đáng kể tùy thuộc vào khung này, ngay cả khi sử dụng cùng một mô hình AI cơ bản.
Có nhiều tiêu chuẩn khác để đánh giá khả năng lập trình của các Mô hình Ngôn ngữ Lớn (LLM), nhưng SWE-bench đã trở nên phổ biến vì một số lý do:
- Nó sử dụng các tác vụ kỹ thuật thực tế từ các dự án thực tế, thay vì các câu hỏi kiểu thi đấu hoặc phỏng vấn.
- Nó vẫn còn nhiều dư địa để cải thiện. Chưa có mô hình nào đạt trên 50% hoàn thành trên SWE-bench Verified (mặc dù Claude 3.5 Sonnet phiên bản cập nhật, tại thời điểm viết bài, đã đạt 49%).
- Nó đo lường toàn bộ “tác nhân”, thay vì chỉ một mô hình riêng lẻ. Các nhà phát triển mã nguồn mở và các công ty khởi nghiệp đã đạt được thành công lớn trong việc tối ưu hóa các khung để cải thiện đáng kể hiệu suất xung quanh cùng một mô hình.
Lưu ý rằng bộ dữ liệu SWE-bench gốc chứa một số tác vụ không thể giải quyết nếu không có thêm ngữ cảnh bên ngoài vấn đề GitHub (ví dụ: về các thông báo lỗi cụ thể cần trả về). SWE-bench-Verified là một tập hợp con gồm 500 vấn đề của SWE-bench đã được con người xem xét để đảm bảo chúng có thể giải quyết được, do đó cung cấp thước đo rõ ràng nhất về hiệu suất của các tác nhân lập trình. Đây là bộ tiêu chuẩn mà chúng ta sẽ tham chiếu trong bài viết này.
Đạt được hiệu suất hàng đầu
Tác nhân sử dụng công cụ
Triết lý thiết kế của chúng tôi khi tạo khung tác nhân được tối ưu hóa cho Claude 3.5 Sonnet phiên bản cập nhật là trao cho mô hình ngôn ngữ càng nhiều quyền kiểm soát càng tốt và giữ cho khung phần mềm càng tối giản càng tốt. Tác nhân có một lời nhắc, một Công cụ Bash để thực thi các lệnh bash và một Công cụ Chỉnh sửa, để xem và chỉnh sửa các tệp và thư mục. Chúng tôi tiếp tục lấy mẫu cho đến khi mô hình quyết định rằng nó đã hoàn thành hoặc vượt quá độ dài ngữ cảnh 200k của nó. Khung này cho phép mô hình sử dụng khả năng phán đoán của riêng nó về cách theo đuổi vấn đề, thay vì bị mã hóa cứng vào một mẫu hoặc quy trình làm việc cụ thể.
Lời nhắc phác thảo một phương pháp tiếp cận được đề xuất cho mô hình, nhưng nó không quá dài hoặc quá chi tiết cho tác vụ này. Mô hình có thể tự do lựa chọn cách di chuyển từ bước này sang bước khác, thay vì phải tuân theo các bước chuyển đổi nghiêm ngặt và riêng biệt. Nếu bạn không nhạy cảm về token, việc khuyến khích rõ ràng mô hình tạo ra phản hồi dài có thể hữu ích.
Đoạn mã sau đây cho thấy lời nhắc từ khung tác nhân của chúng tôi:
plaintext <uploaded_files> {location} </uploaded_files> Tôi đã tải lên một kho lưu trữ mã python trong thư mục {location} (không có trong /tmp/inputs). Hãy xem xét mô tả PR sau:
<pr_description> {pr_description} </pr_description>
Bạn có thể giúp tôi triển khai các thay đổi cần thiết cho kho lưu trữ để đáp ứng các yêu cầu được chỉ định trong <pr_description> không? Tôi đã xử lý tất cả các thay đổi đối với bất kỳ tệp kiểm thử nào được mô tả trong <pr_description>. Điều này có nghĩa là bạn KHÔNG phải sửa đổi logic kiểm thử hoặc bất kỳ bài kiểm thử nào!
Nhiệm vụ của bạn là thực hiện các thay đổi tối thiểu đối với các tệp không phải là tệp kiểm thử trong thư mục {location} để đảm bảo <pr_description> được đáp ứng.
Hãy làm theo các bước sau để giải quyết vấn đề:
- Là bước đầu tiên, có lẽ nên khám phá kho lưu trữ để làm quen với cấu trúc của nó.
- Tạo một tập lệnh để tái hiện lỗi và thực thi nó bằng
python <tên_tập_lệnh.py>bằng BashTool, để xác nhận lỗi. - Chỉnh sửa mã nguồn của kho lưu trữ để giải quyết vấn đề.
- Chạy lại tập lệnh tái hiện của bạn và xác nhận rằng lỗi đã được khắc phục!
- Suy nghĩ về các trường hợp biên và đảm bảo rằng bản sửa lỗi của bạn xử lý chúng.
Suy nghĩ của bạn nên kỹ lưỡng và do đó, không sao nếu nó rất dài.
Lời nhắc của mô hình cho công cụ Bash:
json { “name”: “bash”, “description”: “Run commands in a bash shell\n* When invoking this tool, the contents of the "command" parameter does NOT need to be XML-escaped.\n* You don’t have access to the internet via this tool.\n* You do have access to a mirror of common linux and python packages via apt and pip.\n* State is persistent across command calls and discussions with the user.\n* To inspect a particular line range of a file, e.g. lines 10-25, try ‘sed -n 10,25p /path/to/the/file’.\n* Please avoid commands that may produce a very large amount of output.\n* Please run long lived commands in the background, e.g. ‘sleep 10 &’ or start a server in the background.”, “input_schema”: { “type”: “object”, “properties”: { “command”: { “type”: “string”, “description”: “The bash command to run.” } }, “required”: [“command”] } }
Công cụ Chỉnh sửa (Edit Tool) của mô hình:
json
{
“name”: “str_replace_editor”,
“description”: “Custom editing tool for viewing, creating and editing files\n* State is persistent across command calls and discussions with the user\n* If path is a file, view displays the result of applying cat -n. If path is a directory, view lists non-hidden files and directories up to 2 levels deep\n* The create command cannot be used if the specified path already exists as a file\n* If a command generates a long output, it will be truncated and marked with <response clipped> \n* The undo_edit command will revert the last edit made to the file at path\n\nNotes for using the str_replace command:\n* The old_str parameter should match EXACTLY one or more consecutive lines from the original file. Be mindful of whitespaces!\n* If the old_str parameter is not unique in the file, the replacement will not be performed. Make sure to include enough context in old_str to make it unique\n* The new_str parameter should contain the edited lines that should replace the old_str”,
“input_schema”: {
“type”: “object”,
“properties”: {
“command”: {
“type”: “string”,
“enum”: [“view”, “create”, “str_replace”, “insert”, “undo_edit”],
“description”: “The commands to run. Allowed options are: view, create, str_replace, insert, undo_edit.”
},
“file_text”: {
“description”: “Required parameter of create command, with the content of the file to be created.”,
“type”: “string”
},
“insert_line”: {
“description”: “Required parameter of insert command. The new_str will be inserted AFTER the line insert_line of path.”,
“type”: “integer”
},
“new_str”: {
“description”: “Required parameter of str_replace command containing the new string. Required parameter of insert command containing the string to insert.”,
“type”: “string”
},
“old_str”: {
“description”: “Required parameter of str_replace command containing the string in path to replace.”,
“type”: “string”
},
“path”: {
“description”: “Absolute path to file or directory, e.g. /repo/file.py or /repo.”,
“type”: “string”
},
“view_range”: {
“description”: “Optional parameter of view command when path points to a file. If none is given, the full file is shown. If provided, the file will be shown in the indicated line number range, e.g. [11, 12] will show lines 11 and 12. Indexing at 1 to start. Setting [start_line, -1] shows all lines from start_line to the end of the file.”,
“items”: {
“type”: “integer”
},
“type”: “array”
}
},
“required”: [“command”, “path”]
}
}
Một cách chúng tôi đã cải thiện hiệu suất là “chống lỗi” cho các công cụ của mình. Ví dụ, đôi khi mô hình có thể làm sai các đường dẫn tệp tương đối sau khi tác nhân di chuyển ra khỏi thư mục gốc. Để ngăn chặn điều này, chúng tôi chỉ đơn giản yêu cầu công cụ luôn cung cấp đường dẫn tuyệt đối.
Chúng tôi đã thử nghiệm nhiều chiến lược khác nhau để chỉ định các chỉnh sửa cho các tệp hiện có và có độ tin cậy cao nhất với việc thay thế chuỗi, trong đó mô hình chỉ định old_str để thay thế bằng new_str trong tệp được cung cấp. Việc thay thế sẽ chỉ xảy ra nếu có chính xác một lần khớp old_str. Nếu có nhiều hơn hoặc ít hơn các lần khớp, mô hình sẽ nhận được thông báo lỗi phù hợp để thử lại.
Kết quả
Nhìn chung, Claude 3.5 Sonnet phiên bản cập nhật thể hiện khả năng suy luận, lập trình và toán học cao hơn các mô hình trước đây của chúng tôi và mô hình đạt hiệu suất hàng đầu trước đó. Nó cũng thể hiện khả năng tác nhân được cải thiện: các công cụ và khung phần mềm giúp tận dụng tốt nhất những khả năng được cải thiện đó.
| Model | Claude 3.5 Sonnet (new) | Previous SOTA | Claude 3.5 Sonnet (old) | Claude 3 Opus |
|---|---|---|---|---|
| SWE-bench Verified score | 49% | 45% | 33% | 22% |
Điểm trên SWE-bench Verified cho một số mô hình của chúng tôi, tất cả đều sử dụng khung tác nhân này.
Ví dụ về hành vi của tác nhân
Để chạy bộ tiêu chuẩn, chúng tôi đã sử dụng khung SWE-Agent làm nền tảng cho mã tác nhân của mình. Trong các nhật ký dưới đây, chúng tôi hiển thị đầu ra văn bản của tác nhân, các lệnh gọi công cụ và phản hồi công cụ dưới dạng SUY NGHĨ (THOUGHT), HÀNH ĐỘNG (ACTION) và QUAN SÁT (OBSERVATION), ngay cả khi chúng tôi không giới hạn mô hình theo một thứ tự cố định.
Các khối mã dưới đây sẽ đi qua một trường hợp điển hình của Sonnet 3.5 giải quyết một vấn đề SWE-bench.
Trong khối đầu tiên này, bạn có thể thấy một phần của lời nhắc ban đầu được cung cấp cho mô hình, với {pr_description} được điền bằng giá trị thực từ một tác vụ SWE-bench. Quan trọng là, tác vụ này chứa các bước để tái hiện lỗi, điều này sẽ cung cấp cho mô hình một điểm khởi đầu có giá trị để điều tra.
plaintext <uploaded_files> /repo </uploaded_files> Tôi đã tải lên một kho lưu trữ mã python trong thư mục /repo (không có trong /tmp/inputs). Hãy xem xét mô tả PR sau:
<pr_description> Vấn đề tham số store_cv_values của linear_model.RidgeClassifierCV
Mô tả
Lỗi tham số store_cv_values trên sklearn.linear_model.RidgeClassifierCV
Các bước/Mã để tái hiện
import numpy as np from sklearn import linear_model as lm
cơ sở dữ liệu kiểm thử
n = 100 x = np.random.randn(n, 30) y = np.random.normal(size = n)
rr = lm.RidgeClassifierCV(alphas = np.arange(0.1, 1000, 0.1), normalize = True, store_cv_values = True).fit(x, y)
Kết quả mong đợi
Mong đợi nhận được kết quả mô hình hồi quy ridge thông thường, giữ lại các dự đoán chéo xác thực dưới dạng thuộc tính.
Kết quả thực tế
TypeError: init() got an unexpected keyword argument ‘store_cv_values’
Thực tế là lớp lm.RidgeClassifierCV không có tham số store_cv_values, mặc dù một số thuộc tính phụ thuộc vào nó. </pr_description>
Mô hình phản hồi và trước tiên sử dụng Công cụ Chỉnh sửa để xem cấu trúc kho lưu trữ. Bạn có thể thấy đầu ra văn bản và các đối số lệnh gọi công cụ của mô hình dưới SUY NGHĨ (THOUGHT) và HÀNH ĐỘNG (ACTION), và một phần đầu ra của công cụ dưới QUAN SÁT (OBSERVATION):
plaintext SUY NGHĨ: Tôi sẽ giúp bạn triển khai các thay đổi để đáp ứng mô tả PR. Hãy làm theo các bước bạn đã nêu.
- Đầu tiên, hãy khám phá cấu trúc kho lưu trữ: HÀNH ĐỘNG (str_replace_editor): command: view
path: /repo
QUAN SÁT: Đây là các tệp và thư mục sâu đến 2 cấp trong /repo, loại trừ các mục ẩn: /repo /repo/PULL_REQUEST_TEMPLATE.md /repo/ISSUE_TEMPLATE.md /repo/sklearn /repo/sklearn/decomposition /repo/sklearn/kernel_ridge.py /repo/sklearn/model_selection /repo/sklearn/covariance /repo/sklearn/cluster /repo/sklearn/base.py /repo/sklearn/dummy.py /repo/sklearn/naive_bayes.py …
Bây giờ khi mô hình đã hiểu rõ hơn về cấu trúc kho lưu trữ, nó sử dụng Công cụ Chỉnh sửa để tạo một tập lệnh mới mà nó sẽ sử dụng để tái hiện lỗi và kiểm tra bản sửa lỗi của mình:
plaintext
SUY NGHĨ:
Dựa trên cấu trúc kho lưu trữ, chúng ta sẽ cần sửa đổi Ridge Classifier trong thư mục sklearn/linear_model.
Hãy tạo một tập lệnh để tái hiện lỗi: HÀNH ĐỘNG (str_replace_editor): command: create
path: /repo/reproduce_error.py
file_text: import numpy as np from sklearn import linear_model as lm
cơ sở dữ liệu kiểm thử
n = 100 x = np.random.randn(n, 30) y = np.random.normal(size = n)
rr = lm.RidgeClassifierCV(alphas=np.arange(0.1, 1000, 0.1), normalize=True, store_cv_values=True).fit(x, y)
QUAN SÁT: Tệp đã được tạo thành công tại: /repo/reproduce_error.py
Mô hình sau đó sử dụng Công cụ Bash để thực thi tập lệnh mà nó đã viết và tái hiện thành công lỗi từ tác vụ:
plaintext SUY NGHĨ: Hãy xác minh rằng chúng ta có thể tái hiện lỗi: HÀNH ĐỘNG (bash): command: python3 /repo/reproduce_error.py
QUAN SÁT: Traceback (most recent call last): File “/repo/reproduce_error.py”, line 10, in store_cv_values=True).fit(x, y) TypeError: init() got an unexpected keyword argument ‘store_cv_values’
Từ đây trở đi, mô hình sử dụng Công cụ Chỉnh sửa để thay đổi mã nguồn trong kho lưu trữ và chạy lại tập lệnh của mình để xác minh xem thay đổi đã khắc phục sự cố hay chưa:
plaintext
SUY NGHĨ:
Lỗi có thể tái hiện. Nhìn vào mã, tôi thấy rằng vấn đề là mặc dù lớp RidgeClassifierCV kế thừa từ _BaseRidgeCV, nhưng nó không truyền tham số store_cv_values từ hàm tạo của nó cho hàm tạo lớp cơ sở.
Hãy sửa lỗi này: HÀNH ĐỘNG (str_replace_editor): command: str_replace
path: /repo/sklearn/linear_model/ridge.py
old_str: def init(self, alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, class_weight=None): super(RidgeClassifierCV, self).init( alphas=alphas, fit_intercept=fit_intercept, normalize=normalize, scoring=scoring, cv=cv) self.class_weight = class_weight
new_str: def init(self, alphas=(0.1, 1.0, 10.0), fit_intercept=True, normalize=False, scoring=None, cv=None, class_weight=None, store_cv_values=False): super(RidgeClassifierCV, self).init( alphas=alphas, fit_intercept=fit_intercept, normalize=normalize, scoring=scoring, cv=cv, store_cv_values=store_cv_values) self.class_weight = class_weight
Trong ví dụ cụ thể này, mô hình đã hoạt động trong 12 bước trước khi quyết định rằng nó đã sẵn sàng để gửi. Các bài kiểm tra của tác vụ sau đó đã chạy thành công, xác minh rằng giải pháp của mô hình đã giải quyết vấn đề. Một số tác vụ mất hơn 100 lượt tương tác trước khi mô hình gửi giải pháp của mình; ở những tác vụ khác, mô hình tiếp tục cố gắng cho đến khi hết ngữ cảnh.
Từ việc xem xét các nỗ lực của Claude 3.5 Sonnet phiên bản cập nhật so với các mô hình cũ hơn, Claude 3.5 Sonnet phiên bản cập nhật tự sửa lỗi thường xuyên hơn. Nó cũng thể hiện khả năng thử nhiều giải pháp khác nhau, thay vì bị mắc kẹt với cùng một lỗi lặp đi lặp lại.
Thách thức
SWE-bench Verified là một bài đánh giá mạnh mẽ, nhưng nó cũng phức tạp hơn để chạy so với các bài đánh giá đơn giản, một lượt. Đây là một số thách thức mà chúng tôi gặp phải khi sử dụng nó - những thách thức mà các nhà phát triển AI khác cũng có thể gặp phải.
- Thời gian và chi phí token cao. Các ví dụ trên là từ một trường hợp đã được hoàn thành thành công trong 12 bước. Tuy nhiên, nhiều lần chạy thành công đòi hỏi hàng trăm lượt tương tác để mô hình giải quyết và hơn 100k token. Claude 3.5 Sonnet phiên bản cập nhật rất kiên trì: nó thường có thể tìm ra cách giải quyết vấn đề với đủ thời gian, nhưng điều đó có thể tốn kém.
- Chấm điểm. Khi kiểm tra các tác vụ thất bại, chúng tôi đã phát hiện ra các trường hợp mà mô hình hoạt động đúng, nhưng có các vấn đề về thiết lập môi trường, hoặc các vấn đề với việc áp dụng các bản vá cài đặt hai lần. Việc giải quyết các vấn đề hệ thống này là rất quan trọng để có được cái nhìn chính xác về hiệu suất của tác nhân AI.
- Các bài kiểm tra ẩn. Vì mô hình không thể nhìn thấy các bài kiểm tra mà nó đang được đánh giá, nó thường “nghĩ” rằng nó đã thành công khi tác vụ thực tế là một thất bại. Một số thất bại này là do mô hình giải quyết vấn đề ở mức trừu tượng sai (chỉ khắc phục tạm thời thay vì tái cấu trúc sâu hơn). Các thất bại khác có vẻ ít công bằng hơn: chúng giải quyết vấn đề, nhưng không khớp với các bài kiểm tra đơn vị từ tác vụ gốc.
- Đa phương thức. Mặc dù Claude 3.5 Sonnet phiên bản cập nhật có khả năng thị giác và đa phương thức xuất sắc, chúng tôi đã không triển khai cách để nó xem các tệp được lưu trên hệ thống tệp hoặc được tham chiếu dưới dạng URL. Điều này làm cho việc gỡ lỗi một số tác vụ (đặc biệt là các tác vụ từ Matplotlib) trở nên đặc biệt khó khăn và cũng dễ bị ảo giác của mô hình. Chắc chắn có những cải tiến dễ dàng ở đây cho các nhà phát triển - và SWE-bench đã ra mắt một đánh giá mới tập trung vào các tác vụ đa phương thức. Chúng tôi mong đợi sẽ thấy các nhà phát triển đạt điểm cao hơn trên bài đánh giá này với Claude trong tương lai gần.
Claude 3.5 Sonnet phiên bản cập nhật đã đạt 49% trên SWE-bench Verified, vượt qua hiệu suất hàng đầu trước đó (45%), với một lời nhắc đơn giản và hai công cụ đa năng. Chúng tôi tin rằng các nhà phát triển xây dựng với Claude 3.5 Sonnet mới sẽ nhanh chóng tìm ra những cách thức mới, tốt hơn để cải thiện điểm SWE-bench so với những gì chúng tôi đã trình bày ban đầu ở đây.
Lời cảm ơn
Erik Schluntz đã tối ưu hóa tác nhân SWE-bench và viết bài đăng blog này. Simon Biggs, Dawn Drain và Eric Christiansen đã hỗ trợ triển khai bộ tiêu chuẩn. Shauna Kravec, Dawn Drain, Felipe Rosso, Nova DasSarma, Ven Chandrasekaran và nhiều người khác đã đóng góp vào việc đào tạo Claude 3.5 Sonnet để trở nên xuất sắc trong việc lập trình tác nhân.
Nhận bản tin dành cho nhà phát triển
Cập nhật sản phẩm, hướng dẫn, các bài giới thiệu cộng đồng và nhiều hơn nữa. Gửi hàng tháng đến hộp thư của bạn.
Chân trang trang web
[Logo Anthropic]
Sản phẩm
- Claude
- Claude Code
- Claude và Slack
- Claude trong Excel
- Gói Max
- Gói Team
- Gói Enterprise
- Tải ứng dụng
- Giá
- Đăng nhập vào Claude
Mô hình
- Opus
- Sonnet
- Haiku
Giải pháp
- AI agents
- Hiện đại hóa mã
- Lập trình
- Hỗ trợ khách hàng
- Giáo dục
- Dịch vụ tài chính
- Chính phủ
- Khoa học đời sống
Nền tảng nhà phát triển Claude
- Tổng quan
- Tài liệu dành cho nhà phát triển
- Giá
- Amazon Bedrock
- Google Cloud’s Vertex AI
- Đăng nhập Console
Tìm hiểu
- Blog
- Khóa học
- Các trường hợp sử dụng
- Bộ kết nối
- Câu chuyện khách hàng
- Kỹ thuật tại Anthropic
- Sự kiện
- Powered by Claude
- Đối tác dịch vụ
- Chương trình startups
Công ty
- Anthropic
- Sự nghiệp
- Tương lai kinh tế
- Nghiên cứu
- Tin tức
- Chính sách mở rộng có trách nhiệm
- Bảo mật và tuân thủ
- Minh bạch
Trợ giúp và bảo mật
- Khả dụng
- Trạng thái
- Trung tâm hỗ trợ
Điều khoản và chính sách
- Chính sách bảo mật
- Chính sách tiết lộ có trách nhiệm
- Điều khoản dịch vụ: Thương mại
- Điều khoản dịch vụ: Người tiêu dùng
- Chính sách sử dụng
© 2025 Anthropic PBC
[Các biểu tượng mạng xã hội: LinkedIn, X (Twitter), YouTube]
Link bài viết gốc
- Tags:
- Ai
- Oct 30, 2024
- Www.anthropic.com