Trang chủ > Công nghệ AI > Nội dung chính

Nói chuyện về DSPy và kỹ thuật tự động hóa gợi ý (phần đầu)


Chú trong khe hở99win club, trong đá, thân trong mộng.

Cuối tuần không cuồn cuộn99win club, tranh thủ lấy thời gian rảnh để viết về kỹ thuật.

Cách giao tiếp hiệu quả với mô hình lớn là một môn nghệ thuật.

Vì vậy99win club, một bài toán đặt ra cho những người thuộc thế hệ chúng ta là: Làm thế nào để biến nghệ thuật này thành một vấn đề kỹ thuật có thể được theo dõi và nghiên cứu. Hôm nay, hãy cùng nhau về tự động hóa kỹ thuật gợi ý từ khóa APE (Automated Prompt Engineering), và phân tích một thực hiện mã nguồn mở cụ thể mang tên DSPy[1], xem nó thực sự hoạt động như thế nào để sử dụng khoa học phá vỡ phép màu. Chúng ta đều biết rằng, việc tạo ra các gợi ý từ khóa hiệu quả không chỉ đòi hỏi sự sáng tạo mà còn cần sự logic chặt chẽ. DSPy đã đưa ra một cách tiếp cận mới mẻ, bằng cách sử dụng thuật toán học máy để tối ưu hóa quá trình này. Điều thú vị là, thay vì phụ thuộc hoàn toàn vào cảm giác cá nhân, DSPy dựa trên dữ liệu lớn để đưa ra các gợi ý chính xác hơn. Hãy tưởng tượng rằng bạn đang cố gắng giải quyết một vấn đề phức tạp trong lĩnh vực trí tuệ nhân tạo, và bạn cần một công cụ mạnh mẽ để giúp bạn vượt qua rào cản. DSPy chính là câu trả lời. Nó không chỉ đơn thuần là một công cụ hỗ trợ, mà còn là một bước tiến quan trọng trong việc hiện đại hóa cách chúng ta tiếp cận với các vấn đề phức tạp trong ngành công nghiệp phần mềm. Như vậy, với sự kết hợp giữa nghệ thuật và kỹ thuật, chúng ta có thể kỳ vọng rằng tương lai của tự động hóa gợi ý từ khóa sẽ trở nên ngày càng minh bạch và đáng tin cậy hơn. Và DSPy, với tư cách là một công cụ tiên phong, chắc chắn sẽ đóng góp một vai trò quan trọng trong việc định hình xu hướng này.

Vì nội dung khá dài99win club, tôi dự định sẽ chia nó thành khoảng 2 đến 3 bài viết. Trong bài này, chúng ta sẽ cùng tìm hiểu về các khái niệm cơ bản trong APE và DSPy, đồng thời sử dụng một ví dụ cụ thể về chương trình để giải thích cách hoạt động của DSPy, từ đó tạo ra cảm nhận trực quan. Ở những phần tiếp theo, tôi sẽ phân tích thêm về sự khác biệt giữa DSPy và APE, những bài học thú vị mà quy trình này mang lại, cũng như một số vấn đề tiềm ẩn có thể phát sinh.

Hai loại nhắc từ chính

Đối với mỗi vai trò khác nhaubxh ngoai hang anh, ý nghĩa của từ khóa "prompt" có thể sẽ hơi khác nhau. Để tiện cho việc thảo luận, chúng ta có thể tạm chia prompt thành hai loại chính: Thứ nhất là các prompt mang tính kỹ thuật hoặc chuyên môn, thường được sử dụng bởi các nhà phát triển, kỹ sư phần mềm hoặc chuyên gia AI. Loại này tập trung vào việc cung cấp thông tin chi tiết, định dạng rõ ràng và cấu trúc cụ thể để hệ thống có thể hiểu và thực hiện đúng yêu cầu. Thứ hai là các prompt sáng tạo hơn, thường được sử dụng bởi nhà văn, họa sĩ hoặc những người làm công việc liên quan đến nghệ thuật. Đây là loại prompt giúp khơi gợi cảm hứng, truyền tải ý tưởng một cách trừu tượng nhưng vẫn đủ gợi mở để tạo ra sản phẩm sáng tạo độc đáo. Việc phân loại này không phải là cố định mà có thể thay đổi tùy theo ngữ cảnh và mục đích sử dụng của từng cá nhân. Tuy nhiên, nó giúp chúng ta dễ dàng hình dung hơn về vai trò đa dạng mà prompt có thể đảm nhiệm trong nhiều lĩnh vực khác nhau.

  • Nhắc từ trò chuyện thông thường
  • Nhắc từ phát triển hệ thống

Các gợi ý trò chuyện thông thường là dành cho người dùng phổ thông. Khi một người dùng tương tác với sản phẩm dựa trên mô hình lớn qua hình thức trò chuyệnkeo 88, họ cần sử dụng ngôn ngữ rõ ràng để mô tả vấn đề của mình nếu muốn nhận được câu trả lời như mong đợi. Ví dụ, nếu bạn muốn mô hình lớn giúp viết một bài văn cho học sinh trung học cơ sở, thì lúc này bạn cần trình bày đầy đủ và rõ ràng các thông tin liên quan đến bài văn, ý tưởng mà bạn kỳ vọng, phong cách viết, thậm chí là bối cảnh cụ thể mà bạn muốn miêu tả, cũng như tất cả các yêu cầu viết khác. Điều này sẽ đảm bảo rằng mô hình có thể hiểu chính xác những gì bạn cần và đưa ra kết quả phù hợp nhất.

Nói cách kháckeo 88, nhắc từ trò chuyện thông thường là do người dùng tự viết, chỉ cần mô tả rõ yêu cầu cho nhiệm vụ cụ thể hiện tại là được.

Việc phát triển các câu lệnh gợi ý (prompt) cho hệ thống AI lại là một câu chuyện hoàn toàn khác99win club, vì nó chủ yếu dành cho các nhà phát triển ứng dụng AI (tức các kỹ sư). Khi các kỹ sư viết mã và xây dựng hệ thống AI, họ thường cần chia nhỏ nhiệm vụ của người dùng thành nhiều bước. Trong quá trình này, họ sẽ phải tương tác với các mô hình lớn (large models), từ đó dẫn đến công việc viết câu lệnh gợi ý. Ví dụ, phân loại ý định của người dùng, trích xuất thực thể, mở rộng từ khóa tìm kiếm, tất cả đều là những tình huống phổ biến trong quá trình phát triển ứng dụng AI. Mỗi bước đều đòi hỏi sự tinh tế và hiểu biết sâu sắc về cách tương tác hiệu quả với mô hình lớn để đạt được kết quả mong muốn.

Rõ ràngkeo 88, các từ khóa gợi ý cho việc phát triển hệ thống hoàn toàn khác biệt so với các từ khóa gợi ý trong cuộc trò chuyện thông thường. Chúng được viết bởi các kỹ sư và cần phải xem xét tất cả các tình huống có thể xảy ra khi người dùng nhập liệu trong một ngữ cảnh cụ thể. Do đó, việc thiết kế từ khóa gợi ý cho hệ thống đòi hỏi một cách tiếp cận có tổ chức và hệ thống hơn, cần tính đến nhiều trường hợp viền giới hạn (boundary cases) hơn và phải đảm bảo tỷ lệ chính xác ổn định. Điều này cho thấy tầm quan trọng của chúng không thua kém gì mã nguồn lập trình.

Tiếp theokeo 88, chúng ta sẽ thảo luận về APE, rõ ràng là nó nhắm đến loại nhắc từ thứ hai - nhắc từ phát triển hệ thống.

Các khái niệm cơ bản trong APE và DSPy

Trước khi phân tích chi tiết các chương trình DSPy cụ thểkeo 88, trước tiên chúng ta hãy làm rõ một số khái niệm cơ bản về APE và DSPy.

Vậy APE là gì? Nói một cách đơn giảnkeo 88, đó là sử dụng LLM để tự động giúp chúng ta tạo ra nhắc từ.

Vấn đề đặt ra làkeo 88, làm sao chúng ta có thể biết được các từ khóa gợi ý do LLM (Language Model) tạo ra có tốt không? Nó có thực sự đáp ứng những gì chúng ta mong đợi hay không? Do đó, để sử dụng APE (Automatic Prompt Engineering), chúng ta cần phải xác định rõ một tiêu chí hoặc mục tiêu cụ thể. Điều này sẽ giúp đánh giá chất lượng của các từ khóa gợi ý và đảm bảo rằng kết quả đạt được phù hợp với nhu cầu của người dùng. Một khi tiêu chuẩn này được thiết lập, việc kiểm tra và tối ưu hóa các từ khóa gợi ý sẽ trở nên dễ dàng hơn nhiều. metric Dựa trên chỉ số nàybxh ngoai hang anh, chúng ta có thể tự động đánh giá hiệu suất của các câu gợi ý mà hiện tại đã được tạo ra đến mức nào. Tất nhiên, việc xác định chỉ số không phải là một nhiệm vụ đơn giản, chúng ta sẽ bàn thêm về vấn đề này sau.

Hiện tại đã có metrickeo 88, nhưng nó được đánh giá cụ thể trên tập dữ liệu nào thì vẫn còn là câu hỏi cần được làm rõ. Để giải đáp vấn đề này, chúng ta cần cung cấp thêm một tập dữ liệu tham chiếu hoặc một bộ tiêu chí cụ thể nhằm đảm bảo tính khách quan và chính xác trong việc đo lường hiệu suất. Việc lựa chọn tập dữ liệu phù hợp không chỉ giúp đánh giá đúng khả năng của metric mà còn hỗ trợ tối ưu hóa quá trình nghiên cứu và phát triển thuật toán. Tập dữ liệu đã được đánh dấu (labelled dataset) Tất nhiên99win club, trong quá trình sử dụng thực tế, tập dữ liệu này sẽ được chia thành tập huấn luyện, tập xác minh và tập kiểm tra.

APE là một quá trình không ngừng cải tiến. Mỗi khi tạo ra phiên bản mới của prompt99win club, nó sẽ dựa trên metric để đánh giá trên tập dữ liệu và thu được một điểm số (score). Miễn là phiên bản prompt mới đạt được điểm số cao hơn so với phiên bản cũ, quá trình APE có thể tiếp tục lặp lại, từ đó cho ra đời những prompt tốt hơn nữa theo thời gian. Điều thú vị ở đây là, trong mỗi vòng lặp, APE không chỉ đơn giản là so sánh kết quả mà còn học hỏi từ những sai sót trước đó. Hệ thống sẽ tự động phân tích những yếu tố nào đã giúp phiên bản mới vượt trội hơn và cố gắng tối ưu hóa chúng. Điều này giống như việc một nghệ sĩ piano không ngừng luyện tập để cải thiện kỹ năng biểu diễn của mình qua từng buổi tập - mỗi lần chơi lại đều mang đến những cảm xúc và âm thanh sâu sắc hơn. Nhờ khả năng tự điều chỉnh linh hoạt và khả năng học hỏi liên tục, APE không chỉ dừng lại ở một phiên bản hoàn hảo duy nhất mà luôn tìm kiếm những cải tiến nhỏ nhưng quan trọng, biến nó trở thành một công cụ mạnh mẽ trong việc tối ưu hóa các tác vụ phức tạp.

đi chân trái bước chân phải Nhắc từ ban đầu (initial prompt) 99win club, làm điểm khởi đầu cho việc tối ưu hóa lặp lại.

Ngoài rabxh ngoai hang anh, vì trong APE, nhắc từ được tạo ra bởi LLM, do đó chúng ta cũng cần mộtNhắc từ được sử dụng để tạo ra nhắc từ mới99win club, gọi là meta-prompt Meta-prompt là một khái niệm rất quan trọ

DSPy là một khung công tác nguồn mởbxh ngoai hang anh, bao gồm phần lớn các thành phần của dự án APE. Tuy nhiên, DSPy không chỉ giới hạn ở APE mà còn có nhiều điều thú vị hơn. Sự khác biệt giữa hai công cụ này sẽ được chúng tôi phân tích và giải thích chi tiết hơn sau khi thảo luận về quy trình thực thi của DSPy trong những phần tiếp theo của bài viết.

Trước khi đi sâu vào phân tích cụ thể về DSPy99win club, chúng ta hãy cùng điểm qua một số khái niệm cốt lõi mà DSPy đã tóm lược lại. Những khái niệm này không chỉ giúp làm sáng tỏ bản chất của công cụ mà còn tạo nền tảng vững chắc cho việc hiểu rõ cách nó hoạt động trong các tình huống thực tế. Qua đó, bạn sẽ có cái nhìn toàn diện hơn trước khi khám phá chi tiết từng thành phần quan trọng của DSPy.

  • Module Đơn vị cơ bản của một chương trình DSPy là một Module. Một Module có các định nghĩa rõ ràng về đầu vào và đầu ra99win club, đồng thời nó sẽ gọi LLM để xử lý từ đầu vào đến đầu ra. Chính một chương trình DSPy cũng có thể được xem như một Module, nhưng bên trong nó có thể chứa nhiều Module con hơn; bộ tối ưu hóa của DSPy có thể tập hợp nhiều Module thuộc cùng một chương trình DSPy để tối ưu hóa và lặp lại quá trình này. Điều tối ưu hóa ở đây thường có nghĩa là tối ưu hóa các câu lệnh gợi ý (prompt), tức là những gì đã đề cập trước đó dưới tên APE.
  • Signature Một Module có thể được mô tả qua đầu vào và đầu ra của nó99win club, giống như cách một hàm được ký hiệu trong lập trình. Khái niệm Signature là điều đặc biệt trong DSPy mà chúng ta sẽ giải thích kỹ hơn khi phân tích chi tiết bên dưới.
  • Metric : Trước đây chúng ta đã đề cập đến metric99win club, trong DSPy, Metric được khái quát hóa thành một hàm (function). Hàm này có thể tính toán một điểm số (score) dựa trên đầu ra của một chương trình DSPy và câu trả lời mong đợi đã được đánh dấu sẵn. Có nhiều cách khác nhau để tính toán điểm số này. Hàm metric không chỉ đơn thuần là một công cụ so sánh kết quả mà còn có thể đo lường độ chính xác, hiệu quả hoặc sự phù hợp của các tác vụ phức tạp. Điểm số có thể phản ánh tỷ lệ phần trăm đúng sai, khoảng cách giữa giá trị dự đoán và giá trị thực, hoặc thậm chí là một độ đo tổng hợp từ nhiều yếu tố khác nhau tùy thuộc vào nhu cầu cụ thể của bài toán. Tuy nhiên, điều quan trọng khi sử dụng metric trong DSPy là phải lựa chọn loại điểm số phù hợp với mục tiêu của chương trình. Điều này giúp đảm bảo rằng kết quả nhận được là đáng tin cậy và có ý nghĩa đối với người dùng cuối cùng.
  • Evaluate : Tính toán từng Metric trên một tập dữ liệu nhất địnhkeo 88, sau đó tổng hợp để tính toán điểm đánh giá tổng thể.
  • Optimizer : Tối ưu hóa. Trong DSPykeo 88, việc tối ưu hóa cụ thể được thực hiện được gọi là Teleprompter Trong hệ thống DSPykeo 88, Teleprompter đóng vai trò là trung tâm điều khiển và thúc đẩy quá trình tối ưu hóa lặp đi lặp lại. Tại mỗi vòng lặp, Teleprompter tham chiếu nhiều nguồn thông tin khác nhau như nội dung từ chính chương trình, tập dữ liệu, prompt cũ cùng với điểm đánh giá tương ứng của chúng. Dựa trên đó, nó sẽ thực hiện một số chiến lược tối ưu hóa để tạo ra các prompt mới cho từng module trong toàn bộ cấu trúc của chương trình DSPy. Điều này giúp đảm bảo rằng mỗi phần tử của chương trình không ngừng được cải thiện và hoàn thiện hơn qua từng vòng lặp.

Phân tích ví dụ chạy chương trình DSPy

Trong phần nàybxh ngoai hang anh, chúng ta sẽ đi sâu vào việc phân tích quá trình hoạt động của một chương trình DSPy cụ thể. Chương trình này được lấy từ tài liệu hướng dẫn chính thức của DSPy: https://dspy.ai/tutorials/rag/ Bạn có thể thấy cách một chương trình RAG điển hình được tối ưu hóa bằng cách sử dụ Chúng ta sẽ lấy chương trình RAG này làm ví dụ và phân tích từ từ các bước hoạt động chính cũng như nguyên lý đằng sau nó. Điều này giúp chúng ta hiểu rõ hơn về cách RAG kết nối và xử lý thông tin một cách hiệu quả trong quy trình làm việc.

Mã khung chương trình như sau:

								
									# Phần 1: Khởi tạo LLMlm
									 =
									 dspy
									.
									LM
									(
									'openai/gpt-4o-mini'
									)
									
dspy
									.
									configure
									(
									lm
									=
									lm
									)
									

# Phần 2: Khởi tạo tập dữ liệuwith
									 open
									(
									'ragqa_arena_tech_500.json'
									)
									 as
									 f
									:
									
    data
									 =
									 ujson
									.
									load
									(
									f
									)
									

data
									 =
									 [
									dspy
									.
									Example
									(
									**
									d
									).
									with_inputs
									(
									'question'
									)
									 for
									 d
									 in
									 data
									]
									
random
									.
									shuffle
									(
									data
									)
									
trainset
									,
									 valset
									,
									 devset
									,
									 testset
									 =
									 data
									[:
									50
									],
									 data
									[
									50
									:
									150
									],
									 data
									[
									150
									:
									300
									],
									 data
									[
									300
									:
									500
									]
									

# Phần 3: Khởi tạo Metric và Evaluatemetric
									 =
									 SemanticF1
									()
									
evaluate
									 =
									 dspy
									.
									Evaluate
									(
									devset
									=
									testset
									,
									 metric
									=
									metric
									,
									 num_threads
									=
									8
									,
									
                         display_progress
									=
									True
									,
									 display_table
									=
									2
									)
									

# Phần 4: Khởi tạo mô-đun RAG # Mã nguồn để thực hiện tìm kiếmbxh ngoai hang anh, ở đây được lược bỏ Để bắt đầu với việc triển khai mô-đun RAG (Retrieval-Augmented Generation), chúng ta cần tiến hành các bước chuẩn bị quan trọng. Đầu tiên là thiết lập kết nối tới cơ sở dữ liệu hoặc kho lưu trữ thông tin mà hệ thống sẽ sử dụng để tra cứu. Điều này có thể bao gồm việc tích hợp API hoặc kết nối trực tiếp tới một hệ thống lưu trữ đám mây. Tiếp theo, chúng ta sẽ tập trung vào việc cấu hình các tham số quan trọng cho quá trình tìm kiếm. Điều này bao gồm xác định phương pháp đánh giá tài liệu, thiết lập giới hạn số lượng kết quả trả về và tối ưu hóa các thông số liên quan đến độ chính xác và tốc độ xử lý. Một trong những yếu tố then chốt trong việc khởi tạo RAG module là đảm bảo rằng thuật toán tìm kiếm có khả năng hiểu ngữ cảnh sâu hơn từ dữ liệu đầu vào. Điều này đòi hỏi phải có sự kết hợp giữa các kỹ thuật xử lý ngôn ngữ tự nhiên tiên tiến và cơ chế học máy mạnh mẽ để đưa ra kết quả đáng tin cậy. Chúng tôi đã chuẩn bị sẵn mã nguồn để thực hiện các hoạt động tìm kiếm, nhưng do tính chất phức tạp của nó, phần này đã được tóm tắt và không đi chi tiết trong tài liệu hiện tại. Tuy nhiên, nếu bạn cần thêm thông tin cụ thể về mã nguồn, vui lòng liên hệ với đội ngũ hỗ trợ kỹ thuật để được hướng dẫn thêm.class
									 RAG
									(
									dspy
									.
									Module
									):
									
    def
									 __init__
									(
									self
									,
									 num_docs
									=
									5
									):
									
        self
									.
									num_docs
									 =
									 num_docs
									
        self
									.
									respond
									 =
									 dspy
									.
									ChainOfThought
									(
									'contextkeo 88, question -> response')
									

    def
									 forward
									(
									self
									,
									 question
									):
									
        context
									 =
									 search
									(
									question
									,
									 k
									=
									self
									.
									num_docs
									)
									
        return
									 self
									.
									respond
									(
									context
									=
									context
									,
									 question
									=
									question
									)
									

rag
									 =
									 RAG
									()
									
score_before_optimization
									 =
									 evaluate
									(
									rag
									)
									

# Phần 5: Khởi tạo 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 Teleprompterkeo 88, đóng vai trò như một tập hợp các chức năng cốt lõi được tích hợp sâu vào hệ thống. Với việc sử dụng dspy.MIPROv2, các nhà phát triển có thể dễ dàng quản lý các luồng nội dung, đảm bảo rằng mọi thông điệp đều được truyền tải chính xác và hiệu quả nhất. Quy trình này không chỉ giúp tối ưu hóa hiệu suất mà còn hỗ trợ trong việc điều chỉnh cấu hình để phù hợp với nhiều môi trường khác nhau. Teleprompter, khi kết hợp cùng dspy.MIPROv2, mang đến một công cụ mạnh mẽ cho bất kỳ ai cần xử lý nội dung phức tạp trong thời gian thực.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
									)
									
score_after_optimization
									 =
									 evaluate
									(
									optimized_rag
									)
									

								

Phân tích khung chương trình RAG

Khung chương trình RAG nói trên đại khái gồm năm phần.

Phần thứ nhấtbxh ngoai hang anh, khởi tạo LLMTrong một chương trình DSPy (hoặc một chương trình APE điển hình)keo 88, có ba khu vực chính thường sử dụng LLM (Mô hình Ngôn ngữ Đặt trước): 1. **Giai đoạn tiền xử lý dữ liệu**: Đây là nơi LLM được dùng để phân tích và làm sạch thông tin đầu vào, giúp chuẩn bị dữ liệu một cách hiệu quả nhất cho các giai đoạn tiếp theo. 2. **Giai đoạn ra quyết định**: Ở đây, LLM đóng vai trò như một công cụ tư duy logic, hỗ trợ đưa ra các lựa chọn chiến lược dựa trên dữ liệu đã được xử lý. 3. **Giai đoạn hậu xử lý kết quả**: Sau khi ra quyết định, LLM sẽ tham gia vào việc giải thích và tóm tắt kết quả, giúp người dùng dễ dàng hiểu và áp dụng những gì đã được thực hiện.

  • Bạn có thể tối ưu hóa chương trình bằng cách cải thiện mô hình ngôn ngữ lớn (LLM) mà nó đang sử dụng. Mô-đun chính sẽ gọi đến LLMbxh ngoai hang anh, và mỗi phân nhánh nhỏ hơn của Mô-đun cũng sẽ sử dụng LLM để thực hiện nhiệm vụ riêng của mình. Điều này đảm bảo rằng toàn bộ hệ thống hoạt động một cách hiệu quả và nhất quán.
  • (2) Công cụ LLM được sử dụng để đánh giá. Nói cách kháckeo 88, đó là mô hình LLM được gọi khi tính toán các chỉ số Metric hoặc thông qua việc sử dụng hà Công cụ này đóng vai trò quan trọng trong việc đảm bảo độ chính xác và hiệu quả trong quá trình đánh giá và phân tích dữ liệu.
  • (3) LLM được sử dụng bởi bộ tối ưu hóa. Đó là LLM được Teleprompter điều khiển.

Ba vị trí này có thể được chỉ định riêng biệt trong chương trình DSPy. Theo ví dụ mã nguồn trên99win club, chúng ta chỉ thấy việc khởi tạo một phiên bản LLM duy nhất, điều này đồng nghĩa với việc tất cả ba vị trí đều sử dụng cùng một phiên bản LLM này. Tuy nhiên, tùy thuộc vào nhu cầu cụ thể của bạn, bạn hoàn toàn có thể cấu hình để mỗi vị trí sử dụng một phiên bản LLM khác nhau, mang lại sự linh hoạt và hiệu quả cao hơn trong việc xử lý yêu cầu đa dạng.

Về các loại mô hình LLM được hỗ trợ bởi DSPykeo 88, hầu hết các mô hình phổ biến trên thị trường đều có thể tương thích, bao gồm các API của các công ty như OpenAI, Anthropic, Databricks, cũng như các mô hình LLM được triển khai riêng tư trong nội bộ doanh nghiệp. Ngoài ra, còn có cả các API từ mô hình của OpenAI được cung cấp thông qua nền tảng Azure của Microsoft, cho phép người dùng dễ dàng tích hợp và sử dụng theo nhu cầu.

Phần thứ haikeo 88, khởi tạo tập dữ liệuCó thể quan sát thấybxh ngoai hang anh, mã nguồn trên đã tải xuống một tập dữ liệu từ tệp ragqa_arena_tech_500.json và chia tập dữ liệu này thành bốn phần chính:

  • Tập dữ liệu đào tạo: trainsetbxh ngoai hang anh, bao gồm 50 ví dụ. Bộ tối ưu của DSPy sẽ trực tiếp học từ tập dữ liệu này. Hơn nữa, mỗi ví dụ trong trainset được thiết kế để cung cấp cho mô hình cái nhìn toàn diện về các mẫu khác nhau mà nó cần nhận biết trong quá trình học, từ đó cải thiện khả năng phân tích và phản ứng một cách hiệu quả.
  • Bộ kiểm tra: valsetkeo 88, bao gồm 100 ví dụ. Tối ưu hóa của DSPy sử dụng bộ kiểm tra này để theo dõi sự tiến triển trong quá trình học tập. Về cơ bản, trainset và valset là hai tham số đầu vào quan trọng cho bộ tối ưu Teleprompter của DSPy, giúp hệ thống tự điều chỉnh và cải thiện hiệu suất một cách thông minh. Điều này đóng vai trò như một công cụ giám sát giúp đảm bảo rằng mô hình không chỉ học tốt từ dữ liệu đào tạo mà còn có khả năng áp dụng kiến thức đó vào các tình huống mới một cách chính xác.
  • Bộ dữ liệu kiểm tra: testsetkeo 88, bao gồm 200 ví dụ (example). Bộ dữ liệu này được sử dụng để đánh giá toàn diện hiệu suất của chương trình cuối cùng trước khi bàn giao. Nó đóng vai trò quan trọng trong việc xác định xem chương trình có hoạt động ổn định và đáp ứng các yêu cầu kỹ thuật đã đặt ra hay không.
  • Tập phát triển: devsetkeo 88, bao gồm 150 ví dụ. Được sử dụng trong quá trình điều chỉnh hàng ngày để xem và phân tích dữ liệu. Nếu tài nguyên tập dữ liệu bị giới hạn, tập phát triển này có thể tái sử dụng dữ liệu từ tập huấn luyện. Tuy nhiên, ít nhất ba tập dữ liệu đầu tiên là bắt buộc.

Quá trình tối ưu hóa của chương trình DSPy có sự tương đồng đáng kể với quy trình huấn luyện mô hình trong học sâubxh ngoai hang anh, đặc biệt là trong cách sử dụng bộ dữ liệu. Tuy nhiên, khác biệt lớn nhất nằm ở yêu cầu về kích thước tập dữ liệu. Đối với các mô hình học sâu, thông thường tập huấn luyện cần lớn hơn tập kiểm định. Nhưng đối với bộ tối ưu hóa prompt của DSPy lại yêu cầu điều ngược lại. Theo tài liệu chính thức của DSPy, khi phân chia tập dữ liệu thành tập huấn luyện và tập kiểm định, tỷ lệ đề xuất được khuyến nghị là 20% cho tập huấn luyện và 80% cho tập kiểm định [2]. Điều này tạo ra một cách tiếp cận độc đáo so với các phương pháp truyền thống, giúp người dùng linh hoạt hơn trong việc tối ưu hóa hiệu suất của chương trình.

Đối với quy mô cụ thể của tập dữ liệu99win club, tài liệu chính thức của DSPy cũng đưa ra một số khuyến nghị cụ thể [3]:

  • Tập huấn luyện và tập xác minh nên có khoảng 30-300 ví dụ mỗi cái.
  • Tập kiểm tra và tập phát triển nên có khoảng 30-1000 ví dụ mỗi cái.

Để có cái nhìn trực quan hơn về tập dữ liệukeo 88, chúng tôi đã chọn mẫu một số ví dụ từ phần devset để xem xét chi tiết, cụ thể như sau:

Mẫu dữ liệu của tập devset

Bạn có thể nhận thấy rằng mỗi example đều có hai trường thông tin. Trường đầu tiên là "question" (câu hỏi)keo 88, sẽ được dùng làm dữ liệu đầu vào cho chương trình; trường thứ hai là "response" (phản hồi), đại diện cho đáp án mong đợi, giống như một nhãn đã được đánh dấu trước đó.

Phần thứ babxh ngoai hang anh, khởi tạo Metric và EvaluateNhư đã đề cập trước đókeo 88, việc xác định metric không phải là một nhiệm vụ đơn giản. Khung làm việc DSPy cung cấp cho bạn một số metric phổ biến để giúp quá trình này trở nên dễ dàng hơn. Những metric này được thiết kế đặc biệt nhằm hỗ trợ người dùng trong việc đo lường và đánh giá hiệu quả của các mô hình một cách chính xác và hiệu quả.

Trong đoạn mã trên99win club, chúng tôi đã sử dụng SemanticF1. Đây là một chỉ số đánh giá đo lường hiệu suất từ góc độ ngữ nghĩa, cụ thể là trung bình điều hòa giữa tỷ lệ (recall) và tỷ lệ chính xác (precision). Tỷ lệ giúp chúng ta hiểu được bao nhiêu phần trăm các đối tượng đích đã được phát hiện đúng, trong khi tỷ lệ chính xác cho biết bao nhiêu phần trăm kết quả nhận được là đúng.semantic F1score giúp cân bằng cả hai khía cạnh này để đưa ra một thước đo toàn diện hơn về hiệu quả của mô hình.

Lưu ý rằng công thức tính F1 ở đây áp dụng cho một example riêng lẻ. Để kiểm tra trực quankeo 88, chúng ta hãy tính giá trị F1 score của một example so với chính nó (theo lý thuyết, giá trị này sẽ là 1), cụ thể như sau:

Ví dụ về Điểm F1

OKbxh ngoai hang anh, điểm số này rất gần với 1.

Đối với đầu vào ở trên devset[6] Trong trường hợp này99win club, chúng ta sẽ sử dụng chương trình RAG đã thiết lập trước đó để dự đoán kết quả (được ký hiệu là pred). Sau đó, chúng ta sẽ tính toán điểm F1 giữa đáp án được đánh dấu và kết quả dự đoán. Cụ thể như sau:

Ví dụ về Điểm F1

Kết quả khoảng 0,53.

Tóm lạikeo 88, metric ở trên tính toán điểm F1 giữa câu trả lời mong đợi và câu trả lời được dự đoán bởi mô hình cho một example đơn lẻ. Mặt khác, hàm Evaluate được sử dụng để tính điểm F1 riêng lẻ cho từng example trong tập dữ liệu kiểm tra, sau đó tổng hợp kết quả cuối cùng bằng cách tính giá trị trung bình. Điều quan trọng cần lưu ý là khi khởi tạo hàm Evaluate, tập dữ liệu testset được sử dụng hoàn toàn phù hợp với cách chúng ta đã mô tả trước đây về việc sử dụng tập dữ liệu, đảm bảo tính nhất quán trong toàn bộ quá trình phân tích.

LLM được sử dụng cho đánh giá

DSPy cũng đã định nghĩa trước một loạt metric phổ biếnbxh ngoai hang anh, chẳng hạn như:

								
									
										from
									 dspy.evaluate.metrics
									 import
									 answer_exact_match
									
from
									 dspy.evaluate.metrics
									 import
									 answer_passage_match
									
from
									 dspy.evaluate
									 import
									 SemanticF1
									
from
									 dspy.evaluate
									 import
									 AnswerCorrectness
									
from
									 dspy.evaluate
									 import
									 AnswerFaithfulness
									

								

Bạn có thể đoán ý nghĩa của từng metric thông qua tên của nó. Tuy nhiênbxh ngoai hang anh, nhìn chung, hiện tại DSPy chưa thực sự tối ưu hóa việc đóng gói phần này. Sự tương thích giữa các metric và các Teleprompter bên trong DSPy cũng chưa được tốt lắm. Trong thực tế, rất có khả năng bạn sẽ cần tự viết lại metric của riêng mình, vì vậy hãy chú ý nhiều đến khía cạnh này.

Phần thứ tư99win club, khởi tạo module RAG . Mã trên định nghĩa một cái tên gọi là RAG Bạn có thể tạo thêm một module mới dựa trên nội dung gốcbxh ngoai hang anh, đây chính là chương trình RAG mà chúng ta đang lên kế hoạch để cải tiến và tối ưu hóa. Module RAG này bao gồm một sub-module nhỏ bên trong, tên gọi của nó là respond keo 88, nó sử dụng cách tiếp cận CoT để gọi LLM và nhậ

DSPy's Module lấy cảm hứng từ khái niệm nn.Module trong PyTorch để tạo ra một lớp trừu tượng hóakeo 88, cho phép bạn khởi tạo các thành phần con (submodule) bằng cách gán giá trị trực tiếp vào thuộc tính trong quá trình khởi tạo. Đặc biệt hơn, một instance của Module có thể được gọi như một hàm, mang lại sự linh hoạt và tiện lợi khi sử dụng trong quá trình xây dựng mô hình. Điều này không chỉ giúp người dùng dễ dàng quản lý cấu trúc mô hình mà còn tối ưu hóa khả năng tái sử dụng mã nguồn một cách hiệu quả.

Phần thứ năm99win club, khởi tạo Teleprompter và hoàn thành biên dịch/tối ưu hóa

Phần này là cốt lõi của DSPy. DSPy cung cấp nhiều trình tối ưu hóabxh ngoai hang anh, trong đó MIPROv2 là một trong những cái tên quan trọng nhất. Thuật toán cụ thể của MIPROv2 được mô tả chi tiết trong bài báo [4]. Việc thực hiện thuật toán này được chia thành ba bước thực thi lớn: 1. **Bước chuẩn bị dữ liệu**: Trước khi bắt đầu quá trình tối ưu hóa, hệ thống cần chuẩn bị và xử lý dữ liệu đầu vào. Điều này bao gồm việc kiểm tra tính hợp lệ của các tham số và cấu hình ban đầu để đảm bảo mọi thứ sẵn sàng cho giai đoạn tiếp theo. 2. **Giai đoạn tối ưu hóa chính**: Đây là phần quan trọng nhất, nơi thuật toán thực sự được triển khai. Hệ thống sẽ chạy các phép tính toán phức tạp để tìm kiếm giá trị tối ưu dựa trên các tiêu chí đã được định nghĩa trước đó. 3. **Bước đánh giá và tinh chỉnh**: Sau khi hoàn thành giai đoạn tối ưu hóa chính, hệ thống sẽ phân tích kết quả và thực hiện các điều chỉnh cuối cùng để cải thiện hiệu suất tổng thể. Điều này giúp đảm bảo rằng thuật toán hoạt động ổn định và đạt hiệu quả cao nhất có thể. Các bước này phối hợp chặt chẽ với nhau để tạo nên một quy trình tối ưu hóa mạnh mẽ và đáng tin cậ

  • Bước 1: Dựa trên phương pháp Bootstrapkeo 88, tạo ra hoặc lựa chọn tập hợp các ứng viên cho tập ví dụ few-shot. Trong quá trình này, chúng ta có thể sử dụng chiến lược sàng lọc dựa trên độ tương đồng nội bộ để đảm bảo rằng các ví dụ được chọn có sự đa dạng cao và phù hợp với mục tiêu của bài toán. Đồng thời, bằng cách áp dụng một số thuật toán tối ưu hóa, chúng ta có thể tăng cường chất lượng của tập ứng viên này, từ đó cung cấp nguồn dữ liệu phong phú hơn cho việc đào tạo mô hình sau này.
  • Bước 2: Tạo tập hợp ứng viê
  • Bước 3: Từ tập hợp các ứng cử viênbxh ngoai hang anh, chọn ra cặp kết hợp few-shot và instruction tối ưu nhất.

Các bước cụ thể để thực hiện này khá phức tạpbxh ngoai hang anh, chúng ta sẽ giới thiệu trong phần tiếp theo.

Đoạn mã ở đây cần chú ý rằngkeo 88, khi gọi tp.compile bxh ngoai hang anh, hai tập dữ liệu truyền vào là trainset và valset. Tại đây đã sử dụng compile từbxh ngoai hang anh, thực chất quá trình "biên dịch" này có nhiều điểm tương đồng với quá trình huấn luyện mô hình.

Tiếp theo

Đối với mã code ở trên99win club, người đọc cẩn thận có thể sẽ đặt ra một câu hỏi: Tại sao lại không thấy bất kỳ dấu hiệu nào của việc gọ Hơn nữa, meta-prompt quan trọng mà chúng ta đã đề cập trước đó cũng không xuất hiện trong mã. Thực tế, điều này liên quan đến cách thiết kế cơ chế Signature của DSPy. Trong hệ thống này, các Signature không chỉ định rõ cách hoạt động của mỗi thành phần, mà còn quản lý cách các phần tử như prompt và meta-prompt được tích hợp và xử lý. Điều này giúp mã trở nên gọn gàng hơn và dễ bảo trì hơn, nhưng đồng thời cũng có thể khiến người dùng cảm thấy thiếu hụt thông tin nếu họ chưa hiểu rõ về cách thức hoạt động bên trong. Chính vì vậy, các tác vụ như tạo và truyền meta-prompt thường được thực hiện ngay từ giai đoạn khởi tạo hoặc cấu hình của hệ thống, thay vì trực tiếp hiển thị trong mã chính.

Do giới hạn về chiều dàibxh ngoai hang anh, bài viết này chỉ dừng ở đây. Trong bài viết tiếp theo, chúng ta sẽ tiếp tục thảo luận hai vấn đề còn lại:

  • Quá trình từ Signature đến Prompt.
  • Thực hiện cụ thể của MIPROv2 (ba bước).

(kết thúc phần chính)

Tài liệu tham khảo:

Các bài viết được chọn lọc khác


Bài viết gốckeo 88, vui lòng ghi rõ nguồn và bao gồm mã QR bên dưới! Nếu không, từ chối tái bản!
Liên kết bài viết: /vdfmseef.html
Hãy theo dõi tài khoản Weibo cá nhân của tôi: Tìm kiếm tên "Trương Tiết Lệ" trên Weibo.
Tài khoản WeChat của tôi: tielei-blog (Trương Tiết Lệ)
Bài trước: Giải thích một chút: Phân tích nguyên lý xác suất đằng sau LLM
Bài sau: Nói chuyện về DSPy và kỹ thuật tự động hóa gợi ý (phần giữa)

Bài viết mới nhất