Code Velocity
დეველოპერის ხელსაწყოები

გაშვებადი Markdown: დოკუმენტაციის ტესტირების რევოლუცია Hugging Face-თან ერთად

·8 წუთი კითხვა·Hugging Face·ორიგინალი წყარო
გაზიარება
Hugging Face-ის ლოგო კოდის ფრაგმენტებით და 'runnable' ტეგით, რაც წარმოადგენს გაშვებადი Markdown მაგალითების კონცეფციას.

დოკუმენტაცია ემსახურება კრიტიკულ ხიდს დეველოპერებსა და მათ ხელსაწყოებს შორის, მაგრამ მისი სანდოობა ხშირად ძირს უთხრის გავრცელებულ პრობლემას: დოკუმენტაციის დრიფტს. პროგრამული უზრუნველყოფის განვითარებასთან ერთად, დოკუმენტაციაში მოყვანილი კოდის მაგალითები შეიძლება ჩუმად დაზიანდეს, რაც იწვევს უკმაყოფილებას, დროის დაკარგვას და ნდობის ეროზიას. Hugging Face, AI ინოვაციის ლიდერი, ამ გამოწვევას პირდაპირ უმკლავდება თავისი doc-builder პროექტით, რომელიც წარმოგიდგენთ გაშვებად Markdown ბლოკებს, რაც უზრუნველყოფს, რომ დოკუმენტაციის მაგალითები იყოს არა მხოლოდ საილუსტრაციო, არამედ მკაცრად ტესტირებული. ეს თანამედროვე მიდგომა ხელახლა განსაზღვრავს, თუ როგორ ვუდგებით შესრულებად დოკუმენტაციას, აერთიანებს რა კარგი დოკუმენტაციის სიცხადეს უწყვეტი ტესტირების სიმტკიცესთან.

გამოწვევა: დოკუმენტაციისა და კოდის მთლიანობის დაკავშირება

გაშვებადი დოკუმენტაციის უკან მდგარი ძირითადი ფილოსოფია ახალი არ არის. ათწლეულების განმავლობაში, Python-ის საზოგადოება მხარს უჭერდა დოკუმენტაციაში ისეთ მაგალითებს, რომელთა კოპირება, ჩასმა და უნაკლოდ გაშვება მომხმარებლებს შეეძლოთ. თუმცა, ამ იდეალის შენარჩუნება დიდ, სწრაფად განვითარებად პროექტებში, როგორიცაა Hugging Face-ის Transformers ბიბლიოთეკა, უზარმაზარი ამოცანაა. ხელით ვალიდაცია არაპრაქტიკულია, და ტრადიციული მეთოდები ხშირად აიძულებს კომპრომისს მკაფიო დოკუმენტაციასა და ეფექტურ ტესტირებას შორის.

პრობლემა მოთხოვნების ფუნდამენტური განსხვავებებიდან გამომდინარეობს:

  • დოკუმენტაციის მაგალითები უპირატესობას ანიჭებს სიმოკლეს, წაკითხვადობას და სწავლების ფოკუსს. ისინი მიზნად ისახავს იყოს „ხმაურისგან“ თავისუფალი.
  • ტესტები მოითხოვს ასერტაციებს, დაყენება/წაშლას, ფიქსტურებს, მოკინგს და დებაგინგის შესაძლებლობებს. ისინი უპირატესობას ანიჭებენ სიმტკიცესა და დაფარვას.

როდესაც ეს ორი ასპექტი ერთ ფორმატშია იძულებით მოქცეული, ერთი ხშირად ზარალდება. Hugging Face-ის doc-builder მიზნად ისახავს ამ დაძაბულობის მოგვარებას დოკუმენტაციის უცვლელად შენარჩუნებით, ხოლო მისი ძირითადი მაგალითების მკაცრი ვალიდაციით, რაც უზრუნველყოფს, რომ ყოველი ფრაგმენტი, რომელსაც მომხმარებლები ხვდებიან, იყოს გადამოწმებადი სიმართლე და არა მხოლოდ მისწრაფება. ეს გადამწყვეტია სანდოობის შესანარჩუნებლად და დეველოპერების ადაპტაციის დასაჩქარებლად ხელოვნური ინტელექტის სწრაფ სამყაროში.

doctest-ის მემკვიდრეობა: ადრეული ინოვაციები და განვითარებადი საჭიროებები

შესრულებადი დოკუმენტაციის კონცეფციამ ადრეული აღიარება მოიპოვა Python-ში doctest-ის შემოღებით Python 2.1-ში (2001). ტიმ პიტერსის მიერ შექმნილი doctest იყო ელეგანტური გადაწყვეტა: ის აანალიზებდა დოკუმენტაციის მაგალითებს, რომლებიც ფორმატირებული იყო ინტერაქტიული Python ინტერპრეტატორის სესიების მსგავსად (>>> add(2, 3)\n5) და ამოწმებდა, რომ გამოსავალი შეესაბამებოდა მოლოდინებს. ამ ინოვაციამ დოკუმენტაციის მაგალითები ავტომატურ რეგრესიულ ტესტებად აქცია, რაც კოდის ხარისხისთვის მნიშვნელოვანი ნაბიჯი იყო წინ.

doctest განსაკუთრებით კარგად შეეფერებოდა Python-ს, ენას, რომელიც ინტერაქტიულ კვლევას უწყობდა ხელს. მცირე პროექტებისთვის და მარტივი API-ებისთვის, ის გამონაკლისად კარგად მუშაობდა, უზრუნველყოფდა მარტივ, მაგრამ მძლავრ მექანიზმს საბაზისო მაგალითების ფუნქციონალურობის შესანარჩუნებლად. მან განასახიერა „აჩვენე და არა უბრალოდ თქვი“ სული პროგრამული უზრუნველყოფის განვითარებაში, აქცევს რა დოკუმენტაციას სატესტო ნაკრების აქტიურ ნაწილად.

Hugging Face-ის თანამედროვე გადაწყვეტა: გაშვებადი Markdown ბლოკები

დიდმასშტაბიანი, კომპლექსური პროექტებისთვის ძველი მიდგომების შეზღუდვების გათვალისწინებით, Hugging Face-ის doc-builder პროექტი წარმოგიდგენთ გაშვებადი დოკუმენტაციის დახვეწილ ვერსიას. ტესტების დოკუმენტაციის სინტაქსში ჩაშენების ნაცვლად, ის დოკუმენტაციის ფრაგმენტებს განიხილავს, როგორც ჩვეულებრივ Python კოდს, რომელიც Markdown-შია მოთავსებული. ეს ეფექტურად აქცევს Markdown-ს თხელ სატესტო კონტეინერად, რაც წარმოდგენას ტესტირების მეთოდოლოგიისგან განცალკევებს.

გაშვებადი ბლოკი Markdown-ში ასე გამოიყურება:

```py runnable:quickstart
from transformers import pipeline

pipe = pipeline("sentiment-analysis")
result = pipe("I love runnable docs!")

if not result:  # doc-builder: hide
    raise ValueError("pipeline returned no result")

print(result[0]["label"])
assert result[0]["score"] > 0.5  # doc-builder: ignore-bare-assert
```

რენდერის დროს, ეს ბლოკი სტანდარტულ კოდის მაგალითად ჩნდება. ტესტირების დროს, თუმცა, ის შესრულებულია, როგორც ჩვეულებრივი Python კოდი. ეს ორმაგი ბუნება უზრუნველყოფს, რომ დოკუმენტაცია რჩება სუფთა მკითხველებისთვის, ხოლო დეველოპერებისთვის უზრუნველყოფს მძლავრ, ტესტირებად მაგალითებს. ეს მიდგომა განსაკუთრებით ეფექტურია ისეთ რთულ დომენებში, როგორიცაა AI, სადაც მაგალითები ხშირად მოიცავს მოდელის კომპლექსურ ჩატვირთვასა და ინფერენსის ნაბიჯებს.

უწყვეტი ინტეგრაცია pytest-თან და გაფართოებულ ფუნქციებთან

Hugging Face-ის მიდგომის მთავარი განმასხვავებელი მახასიათებელია მისი უწყვეტი ინტეგრაცია თანამედროვე ტესტირების ფრეიმვორკებთან, განსაკუთრებით pytest-თან. hf-doc-builder-ის დაინსტალირების შემთხვევაში, pytest-ს შეუძლია ავტომატურად აღმოაჩინოს და შეასრულოს გაშვებადი ბლოკები Markdown ფაილებში, განიხილოს რა თითოეული ბლოკი, როგორც სტანდარტული სატესტო ელემენტი. ეს ნიშნავს, რომ დოკუმენტაციის მაგალითებს შეუძლიათ სრულად მიიღონ მონაწილეობა პროექტის არსებულ სატესტო ინფრასტრუქტურაში, გამოიყენონ რა pytest-ის მძლავრი ფუნქციები, როგორიცაა ასერტაციები, ფიქსტურები, დეკორატორები და ყოვლისმომცველი რეპორტინგი.

შესრულებადი დოკუმენტაციის ევოლუცია: doctest vs. doc-builder

მახასიათებელიdoctest (ტრადიციული)doc-builder (თანამედროვე გაშვებადი Markdown)
ტესტირების მიდგომატესტებს ათავსებს ინტერპრეტატორის სესიებად დოკუმენტაციაშიდოკუმენტაციის ფრაგმენტებს განიხილავს, როგორც ჩვეულებრივ Python კოდს ტესტირებისთვის
ინტეგრაციასტანდარტული ბიბლიოთეკის მოდულიpytest პლაგინი უწყვეტი ინტეგრაციისთვის
ტესტის სინტაქსი>>> მოთხოვნები, მოსალოდნელი გამოსავლის შედარებასტანდარტული Python კოდი, pytest ასერტაციები
მოქნილობაშეზღუდული, მყიფე გამოსავლის შედარებამაღალი, მხარს უჭერს კომპლექსურ ტესტებს, დეკორატორებს, დებაგინგს
დოკუმენტაციის სისუფთავეშეიძლება აბინძურებდეს დოკუმენტაციას ტესტის მექანიკითინარჩუნებს სუფთა დოკუმენტაციას დამალული დირექტივებით
დებაგინგისტრიქონების შედარება, ნაკლებად პირდაპირი ინსპექციასტანდარტული Python დებაგინგი, სრული ტრეისბეკები
დაყენება/წაშლაშეუძლია ხმაურის დამატება მაგალითებზეეფექტურად მართავს კონტექსტს გაგრძელების ბლოკებით
ჭეშმარიტების წყაროდოკუმენტაციის ფორმატი და ჩაშენებული ტესტებიMarkdown წყარო, ტესტირებული სტანდარტული Python შესრულების გზით

doc-builder ასევე წარმოგიდგენთ გაგრძელების ბლოკებს, მრავალსაფეხურიანი გაკვეთილების კრიტიკულ ფუნქციას. ეს ავტორებს საშუალებას აძლევს, გაყონ მაგალითი მრავალ ხილულ ფრაგმენტად, მაგალითად runnable:test_basic, რასაც მოჰყვება runnable:test_basic:2. რაც მთავარია, ეს ბლოკები იზიარებენ ერთსა და იმავე შესრულების კონტექსტს ტესტირების დროს, რაც უზრუნველყოფს ინსტრუქციულ ნაკადს, ყველა კოდის ერთ გრძელ ბლოკში იძულებით მოქცევის გარეშე. ეს მოქნილობა სასიცოცხლოდ მნიშვნელოვანია მომხმარებლებისთვის AI მოდელის რთული გამოყენების ან მონაცემთა დამუშავების პაიპლაინების გავლაში.

მაგალითად, AI აგენტის განვითარების სამუშაო პროცესი შეიძლება მოიცავდეს რამდენიმე ნაბიჯს: აგენტის ხელსაწყოების განსაზღვრას, აგენტის ინიციალიზაციას და შემდეგ შეკითხვის გაშვებას. გაგრძელების ბლოკები საშუალებას აძლევს თითოეულ ამ ნაბიჯს, ნათლად იყოს წარმოდგენილი ცალკეულ დოკუმენტაციის სექციებში, ხოლო შესრულდეს, როგორც ერთი, თანმიმდევრული სატესტო თანმიმდევრობა, მსგავსად იმისა, თუ როგორ ხდება მოწინავე აგენტური სამუშაო ნაკადების აგენტური AI-ის ოპერაციონალიზაცია: ნაწილი 1.

სუფთა დოკუმენტაციის შენარჩუნება მძლავრი ტესტირების უზრუნველყოფისას

doc-builder-ის ერთ-ერთი ყველაზე ელეგანტური გადაწყვეტა არის მისი უნარი, შეინარჩუნოს რენდერირებული დოკუმენტაცია სუფთა, მაშინაც კი, როდესაც Markdown წყარო შეიცავს ტესტ-სპეციფიკურ დირექტივებს. დეველოპერებს შეუძლიათ ჩააშენონ კომენტარები, როგორიცაა # doc-builder: hide შესრულებადი ხაზებისთვის, რომლებიც არ უნდა გამოჩნდეს დოკუმენტაციაში, ან # doc-builder: ignore-bare-assert ასერტაციებისთვის, რომლებიც ტესტის ნაწილია, მაგრამ რომელთა კომენტარი არ უნდა იყოს რენდერირებული. ანალოგიურად, pytest დეკორატორები (# pytest-decorator: ...) იშლება რენდერის დროს.

ეს უზრუნველყოფს, რომ დოკუმენტაცია რჩება ფოკუსირებული სწავლებასა და სიცხადეზე, ტესტირების შაბლონებით გადატვირთვის გარეშე. მომხმარებელი ხედავს მხოლოდ შესაბამის კოდს, ხოლო ძირითადი სისტემა უზრუნველყოფს მის ფუნქციონალურობას. ეს ბალანსი კრიტიკულია დეველოპერის ხელსაწყოების დოკუმენტაციისთვის, სადაც როგორც ესთეტიკური მიმზიდველობა, ასევე აბსოლუტური სისწორე უმნიშვნელოვანესია.

გავლენა დიდმასშტაბიან AI პროექტებზე და მის ფარგლებს გარეთ

მასიური რეპოზიტორებისთვის, როგორიცაა Hugging Face-ის Transformers, ასობით დოკუმენტაციის გვერდითა და ათასობით მაგალითით, ეს ფუნქცია ტრანსფორმაციულია. ის ავტომატიზირებს დოკუმენტაციის დრიფტის პრევენციას, პრობლემას, რომელიც სხვაგვარად მოითხოვდა უზარმაზარ ხელით შრომას ან გამოიწვევდა გატეხილი მაგალითების მუდმივ ნაკადს. გაშვებადი დოკუმენტაცია ხელს უწყობს დოკუმენტაციისა და კოდბაზის სინქრონიზაციას, ინარჩუნებს რა სანდოობას ისეთ მასშტაბზე, სადაც ხელით განხილვა უბრალოდ არარეალურია. ეს შეესაბამება AI საზოგადოების უფრო ფართო ძალისხმევას, რომ მკაცრად AI აგენტების შეფასება წარმოებისთვის და უზრუნველყოს სანდოობა.

შესრულებადი დოკუმენტაციის pytest-ისა და დახვეწილი CI/CD პაიპლაინების თანამედროვე ეპოქაში შემოტანით, Hugging Face აჩვენებს მძლავრ ერთგულებას დეველოპერის გამოცდილებისა და კოდის ხარისხის მიმართ. მიზანი იგივე რჩება, რაც ოც წელზე მეტი ხნის წინ იყო: დოკუმენტაციის მაგალითებმა უნდა იმუშაოს. მაგრამ ახლა, ისინი არა მხოლოდ აჩვენებენ, თუ როგორ უნდა იმუშაოს კოდმა, არამედ უწყვეტად ამტკიცებენ, რომ ის მუშაობს, რაც ხელს უწყობს უფრო სანდო და სანდო ეკოსისტემის შექმნას AI განვითარებისთვის.

ორიგინალი წყარო

https://huggingface.co/blog/huggingface/runnable-examples

ხშირად დასმული კითხვები

What is the core problem Hugging Face's runnable Markdown addresses?
Hugging Face's runnable Markdown addresses the pervasive problem of 'documentation drift,' where code examples in documentation become outdated and silently break as libraries and APIs evolve. This leads to user frustration and diminishes the credibility of the documentation. By making documentation examples runnable and testable, the doc-builder ensures that these snippets are continuously validated against the codebase, guaranteeing that they always work as advertised. This proactive approach prevents broken examples, enhances user trust, and improves the overall developer experience by providing reliable resources.
How does runnable Markdown differ from Python's traditional `doctest` module?
While both `doctest` and runnable Markdown aim for executable documentation, they differ significantly in their approach. `doctest` embeds tests directly into documentation syntax, requiring examples to mirror interactive interpreter sessions with expected output. This often leads to documentation being cluttered with test mechanics. Hugging Face's runnable Markdown, in contrast, treats documentation snippets as normal Python code living within Markdown files. It integrates seamlessly with modern testing frameworks like `pytest`, allowing for complex assertions, debugging, and standard test infrastructure. This separation of concerns ensures documentation remains clean and readable, while testing remains powerful and flexible, avoiding the limitations of `doctest`'s brittle output matching and verbose setup/teardown.
What are 'continuation blocks' in Hugging Face's `doc-builder`?
Continuation blocks are a powerful feature in Hugging Face's `doc-builder` that allow authors to split complex code examples or tutorials across multiple visible Markdown snippets while maintaining a shared execution context during testing. This means that a setup defined in one runnable block can be reused and built upon in a subsequent block, without forcing the documentation to present everything as one long, monolithic code fence. For example, `runnable:test_basic` can define initial variables, and `runnable:test_basic:2` can then use those variables. This enhances readability and instructional flow in documentation, making it easier to present multi-step processes without sacrificing the integrity of the underlying testable code.
How does `doc-builder` integrate with existing testing frameworks like `pytest`?
Hugging Face's `doc-builder` integrates natively with `pytest`, transforming runnable Markdown blocks into standard `pytest` test items. With `hf-doc-builder` installed, `pytest` automatically discovers and executes these blocks within Markdown files. This integration means that documentation examples can leverage the full power of `pytest`, including its assertion mechanisms, fixtures, decorators, and debugging tools. Failures appear as normal test failures with comprehensive tracebacks, allowing developers to debug effectively. This approach avoids the need for a special-purpose testing mini-language, embedding documentation tests directly into the project's existing, robust test infrastructure.
How does `doc-builder` ensure documentation remains clean despite embedded test logic?
A key design principle of `doc-builder` is to prevent test mechanics from polluting the user-facing documentation. Authors can embed test-only directives, such as `# pytest-decorator: transformers.testing_utils.slow` or `# doc-builder: hide` for lines that should be executable but not displayed, directly within the Markdown source. When the documentation is rendered, `doc-builder` intelligently strips these directives and comments, presenting a clean, readable code snippet to the user. This allows developers to write comprehensive tests alongside their examples without compromising the clarity and brevity expected of good documentation, maintaining a clear separation between the source code for testing and the rendered content for users.
What are the benefits of runnable documentation for large AI projects like Hugging Face Transformers?
For large AI projects such as Hugging Face Transformers, which involve extensive documentation and thousands of code examples, runnable documentation offers immense benefits. It drastically reduces 'documentation drift' by continuously validating examples against the evolving codebase, ensuring they remain accurate and functional. This prevents user frustration caused by broken examples and builds trust in the documentation's reliability. By integrating with `pytest`, it allows these projects to manage documentation tests within their existing CI/CD pipelines, making manual review of examples unnecessary at scale. This automated validation is crucial for maintaining the quality and usability of documentation in rapidly developing and complex software ecosystems.
Can runnable Markdown be adopted by other projects outside of Hugging Face?
Yes, the principles and mechanisms behind Hugging Face's runnable Markdown, particularly its integration with standard Python testing tools like `pytest` and its focus on separating testing logic from displayed documentation, are highly applicable and beneficial for any software project. While the `doc-builder` itself is specific to Hugging Face, the underlying ideas represent a best practice in developer tools. Other projects can implement similar systems using existing tools or adapt `doc-builder`'s concepts to ensure their documentation examples are continuously tested and reliable. This approach is a general solution to a common problem across the software development landscape, making documentation more robust and trustworthy.

იყავით ინფორმირებული

მიიღეთ უახლესი AI სიახლეები ელფოსტაზე.

გაზიარება