Một cây đànbóng đá wap, một bình rượu, một dòng mây.
Tiếp tục từ phần trướcxóc đĩa, viết thêm một chút về công nghệ. 。
Trong bài viết trước [1]live casino, Nói chuyện sơ lược về DSPy và kỹ thuật tự động hóa gợi ý (phần đầu) Trong bài viết trướcxóc đĩa, chúng ta đã phân tích khung xương mã nguồn của một chương trình tối ưu hóa DSPy điển hình. Ở phần này, chúng ta sẽ tiếp tục hai vấn đề quan trọng còn tồn đọng.
Trang chủ của DSPy [1] và trang chủ trên Github [2]xóc đĩa, câu đầu tiên giới thiệu về DSPy như sau:
DSPy is the framework for programming—rather than prompting—language models.
DSPy là một khung làm việc sử dụng mô hình ngôn ngữ theo cách tiếp cận "lập trình" thay vì xây dựng thông qua việc viết câu lệnh gợi ý. Khung này cho phép người dùng có thể tùy chỉnh và mở rộng chức năng của mô hình một cách sâu sắcxóc đĩa, từ đó tạo ra các tác vụ phức tạp hơn mà không cần phụ thuộc hoàn toàn vào cách thức tương tác truyền thống với mô hình thông qua các câu hỏi hoặc yêu cầu đơn giản.
Điều được gọi là programming Phương pháp nàybóng đá wap, trong khi phân tích mã nguồn ở bài viết trước, chúng ta đã phát hiện ra hiện tượng này:
cot
=
dspy
.
ChainOfThought
(
'contextxóc đĩa, question -> response')
Đoạn mã này tạo ra một phiên bản Module.
cot
xóc đĩa, nhưng không chỉ định rõ ràng bất kỳ nhắc từ hoặc mẫu nhắc từ nào.'contextxóc đĩa, question -> response'
Hình thức của nó giống như một chữ ký hàmbóng đá wap, ý nghĩa của nó là module này nhận hai đầu vào.
context
Ghi giá trị
question
xóc đĩa, sau khi gọi LLM sẽ xuất ra một
response
。
Kiểu lập trình này là một lựa chọn thiết kế của DSPybóng đá wap, nơi prompt thực sự được "che giấu" ở phía sau. Có thể có những ưu điểm và nhược điểm khi áp dụng cách tiếp cận này, nhưng hiện tại chúng ta sẽ không đi sâu vào cuộc thảo luận về vấn đề đó. Thay vào đó, hãy cùng khám phá xem prompt thực sự đằng sau là gì, điều này sẽ giúp ích rất nhiều cho việc hiểu rõ hơn về quá trình tối ưu hóa ở phần tiếp theo.
Chúng ta chạy thử đoạn mã trước đó
cot
Modulebóng đá wap, như hình dưới đây:
Lưu ý dòng mã này trong hình trên:
cot
(
context
=
context
,
question
=
question
)
Chúng ta thấy khi gọi
cot
Module này truyền vào hai tham số:
context
Ghi giá trị
question
live casino, điều này phù hợp với hình thức của Signature được chỉ định trước, tức là'contextlive casino, question -> response'
。
Dòng mã này thực hiện rất nhiều việc: nó xây dựng một prompt dựa trên các tham số đầu vàolive casino, sau đó gọi đến mô hình ngôn ngữ lớn (LLM) và trả về kết quả phản hồi. Bên cạnh đó, đoạn mã còn tối ưu hóa một số tham số ẩn, đảm bảo hiệu suất tối đa trong quá trình xử lý thông tin, từ đó mang lại kết quả chính xác hơn cho người dùng.
response
. Hơn nữa, đối với
dspy.ChainOfThought
bóng đá wap, nó còn trả về thêm một trường đầu ra
reasoning
xóc đĩa, đó là quá trình suy luận do LLM tạo ra.
cot
Quá trình tương tác giữa Module và LLM có thể được xem qua phương pháp dspy.inspect_history(). Quá trình này bao gồm prompt được đưa vào cho LLM và completion mà LLM trả về. Xem hình dưới đây (nhấn để xem lớn hơn):
Được rồibóng đá wap, bây giờ chúng ta đã thấy prompt thực sự rồi. Trong hình ảnh trên, mọi thứ trước dòng "Response:" là phần prompt, còn tất cả những gì nằm sau dòng đó chính là kết quả đầu ra từ mô hình ngôn ngữ lớn (LLM). Prompt đóng vai trò như một tín hiệu hướng dẫn mô hình tạo ra phản ứng dựa trên yêu cầu cụ thể mà bạn đặt ra.
Trong khung DSPyxóc đĩa, bất kỳ nơi nào khi bạn gọi LLM (Language Model), prompt hầu như đều tuân theo một định dạng mẫu tương tự. Điều này cũng áp dụng khi sử dụng LLM để tính toán các Metric và cả khi trình tối ưu hóa của DSPy hoạt động bằng cách gọi LLM để tạo ra các prompt mới. Chính vì sự "ổn định" của định dạng mẫu nội bộ mà DSPy sử dụng, các nhà phát triển khi viết mã không cần phải chỉ định cụ thể từng prompt, từ đó giúp thực hiện đúng mục tiêu mà khung này hướng tới: “lập trình thay vì tạo prompt cho các mô hình ngôn ngữ”.
Hình trên còn có điểm đáng chú ý khácbóng đá wap, ở dòng cuối cùng của System message:
Given the fields `context`live casino, `question`, produce the fields `response`.
Nội dung của dòng này chính là phần instruction (lệnh) Khi bộ tối ưu hóa của DSPy hoạt độngxóc đĩa, một trong những bước quan trọng là nó sẽ chỉnh sửa lại lệnh này. Quá trình này không chỉ đơn thuần là thay đổi mà còn nhằm tối đa hóa hiệu suất và đảm bảo rằng mọi yếu tố đều được xử lý một cách chính xác nhất có thể. Với mỗi lần chỉnh sửa, hệ thống cũng sẽ kiểm tra lại toàn bộ cấu trúc để tránh bất kỳ xung đột nào có thể xảy ra trong quá trình thực thi.
Sau khi đã chiêm ngưỡng prompt thực sự trong DSPybóng đá wap, hãy cùng nhau tìm hiểu sâu hơn về cách hoạt động của bộ tối ưu hóa DSPy. Quá trình này không chỉ đơn thuần là việc xử lý thông tin mà còn bao gồm nhiều bước tinh vi để đảm bảo rằng các tác vụ được thực hiện một cách hiệu quả nhất. Đầu tiên, hệ thống sẽ phân tích kỹ lưỡng từng thành phần của prompt, từ đó xác định chính xác mục tiêu cần đạt được. Tiếp theo, dựa trên các dữ liệu đã có, bộ tối ưu hóa sẽ xây dựng chiến lược tối ưu phù hợp, đảm bảo rằng mọi thao tác đều được thực hiện với độ chính xác cao và tốc độ nhanh chóng. Điều đặc biệt ở đây là khả năng tự điều chỉnh và thích nghi của DSPy với những tình huống mới hoặc phức tạp, giúp nó luôn duy trì hiệu suất tối đa. Quá trình này không chỉ dừng lại ở việc cải thiện hiệu quả công việc mà còn liên tục học hỏi từ các lần chạy trước để ngày càng hoàn thiện hơn. Vì vậy, việc hiểu rõ cách hoạt động của DSPy không chỉ giúp chúng ta đánh giá đúng tiềm năng của nó mà còn mở ra nhiều cơ hội mới trong việc áp dụng công nghệ này vào thực tiễn.
Nhớ lại mã gọi trình tối ưu hóa trong bài viết trước:
...
rag
=
RAG
()
# Phần 5: Khởi động Teleprompter và hoàn thành biên dịch/tối ưu hóa # dspy.MIPROv2 là một phần không thể thiếu của Teleprompter Trong giai đoạn nàyxóc đĩa, chúng ta sẽ tiến hành khởi động hệ thống Teleprompter với sự hỗ trợ của tập hợp các mô-đun quan trọng. Trong đó, dspy.MIPROv2 đóng vai trò như một nền tảng cốt lõi, góp phần tạo nên cấu trúc vững chắc cho toàn bộ hệ thống. Với khả năng tích hợp tuyệt vời, dspy.MIPROv2 không chỉ mở rộng tính năng mà còn tối ưu hóa hiệu suất hoạt động, đảm bảo rằng mọi thông tin được trình bày một cách trơn tru và chính xác nhất. Đây là bước quan trọng để chuẩn bị cho quá trình biên dịch và tối ưu hóa tiếp theo, nơi mà mọi chi tiết nhỏ đều được kiểm soát chặt chẽ để đạt hiệu quả tốt nhất.tp
=
dspy
.
MIPROv2
(
metric
=
metric
,
auto
=
"light"
,
num_threads
=
8
)
optimized_rag
=
tp
.
compile
(
rag
,
trainset
=
trainset
,
valset
=
valset
,
max_bootstrapped_demos
=
2
,
max_labeled_demos
=
2
,
requires_permission_to_run
=
False
)
Tối ưu hóa Chỉ số và Biểu thị cho Chương trình Mô hình Ngôn ngữ Nhiều Giai đoạn instruction Một phần khác là phương pháp few-shot. Trong một bài viết blog được xuất bản bởi Heiko Hotz [4]xóc đĩa, cách tối ưu hóa cho few-shot trong dự án APE được gọi là exemplar selection 。
Tóm tắt nhìn chungbóng đá wap, quá trình thực thi của MIPROv2 có thể được chia thành ba bước lớn:
Dưới đâyxóc đĩa, chúng ta sẽ giới thiệu chi tiết về ba bước này thông qua ví dụ thực thi.
Bước 1: Tạo tập ứng viên few-shot 。
Mục tiêu của bước này là tạo ra các ví dụ few-shot cho từng module con của chương trình DSPy dựa trên dữ liệu từ tậ Có hai chiến lược chính được sử dụng để thực hiện việc này.
Chiến lược đầu tiên là lấy mẫu trực tiếp từ tập dữ liệ Các ví dụ được lấy mẫu sẽ trở thành ứng viên few-shot cho từ Số lượng mẫu được chọn dựa trên các dòng mã trước đó trong đoạn code. Điều thú vị ở đây làlive casino, việc lấy mẫu không chỉ đơn giản là lựa chọn ngẫu nhiên mà còn dựa trên một số tiêu chí đặc biệt, chẳng hạn như mức độ phức tạp của ví dụ hoặc sự đa dạng trong cấu trúc dữ liệu. Điều này giúp đảm bảo rằng mỗi Module con có thể học được từ những ví dụ tiêu biểu và đại diện nhất. Nhờ vậy, quá trình đào tạo sẽ hiệu quả hơn, đồng thời giúp các mô hình con đạt được khả năng tổng quát hóa tốt hơn.
max_labeled_demos
Được chỉ định bởi
Chiến lược thứ haibóng đá wap, thực sự được gọi là
Bootstrap
Cách thực hiện của nó như sau: Từ tập dữ liệu trainsetlive casino, một số ví dụ sẽ được chọn ngẫu nhiên và đưa vào chương trình DSPy (
rag
Các module con sẽ được thực hiện trong module chính và quá trình thực thi sẽ ghi lại đầu vào và đầu ra của từ Nếu đầu ra cuối cùng của chương trình DSPy đạt tiêu chuẩn đánh giá do Metric đề raxóc đĩa, thì mỗi module con sẽ cung cấp đầu vào và đầu ra của mình như là các ứng viên cho phương pháp few-shot.
Nguyên nhân cần áp dụng chiến lược Bootstrap này là vì quá trình tối ưu hóa trong DSPy được thực hiện cho toàn bộ chương trình DSPylive casino, chứ không chỉ giới hạn ở một mô-đun LLM riêng lẻ. Điều này giúp đảm bảo rằng tất cả các thành phần trong hệ thống hoạt động đồng nhất và hiệu quả nhất có thể, thay vì chỉ tập trung vào từng phần rời rạc. Với cách tiếp cận tổng thể này, DSPy có thể tối ưu hóa toàn diện hơn, từ đó cải thiện hiệu suất tổng thể của cả hệ thống.Theo DSPybóng đá wap, một chương trình được xem như được cấu thành từ nhiều mô-đun khác nhau, và toàn bộ quá trình thực thi của chương trình diễn ra theo một pipeline đa giai đoạn (multi-stage). Mỗi bước trong pipeline này sẽ xử lý các tác vụ cụ thể trước khi chuyển sang giai đoạn tiếp theo, tạo nên một chuỗi hoạt động chặt chẽ và hiệu quả. Điều này cho phép việc quản lý và tối ưu hóa tài nguyên trở nên linh hoạt hơn, đồng thời đảm bảo rằng từng phần tử trong chương trình đều được thực hiện một cách chính xác và kịp thời.Dữ liệu trainset được thiết kế cho việc gán nhãn toàn diện từ đầu đến cuối của chương trìnhlive casino, và thường không chứa thông tin gán nhãn cho các kết quả Do đó, chiến lược Bootstrap về cơ bản là sử dụng dữ liệu gán nhãn từ tập trainset theo cách toàn phần, sau đó tự động tạo ra một số lượng lớn dữ liệu gán nhãn cho các kết quả trung gian thông qua các hoạt động của chương trình. Điều này giúp tiết kiệm rất nhiều công sức cần thiết để gán nhãn thủ công cho các kết quả trung gian trong quá trình phát triển.
Số lượng ví dụ few-shot được tạo ra cho mỗi Module thông qua chiến lược Bootstrap phụ thuộc vào các giá trị đã được thiết lập trong mã code trước đó. Cụ thểbóng đá wap, tham số này thường được xác định dựa trên các cấu hình hoặc giá trị mặc định đã được cài đặt trong phần mã nguồn, giúp tối ưu hóa quá trình học với dữ liệu hạn chế.
max_bootstrapped_demos
Được chỉ định bởi
Cũng có thể nói rằnglive casino, chiến lược đầu tiên mà bạn vừa đề cập, trong đó trực tiếp lấy mẫu từ tập trainset để tạo ra các trường hợp few-shot, sẽ rất khó phát huy hiệu quả thực sự khi chương trình DSPy bao gồm nhiề Lý do là, các thông tin nhãn dự kiến mà Module giữa cần nhận, có khả năng cao là không tồn tại trong tậ Điều này làm cho việc huấn luyện và tối ưu hóa trở nên khó khăn hơn, vì các Module trước đó không được cung cấp đủ dữ liệu tham chiếu chính xác.
Chiến lược Bootstrap có thể được thực hiện nhiều lần. Miễn là tập dữ liệu trainset đủ lớnxóc đĩa, thuật toán MIPROv2 sẽ thực hiện việc trộn (shuffle) tập trainset một lần và lặp lại chiến lược Bootstrap để tạo ra một tập hợp ứng viên few-shot hoàn toàn mới. Thao tác shuffle này đảm bảo rằng mỗi lần chạy thuật toán sẽ có sự thay đổi đáng kể trong cách lựa chọn mẫu, từ đó nâng cao tính đa dạng của tập ứng viên mà không làm mất đi tính hiệu quả của phương pháp.
Trở lại mã trước đóbóng đá wap, sau khi thực hiện Bước 1, tập ứng viên few-shot được tạo ra như sau:
Giải thích đơn giản về kết quả ở hình trên:
Kết quả của demo_candidates cho thấy
rag
Chương trình chỉ có một Module (thực tế là một
dspy.ChainOfThought
Trường hợp này có số hiệu là 0xóc đĩa, và Bước 1 đã tạo ra 5 tập ứng viên few-shot cho Module này.
Kết quả từ demo_candidates[0] đã thể hiện 5 bộ thí nghiệm few-shot duy nhất cho mô-đun nàyxóc đĩa, trong đó mỗi bộ thí nghiệm chứa 2 ví dụ (được xác định bởi tham số). Điều này cho phép người dùng dễ dàng so sánh và lựa chọn các tập dữ liệu phù hợp nhất cho nhu cầu cụ thể của họ. Mỗi cặp ví dụ đều được thiết kế cẩn thận để đảm bảo tính đại diện và đa dạng trong việc huấn luyện mô hình, từ đó nâng cao hiệu suất tổng thể của nó.
max_bootstrapped_demos
Ghi giá trị
max_labeled_demos
Được chỉ định). Nếu mọi người quan sát kỹlive casino, sẽ phát hiện ra rằng example có hai dạng:
augmented
trường. Điều này biểu thị example này được tạo ra bằng chiến lượ
augmented
trường. Điều này biểu thị example này được lấy trực tiếp từ trainset.
Trong số 5 tập dữ liệu few-shot nàybóng đá wap, không phải tất cả sẽ được sử dụng trong prompt cuối cùng. Còn một bước sàng lọc quan trọng khác sẽ diễn ra trước khi đi đến quyết định cuối cùng.
Bước 2: Tạo tập ứng viên instruction 。
Đối với từng mô-đun của chương trình và mỗi tập ứng viên few-shotbóng đá wap, bước này sẽ tạo ra một chỉ dẫn ứng viên hoàn toàn mới.
Bạn có thể giải thích cách các instruction mới được tạo ra không? Hãy cùng xem qua một ví dụ thực tế. Hình dưới đây minh họa quá trình tương tác giữa hệ thống và mô hình ngôn ngữ lớn (LLM) trong một lần tạo instruction (bao gồm cả meta-prompt và đầu ra của LLM):
Hình ảnh phía trên cho thấy meta-prompt chứa đựng vô số thông tinxóc đĩa, điều này thực sự rất gợi mở. Bây giờ chúng ta hãy cùng nhau tìm hiểu sâu hơn về những nội dung phong phú được trình bày trong hình ảnh này. Meta-prompt không chỉ đơn thuần là một tập hợp các dữ liệu mà còn là một bản đồ dẫn đường giúp chúng ta khám phá nhiều khía cạnh mới mẻ và thú vị.
Đầu tiênlive casino, trong hình trên, dòng chữ "Response:" và tất cả những gì nằm trước nó chính là meta-prompt mà chúng ta đã đề cập đến trong bài viết trước. Còn phần sau cụm từ "Response:", tức là nội dung được viết tiếp theo, chính là kết quả đầu ra do mô hình ngôn ngữ lớn (LLM) tạo ra.
Trong meta-prompt nàyxóc đĩa, chúng ta có thể nhận thấy rằng để tạo ra các lệnh mới, DSPy đã cung cấp cho mô hình ngôn ngữ lớn (LLM) nhiều thông tin tham khảo phong phú. Những thông tin này bao gồm: 1. **Ví dụ thực tế**: Một số tình huống cụ thể và chi tiết được sử dụng để minh họa cách mà LLM có thể áp dụng trong các ngữ cảnh khác nhau. 2. **Các nguyên tắc cơ bản**: Các định hướng quan trọng về cách hoạt động của LLM, giúp nó hiểu rõ hơn về cách thức xử lý và phản hồi yêu cầu từ người dùng. 3. **Dữ liệu mẫu đa dạng**: Không chỉ dừng lại ở một loại dữ liệu duy nhất, DSPy còn cung cấp nhiều dạng nội dung khác nhau như văn bản, hình ảnh, âm thanh, nhằm khuyến khích LLM phát triển khả năng linh hoạt trong việc tiếp thu và phân tích thông tin. 4. **Phản hồi từ người dùng**: Những ý kiến đóng góp hoặc đánh giá từ người dùng trước đó cũng được đưa vào như một nguồn tham khảo bổ sung để cải thiện chất lượng và độ chính xác của các câu lệnh mới. Tất cả những yếu tố trên đều đóng vai trò quan trọng trong việc kích hoạt trí tuệ và khả năng sáng tạo của LLM.
[[ ## dataset_description ## ]]
trường. Đây thực chất là một mô tả bằng ngôn ngữ tự nhiên về
trainset
điều này cũng được LLM tóm tắt và tạo ra.
[[ ## program_code ## ]]
Ghi giá trị
[[ ## program_description ## ]]
trường.
[[ ## basic_instruction ## ]]
trường.
[[ ## tip ## ]]
trường.
Gợi ý tạo instructionbóng đá wap, khung DSPy cung cấp một số cấu hình sẵn có như sau:
TIPS
=
{
"none"
:
""
,
"creative"
:
"Don't be afraid to be creative when creating the new instruction!"
,
"simple"
:
"Keep the instruction clear and concise."
,
"description"
:
"Make sure your instruction is very informative and descriptive."
,
"high_stakes"
:
"The instruction should include a high stakes scenario in which the LM must solve the task!"
,
"persona"
:
'Include a persona that is relevant to the task in the instruction (ie. "You are a ...")'
,
}
Trong hình ảnh phía trênbóng đá wap, khi tạo ra chỉ dẫn instruction, đã sử dụng "tip" có tính chất sáng tạo "creative", điều này khuyến khích LLM (Language Model) đưa ra những chỉ dẫn instruction mang tính sáng tạo và độc đáo hơn. Điều này không chỉ giúp mở rộng khả năng của hệ thống mà còn làm nổi bật tiềm năng to lớn trong việc tạo ra nội dung mới mẻ và thú vị.
[[ ## proposed_instruction ## ]]
Giá trị của trường này chính là lệnh instruction cuối cùng được tạo ra dưới sự hướng dẫn.
Sau khi hoàn thành toàn bộ Bước 2bóng đá wap, tập ứng viên instruction được tạo ra như sau:
Cũng giống như trước đóxóc đĩa, giải thích đơn giản về kết quả ở hình trên:
Kết quả của instruction_candidates cho thấy
rag
Chương trình chỉ có một Module (thực tế là
dspy.ChainOfThought
Bạn có thể thấy ví dụ dưới đâybóng đá wap, được đánh số là 0, và ở bước 2, mô-đun này đã tạo ra 5 hướng dẫn ứng viên tiềm năng.
Hình ảnh phía sau cho thấy chi tiết nội dung của 5 được tạo rabóng đá wap, và có thể nhận thấy rằng chúng khác biệt khá nhiều so với nhau trong cách diễn đạt.
Bước 3: Lọc tổ hợp few-shot và instruction tốt nhất 。
Sau hai bước đầu tiênbóng đá wap, bộ tối ưu đã tạo ra 5 phương án candidate cho instruction và 5 tập hợp few-shot candidate (mỗi tập hợp bao gồm 2 ví dụ). Bước cuối cùng này, bộ tối ưu sẽ kết hợp ngẫu nhiên các instruction và các tập few-shot, sau đó chọn ra sự kết hợp có điểm đánh giá Evaluate cao nhất để thu được chương trình tối ưu. Điều thú vị là trong quá trình này, mỗi tổ hợp được thử nghiệm không chỉ giúp tìm ra giải pháp hiệu quả mà còn cung cấp thêm dữ liệu để cải thiện chất lượng của các lần chạy tiếp theo.
Quá trình này có phần tương tự như việc tối ưu hóa tham số siêu (hyperparameter optimization) trong học máy truyền thống. Trong DSPybóng đá wap, bước này được thực hiện bằng cách sử dụng một framework mã nguồn mở có tên là Optuna [5]. Optuna nổi tiếng với khả năng tìm kiếm không gian tham số một cách hiệu quả và linh hoạt, giúp tối đa hóa hiệu suất của mô hình mà không cần nhiều sự can thiệp thủ công từ người dùng. Điều này đã làm cho quá trình tối ưu hóa trở nên nhanh chóng và dễ dàng hơn bao giờ hết.
Dưới đây là nhật ký thực thi của quá trình này:
Dựa trên biểu đồ ở trênxóc đĩa, có thể thấy chương trình đã thực hiện tổng cộng 7 lần thử nghiệm tối ưu hóa (trial), với điểm đánh giá ban đầu là 52.73 và tăng lên đến 53.5 sau các lần thử. Tuy nhiên, do hạn chế về nguồn lực tính toán, cấu hình cụ thể cũng như nhiều yếu tố khác, mức cải thiện tổng thể không quá nổi bật. Mặc dù vậy, mục tiêu chính của bài viết này là để minh họa toàn bộ quy trình vận hành của DSPy, vì vậy việc tập trung vào các bước tối ưu hóa sâu hơn chưa được đề cập đến trong thời điểm hiện tại.
chương trình tối ưu
Cho đến nayxóc đĩa, chúng ta đã cơ bản làm rõ các khái niệm cơ bản của chương trình DSPy và cách một chương trình DSPy điển hình hoạt động. Trong bài viết tiếp theo, chúng ta sẽ đi sâu hơn vào phân tích, bao gồm sự khác biệt giữa DSPy và APE, những bài học mà cách tiếp cận kỹ thuật này mang lại cho chúng ta, cũng như một số vấn đề tiềm ẩn có thể xảy ra trong quá trình thực hiện.
(Kết thúc nội dung chínhlive casino, tiếp theo ở phần sau)
Các bài viết được chọn lọc khác :