- การบูรณาการอย่างต่อเนื่องสำหรับแอพพลิเคชั่นที่ขับเคลื่อนด้วย LLM ???
BenchLLM เป็นไลบรารีโอเพ่นซอร์สที่ใช้ Python ซึ่งปรับปรุงการทดสอบ Large Language Models (LLM) และแอปพลิเคชันที่ขับเคลื่อนด้วย AI โดยจะวัดความแม่นยำของโมเดล ตัวแทน หรือเครือข่ายของคุณโดยตรวจสอบการตอบสนองต่อการทดสอบผ่าน LLM จำนวนเท่าใดก็ได้
BenchLLM ใช้งานอย่างแข็งขันที่ V7 เพื่อปรับปรุงแอปพลิเคชัน LLM ของเรา และตอนนี้เป็นโอเพ่นซอร์สภายใต้ใบอนุญาต MIT เพื่อแบ่งปันกับชุมชนในวงกว้าง
ใช้ BenchLLM เพื่อ:
หมายเหตุ: BenchLLM อยู่ในช่วงเริ่มต้นของการพัฒนา และอาจมีการเปลี่ยนแปลงอย่างรวดเร็ว สำหรับการรายงานจุดบกพร่อง คำขอคุณสมบัติ หรือการสนับสนุน โปรดเปิดปัญหาหรือส่งคำขอดึง (PR) บนหน้า GitHub ของเรา
BenchLLM ใช้วิธีการสองขั้นตอนที่แตกต่างกันในการตรวจสอบโมเดลการเรียนรู้ของเครื่องของคุณ:
การทดสอบ : ขั้นตอนนี้เกี่ยวข้องกับการเรียกใช้โค้ดของคุณกับการตอบสนองที่คาดหวังจำนวนเท่าใดก็ได้ และบันทึกการคาดการณ์ที่เกิดจากแบบจำลองของคุณ โดยไม่มีการตัดสินหรือการเปรียบเทียบในทันที
การประเมิน : การคาดการณ์ที่บันทึกไว้จะถูกเปรียบเทียบกับผลลัพธ์ที่คาดหวังโดยใช้ LLM เพื่อตรวจสอบความคล้ายคลึงกันของข้อเท็จจริง (หรือเลือกด้วยตนเอง) รายงานการเปรียบเทียบโดยละเอียด รวมถึงสถานะผ่าน/ไม่ผ่าน และตัวชี้วัดอื่นๆ จะถูกสร้างขึ้น
การแยกตามระเบียบวิธีนี้ให้มุมมองที่ครอบคลุมเกี่ยวกับประสิทธิภาพของแบบจำลองของคุณ และช่วยให้สามารถควบคุมและปรับแต่งแต่ละขั้นตอนได้ดียิ่งขึ้น
ในการติดตั้ง BenchLLM เราใช้ pip
pip install benchllm
เริ่มต้นด้วยการนำเข้าไลบรารีและใช้มัณฑนากร @benchllm.test เพื่อทำเครื่องหมายฟังก์ชันที่คุณต้องการทดสอบ:
import benchllm
# Your custom model implementation
def run_my_model ( input ):
# Your model's logic goes here.
return some_result
@ benchllm . test ( suite = "/path/to/test/suite" ) # If the tests are in the same directory, just use @benchllm.test.
def invoke_model ( input : str ):
return run_my_model ( input )
ขั้นต่อไป เตรียมการทดสอบของคุณ ไฟล์เหล่านี้เป็นไฟล์ YAML/JSON ที่มีโครงสร้างดังนี้:
input : What's 1+1? Be very terse, only numeric output
expected :
- 2
- 2.0
ในตัวอย่างข้างต้น input
คือแบบสอบถามหรือคำสั่งที่โมเดลของคุณจะประมวลผล และ expected
จะมีคำตอบที่เป็นไปได้ที่โมเดลของคุณควรส่งคืน สิ่งสำคัญที่ควรทราบคือ input
อาจเป็น str
แบบธรรมดาหรือพจนานุกรมแบบซ้อนที่ซับซ้อนกว่าก็ได้ BenchLLM จะแยกประเภทของอาร์กิวเมนต์ input
ในโค้ด Python และโหลดฟิลด์ input
จากไฟล์ YAML ตามลำดับ
ตามค่าเริ่มต้น BenchLLM จะใช้โมเดล GPT-3 ของ OpenAI สำหรับผู้ประเมิน semantic
สิ่งนี้จำเป็นต้องตั้งค่าตัวแปรสภาพแวดล้อม OPENAI_API_KEY
หากคุณไม่ต้องการใช้ตัวประเมินเริ่มต้นนี้ คุณสามารถระบุตัวประเมินอื่นได้ (จะกล่าวถึงในรายละเอียดเพิ่มเติมด้านล่าง):
export OPENAI_API_KEY= ' your-api-key '
แทนที่ 'your-api-key' ด้วยคีย์ OpenAI API จริงของคุณ
หากต้องการเริ่มต้นการทดสอบ ให้ใช้คำสั่ง bench run
:
$ bench run
ตามค่าเริ่มต้น คำสั่ง bench run จะค้นหาไฟล์ Python ที่ใช้งาน @test มัณฑนากรในไดเร็กทอรีปัจจุบัน หากต้องการกำหนดเป้าหมายไฟล์หรือโฟลเดอร์เฉพาะ ให้ระบุโดยตรง:
$ bench run path/to/my/file.py or/path/to/folder/with/files
พารามิเตอร์ --retry-count
ช่วยให้ BenchLLM ทำการทดสอบได้หลายครั้ง ซึ่งมีประโยชน์สำหรับโมเดลที่อาจมีความแปรปรวนในเอาต์พุต:
$ bench run --retry-count 5
BenchLLM มีวิธีการประเมินหลายวิธีเพื่อพิจารณาว่าการทำนายตรงกับค่าที่คาดหวังของกรณีทดสอบหรือไม่ คุณสามารถใช้พารามิเตอร์ --evaluator
เพื่อระบุวิธีการประเมินผล:
มีหลายวิธีในการประเมินว่าการทำนายฟังก์ชันทดสอบตรงกับค่าที่คาดหวังของกรณีทดสอบหรือไม่ ตามค่าเริ่มต้น GPT-3 ใช้เพื่อเปรียบเทียบเอาต์พุต คุณสามารถใช้ --evaluator
เพื่อใช้วิธีการอื่น
semantic
ตรวจสอบความคล้ายคลึงกันทางความหมายโดยใช้โมเดลภาษา เช่น GPT-3, GPT-3.5 หรือ GPT-4 ( --model
parameter) โปรดทราบว่าสำหรับผู้ประเมินนี้ คุณต้องตั้งค่าตัวแปรสภาพแวดล้อม OPENAI_API_KEY
embedding
ใช้ระยะห่างโคไซน์ระหว่างเวกเตอร์ที่ฝัง โปรดทราบว่าสำหรับผู้ประเมินนี้ คุณต้องตั้งค่าตัวแปรสภาพแวดล้อม OPENAI_API_KEY
string-match
ตรวจสอบว่าสตริงตรงกันหรือไม่ (ไม่คำนึงถึงตัวพิมพ์เล็กและใหญ่)interactive
ผู้ใช้ยอมรับหรือไม่ผ่านการทดสอบในเทอร์มินัลด้วยตนเองweb
ใช้ pywebio สำหรับเว็บอินเตอร์เฟสท้องถิ่นแบบธรรมดา ผู้ประเมินแบบไม่โต้ตอบยังสนับสนุน --workers N
เพื่อดำเนินการประเมินแบบคู่ขนาน
$ bench run --evaluator string-match --workers 5
เพื่อเร่งกระบวนการประเมินผล BenchLLM จะใช้แคช หากมีการประเมินคู่ (การคาดการณ์ คาดการณ์) ในอดีตและใช้แคช ผลลัพธ์ของการประเมินจะถูกบันทึกไว้สำหรับการประเมินในอนาคต แคชมีหลายประเภท:
memory
แคชเฉพาะค่าเอาต์พุตระหว่างการทำงานปัจจุบัน สิ่งนี้มีประโยชน์อย่างยิ่งเมื่อรันด้วย --retry-count N
file
เก็บแคชเมื่อสิ้นสุดการรันเป็นไฟล์ JSON ใน output/cache.json นี่เป็นพฤติกรรมเริ่มต้นnone
ไม่ได้ใช้แคชใด ๆ $ bench run examples --cache memory
เมื่อทำงานเกี่ยวกับการพัฒนาเชนหรือโมเดลตัวแทนการฝึกอบรม อาจมีกรณีที่โมเดลเหล่านี้จำเป็นต้องโต้ตอบกับฟังก์ชันภายนอก เช่น การสืบค้นพยากรณ์อากาศหรือดำเนินการสืบค้น SQL ในสถานการณ์เช่นนี้ BenchLLM อำนวยความสะดวกในการจำลองฟังก์ชันเหล่านี้ สิ่งนี้ช่วยให้คุณทำการทดสอบที่คาดเดาได้มากขึ้น และช่วยให้สามารถค้นหาการเรียกใช้ฟังก์ชันที่ไม่คาดคิดได้
input : I live in London, can I expect rain today?
expected : ["no"]
calls :
- name : forecast.get_n_day_weather_forecast
returns : It's sunny in London.
arguments :
location : London
num_days : 1
ในตัวอย่างข้างต้น ฟังก์ชัน get_n_day_weather_forecast
ในโมดูล forecast
ถูกจำลอง กล่าวอีกนัยหนึ่ง ทุกครั้งที่เรียกใช้ฟังก์ชันนี้ โมเดลจะได้รับ "It's sunny in London"
BenchLLM ยังจัดเตรียมคำเตือนหากฟังก์ชันถูกเรียกใช้ด้วยค่าอาร์กิวเมนต์ที่แตกต่างจาก get_n_day_weather_forecast(location=London, num_days=1)
โปรดทราบว่าการจัดเตรียมพารามิเตอร์อาร์กิวเมนต์เหล่านี้เป็นทางเลือก
ในขณะที่ การทดสอบแบบตั้งโต๊ะ รันแต่ละฟังก์ชันการทดสอบแล้วประเมินผลลัพธ์ การแยกสิ่งเหล่านี้ออกเป็นสองขั้นตอนมักจะเป็นประโยชน์ ตัวอย่างเช่น หากคุณต้องการให้บุคคลทำการประเมินด้วยตนเอง หรือหากคุณต้องการลองใช้วิธีการประเมินหลายวิธีในฟังก์ชันเดียวกัน
$ bench run --no-eval
สิ่งนี้จะสร้างไฟล์ json ใน output/latest/predictions
จากนั้นคุณสามารถประเมินไฟล์เหล่านั้นได้ในภายหลัง
$ bench eval output/latest/predictions
สำหรับการควบคุมโดยละเอียดยิ่งขึ้น BenchLLM จัดเตรียม API คุณไม่จำเป็นต้องเพิ่มการทดสอบ YML/JSON เพื่อให้สามารถประเมินโมเดลของคุณได้ คุณสามารถ:
Test
Tester
เพื่อสร้างการคาดการณ์Evaluator
เพื่อประเมินโมเดลของคุณ from benchllm import StringMatchEvaluator , Test , Tester
# Instantiate your Test objects
tests = [
Test ( input = "What's 1+1?" , expected = [ "2" , "It's 2" ]),
Test ( input = "First rule of fight club?" , expected = [ "Do not talk about fight club" ]),
]
# Use a Tester object to generate predictions using any test functions
tester = Tester ( my_test_function )
tester . add_tests ( tests )
predictions = tester . run ()
# Use an Evaluator object to evaluate your model
evaluator = StringMatchEvaluator ()
evaluator . load ( predictions )
results = evaluator . run ()
print ( results )
หากคุณต้องการรวมการแคชและรันงานการประเมินแบบคู่ขนานหลายงาน คุณสามารถแก้ไขตัวประเมินของคุณได้ดังนี้:
from benchllm . cache import FileCache
...
evaluator = FileCache ( StringMatchEvaluator ( workers = 2 ), Path ( "path/to/cache.json" ))
evaluator . load ( predictions )
results = evaluator . run ()
ในตัวอย่างนี้ FileCache
ใช้เพื่อเปิดใช้งานการแคช และพารามิเตอร์ workers
ของ StringMatchEvaluator
ถูกตั้งค่าเป็น 2
เพื่ออนุญาตการประเมินแบบขนาน ผลลัพธ์แคชจะถูกบันทึกไว้ในไฟล์ที่ระบุโดย Path("path/to/cache.json")
bench add
: เพิ่มการทดสอบใหม่ให้กับชุดbench tests
: แสดงรายการการทดสอบทั้งหมดในชุดเดียวbench run
: รันชุดทดสอบทั้งหมดหรือเป้าหมายbench eval
: รันการประเมินการทดสอบการทำงานที่มีอยู่ BenchLLM ได้รับการพัฒนาสำหรับ Python 3.10 แม้ว่ามันอาจจะทำงานร่วมกับ Python เวอร์ชันอื่นได้เช่นกัน เราขอแนะนำให้ใช้สภาพแวดล้อม Python 3.10 และ pip >= 23 คุณสามารถใช้ conda หรือตัวจัดการสภาพแวดล้อมอื่น ๆ เพื่อตั้งค่าสภาพแวดล้อม:
$ conda create --name benchllm python=3.10
$ conda activate benchllm
$ pip install -e " .[dev] "
หากต้องการรันตัวอย่างทั้งหมดก่อนอื่น ให้ติดตั้งตัวอย่างการขึ้นต่อกันเพิ่มเติม
$ pip install -e " .[examples] "
ขั้นตอนการบริจาค:
เราปฏิบัติตามคำแนะนำสไตล์ PEP8 โปรดปฏิบัติตามคำแนะนำนี้เมื่อมีส่วนร่วม
หากคุณต้องการความช่วยเหลือ โปรดเปิดปัญหาในหน้า GitHub ของเรา