จัดการพรอมต์พารามิเตอร์ (ข้อความ) ที่ใช้ใน AI Generative (aka chatgpt, openai, et.al. ) โดยใช้อะแดปเตอร์จัดเก็บข้อมูลเช่น FileSystemadapter, SQLITeadapter และ Activerecordadapter
การเปลี่ยนแปลงการเปลี่ยนแปลง ในเวอร์ชัน 0.3.0 - ค่าของแฮชพารามิเตอร์สำหรับคำหลักตอนนี้เป็นอาร์เรย์แทนค่าเดียว ค่าสุดท้ายในอาร์เรย์เป็นค่าล่าสุดที่ใช้สำหรับคำหลักที่กำหนดไว้เสมอ สิ่งนี้ทำเพื่อรองรับการใช้ readline :: การแก้ไขวัตถุประวัติในเครื่องมือ AIA CLI
ติดตั้งอัญมณีและเพิ่มลงใน gemfile ของแอปพลิเคชันโดยดำเนินการ:
bundle add prompt_manager
หาก Bundler ไม่ได้ใช้เพื่อจัดการการพึ่งพาให้ติดตั้งอัญมณีโดยดำเนินการ:
gem install prompt_manager
ดูตัวอย่าง/simple.rb
ดูเพิ่มเติมตัวอย่าง/ใช้ _search_proc.rb
GEM prompt_manager ให้ฟังก์ชันการทำงานเพื่อจัดการพรอมต์ที่มีคำหลักและคำสั่งสำหรับใช้กับกระบวนการ AI กำเนิด
Gen-AI เกี่ยวข้องกับการแปลง (บางคนบอกว่าการดำเนินการ) ของข้อความภาษาธรรมชาติของมนุษย์ ("พรอมต์") เป็นสิ่งอื่นโดยใช้สิ่งที่เรียกว่าโมเดลภาษาขนาดใหญ่ (LLM) เช่นที่มีจาก OpenAI พรอมต์พารามิเตอร์เป็นหนึ่งในที่มีคำหลักฝังตัว (พารามิเตอร์) ซึ่งเป็นตัวยึดสถานที่สำหรับข้อความอื่น ๆ ที่จะแทรกลงในพรอมต์
พรอมต์ _Manager ใช้นิพจน์ทั่วไปเพื่อระบุคำหลักเหล่านี้ภายในพรอมต์ มันใช้คำหลักเป็นคีย์ในแฮช parameters ซึ่งเก็บไว้กับข้อความพรอมต์ในรูปแบบที่เป็นอนุกรม - ตัวอย่างเช่น JSON
โดยค่าเริ่มต้นการจับคู่ข้อความใด ๆ [UPPERCASE_TEXT] ที่แนบมาในวงเล็บเหลี่ยมจะถือเป็นคำหลัก [คำหลักสามารถมีช่องว่าง] เช่นเดียวกับตัวละครขีดเส้นใต้
คุณสามารถปรับแต่งรูปแบบคำหลักได้โดยการตั้งค่านิพจน์ทั่วไปที่แตกต่างกัน:
# Use {{param}} style instead of [PARAM]
PromptManager :: Prompt . parameter_regex = /( { { [A-Za-z_]+ } } )/ regex ต้องรวมถึงการจับวงเล็บ () เพื่อแยกคำหลัก regex เริ่มต้นคือ /([[AZ _|]+])/
คำสั่งคือบรรทัดในข้อความพรอมต์ที่เริ่มต้นด้วยอักขระสองตัว '//' - Slash Slash - เหมือนในวันเก่าของ IBM JCL - ภาษาควบคุมงาน พรอมต์อาจมีคำสั่งเป็นศูนย์หรือมากกว่า คำสั่งสามารถมีพารามิเตอร์และสามารถใช้ประโยชน์จากคำหลัก
prompt_manager รวบรวมคำสั่งเท่านั้น มันแยกคำหลักออกจากบรรทัดคำสั่งและให้การแทนที่คำหลักเหล่านั้นด้วยข้อความอื่น ๆ เช่นเดียวกับที่ทำเพื่อพรอมต์
นี่คือตัวอย่างไฟล์ข้อความพรอมต์ที่มีความคิดเห็นคำสั่งและคำหลัก:
# prompts/sing_a_song.txt
# Desc: Has the computer sing a song
//TextToSpeech [LANGUAGE] [VOICE NAME]
Say the lyrics to the song [SONG NAME]. Please provide only the lyrics without commentary.
__END__
Computers will never replace Frank Sinatra
การได้รับคำสั่งจากพรอมต์นั้นง่ายพอ ๆ กับการได้รับ Kewyords:
prompt = PromptManager :: Prompt . new ( ... )
prompt . keywords #=> an Array
prompt . directives #=> an Array of entries like: ['directive', 'parameters']
# to_s builds the prompt by substituting
# values for keywords amd removing comments.
# The resulting text contains directives and
# prompt text ready for the LLM process.
puts prompt . to_s รายการในอาร์เรย์ที่ส่งคืนโดยวิธี prompt.directives นั้นอยู่ในลำดับที่กำหนดคำสั่งภายในพรอมต์ แต่ละรายการมีสององค์ประกอบ:
เนื่องจากมีการรวบรวมคำสั่งหลังจากคำหลักในพรอมต์ได้รับการแทนที่ค่าของพวกเขาจึงเป็นไปได้ที่จะมีคำสั่งที่สร้างขึ้นแบบไดนามิกเป็นส่วนหนึ่งของพรอมต์ ตัวอย่างเช่น:
//[COMMAND] [OPTIONS]
# or
[SOMETHING]
... ที่ไหน [คำสั่ง] ถูกแทนที่ด้วยชื่อคำสั่งบางอย่าง [บางสิ่ง] สามารถแทนที่ด้วย "// ตัวเลือกคำสั่ง"
อัญมณี prompt_manager รวบรวมคำสั่งเท่านั้น การดำเนินการคำสั่งเหล่านั้นจะถูกทิ้งไว้จนถึงกระบวนการสตรีมบางส่วน นี่คือแนวคิดบางประการเกี่ยวกับวิธีการใช้คำสั่งในกระบวนการดาวน์สตรีมที่รวดเร็ว:
modsมันขึ้นอยู่กับวิธีที่แอปพลิเคชันของคุณต้องการสนับสนุนคำสั่งหรือไม่
อัญมณี prompt_manager ละเว้นความคิดเห็น บรรทัดที่เริ่มต้นด้วยอักขระ '#' - ปอนด์ (AKA แฮช) - เป็นความคิดเห็นของบรรทัด บรรทัดใด ๆ ที่ติดตามบรรทัดที่ ' สิ้นสุด ในตอนท้ายของไฟล์ถือเป็นความคิดเห็น โดยพื้นฐานแล้ว ' สิ้นสุด ' จุดสิ้นสุดของไฟล์ ไม่มีอะไรเป็นกระบวนการตามบรรทัดนั้น
อัญมณียังเพิกเฉยต่อเส้นเปล่า
อะแดปเตอร์ที่เก็บข้อมูลเป็นอินสแตนซ์ของคลาสที่เชื่อมโยง PromptManager::Prompt กับสถานที่จัดเก็บข้อมูลที่เก็บพรอมต์จริง ขณะนี้มีอะแดปเตอร์เก็บข้อมูล 3 ตัวที่วางแผนไว้สำหรับการใช้งาน
PromptManager::Prompt เพื่อรองรับวิธีการขนาดเล็ก อะแดปเตอร์ที่เก็บข้อมูลสามารถให้คลาส "พิเศษ" หรือวิธีการอินสแตนซ์ที่สามารถใช้ผ่านคลาสพรอมต์ ดู test/prompt_manager/prompt_test.rb สำหรับคำแนะนำในการสร้างอะแดปเตอร์ที่เก็บข้อมูลใหม่
นี่คืออะแดปเตอร์ที่จัดเก็บข้อมูลแรกที่พัฒนาขึ้น มันบันทึกพรอมต์เป็นไฟล์ข้อความภายในระบบไฟล์ภายใน prompts_dir ที่กำหนด (ไดเรกทอรี) เช่น ~/.prompts หรือสถานที่ที่เหมาะสมที่สุดสำหรับคุณ อีกตัวอย่างหนึ่งคือการให้ไดเรกทอรีของคุณในระบบไฟล์ที่ใช้ร่วมกันเพื่อให้ผู้อื่นสามารถใช้พรอมต์เดียวกันได้
prompt ID คือ basename ของไฟล์ข้อความ ตัวอย่างเช่น todo.txt เป็นไฟล์สำหรับ ID Prompt ID todo (ดูไดเรกทอรีตัวอย่าง)
พารามิเตอร์สำหรับ ID Prompt todo จะถูกบันทึกไว้ในไดเรกทอรีเดียวกับ todo.txt ในไฟล์ JSON ที่ชื่อ todo.json (เช่นในไดเรกทอรีตัวอย่าง)
ใช้บล็อก config เพื่อสร้างการกำหนดค่าสำหรับคลาส
PromptManager :: Storage :: FileSystemAdapter . config do | o |
o . prompts_dir = "path/to/prompts_directory"
o . search_proc = nil # default
o . prompt_extension = '.txt' # default
o . params_extension = '.json' # default
end บล็อก config จะส่งคืน self เพื่อให้คุณสามารถทำได้เพื่อตั้งค่าอะแดปเตอร์ที่เก็บข้อมูลด้วยคลาสพรอมต์:
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: FileSystemAdapter
. config do | config |
config . prompts_dir = 'path/to/prompts_dir'
end . new นี่คือทั้ง String หรือวัตถุ Pathname พา ธ ไฟล์ทั้งหมดได้รับการบำรุงรักษาในคลาสเป็นวัตถุ Pathname หากคุณให้ String มันจะถูกแปลง เส้นทางสัมพัทธ์จะถูกแปลงเป็นเส้นทางสัมบูรณ์
ArgumentError จะได้รับการยกขึ้นเมื่อไม่มี prompts_dir อยู่หรือถ้าไม่ใช่ไดเรกทอรี
ค่าเริ่มต้นสำหรับ search_proc คือไม่มีซึ่งหมายความว่าการค้นหาจะถูก preformed โดยวิธี search เริ่มต้นซึ่งโดยทั่วไปแล้วการอ่านไฟล์พรอมต์ทั้งหมดเพื่อดูว่าไฟล์ใดมีคำค้นหา มันจะส่งคืนอาร์เรย์ของรหัสพรอมต์สำหรับไฟล์พรอมต์แต่ละไฟล์ที่พบว่ามีคำค้นหา มันขึ้นอยู่กับแอปพลิเคชันที่จะเลือกที่ส่งคืนรหัสพรอมต์ที่จะใช้
มีวิธีที่เร็วกว่าในการค้นหาและเลือกไฟล์ ตัวอย่างเช่นมียูทิลิตี้การค้นหาและการเลือกเฉพาะที่มีให้สำหรับบรรทัดคำสั่ง ไดเรกทอรี examples มีสคริปต์ bash ชื่อ rgfzf ที่ใช้ rg (aka ripgrep ) เพื่อทำการค้นหาและ fzf เพื่อทำการเลือก
ดูตัวอย่าง/ใช้ _search_proc.rb
ตัวเลือกการกำหนดค่าทั้งสองนี้เป็นวัตถุ String ที่ต้องเริ่มต้นด้วยช่วงเวลา " utherwise ArgumentError จะถูกยกขึ้น
ปัจจุบัน FileSystemAdapter รองรับ JSON serializer สำหรับแฮชพารามิเตอร์เท่านั้น การใช้ค่าอื่น ๆ สำหรับส่วนขยายเหล่านี้จะทำให้เกิดปัญหา
พวกเขามีอยู่เพื่อให้มีแพลตฟอร์มที่สามารถสร้างอะแดปเตอร์เก็บข้อมูลอื่น ๆ หรือเพิ่ม serializers ได้ นี่ไม่ได้อยู่บนแผนงาน
# ~/.prompts/joke.txt
# Desc: Tell some jokes
Tell me a few [KIND] jokes about [SUBJECT]
หมายเหตุบรรทัดคำสั่งที่ด้านบน นี่คือการประชุมที่ฉันใช้ มันไม่ได้เป็นส่วนหนึ่งของซอฟต์แวร์ ฉันพบว่ามีประโยชน์ในการบันทึกพรอมต์
{
"[KIND]" : [
" pun " ,
" family friendly "
],
"[SUBJECT]" : [
" parrot " ,
" garbage man " ,
" snowman " ,
" weather girl "
]
}ค่าสุดท้ายในอาร์เรย์ของคำหลักเป็นค่าล่าสุดที่ใช้สำหรับคำหลักนั้น นี่คือฟังก์ชั่นที่จัดตั้งขึ้นตั้งแต่ v0.3.0 วัตถุประสงค์ของมันคือการให้ประวัติของค่าที่ผู้ใช้สามารถเลือกเพื่อทำซ้ำค่าก่อนหน้าหรือเพื่อเลือกค่า TA ก่อนหน้านี้และแก้ไขเป็นสิ่งใหม่
FileSystemAdapter เพิ่มสองวิธีใหม่สำหรับใช้โดยคลาส Prompt :
Pathname ไปยังไฟล์พรอมต์ ใช้แบบฟอร์ม path(prompt_id) กับคลาส Prompt ให้ใช้ prompt.path เมื่อคุณมีอินสแตนซ์ของ Prompt
ActiveRecordAdapter สันนิษฐานว่ามีฐานข้อมูลที่กำหนดค่าไว้แล้วโดยโปรแกรมแอปพลิเคชันที่ต้องการ prompt_manager ซึ่งมีรูปแบบที่มีเนื้อหาที่รวดเร็ว รุ่นนี้ต้องมีคอลัมน์อย่างน้อยสามคอลัมน์ที่มีเนื้อหาสำหรับ:
โมเดลและคอลัมน์สำหรับองค์ประกอบทั้งสามนี้สามารถมีชื่อใด ๆ ชื่อเหล่านั้นจะถูกจัดเตรียมให้กับ ActiveRecordAdapter ในบล็อกการกำหนดค่า
ใช้บล็อก config เพื่อสร้างการกำหนดค่าสำหรับคลาส
PromptManager::Prompt Class คาดว่าจะมีอินสแตนซ์ของคลาสอะแดปเตอร์ที่เก็บข้อมูล โดยวิธีการกำหนดค่าอะแดปเตอร์คลาสอะแดปเตอร์จะกลับมา self เพื่อให้ new ง่ายขึ้นหลังจากการกำหนดค่าจะสร้างอินสแตนซ์
PromptManager :: Prompt
. storage_adapter =
PromptManager :: Storage :: ActiveRecordAdapter . config do | config |
config . model = DbPromptModel # any ActiveRecord::Base model
config . id_column = :prompt_name
config . text_column = :prompt_text
config . parameters_column = :prompt_params
end . new # adapters an instances of the adapter class พารามิเตอร์การกำหนดค่า model เป็นชื่อคลาสจริงของ ActiveRecord::Base หรือ ApplicationRecord (หากคุณใช้แอปพลิเคชัน Rails) ที่มีเนื้อหาที่ใช้สำหรับพรอมต์
id_column มีชื่อของคอลัมน์ที่มีเนื้อหา "ID พรอมต์" มันสามารถเป็นค่า String หรือ Symbol
text_column มีชื่อของคอลัมน์ที่มีข้อความดิบจริงของพรอมต์ ข้อความดิบนี้สามารถรวมคำหลักที่จะถูกแทนที่ด้วยค่าจากแฮชพารามิเตอร์ ค่าชื่อคอลัมน์อาจเป็น String หรือ Symbol
parameters_column มีชื่อของคอลัมน์ที่มีพารามิเตอร์ที่ใช้เพื่อแทนที่คำหลักในข้อความพรอมต์ คอลัมน์นี้ในโมเดลฐานข้อมูลคาดว่าจะเป็นอนุกรม ปัจจุบัน ActiveRecordAdapter มีรหัสบิต kludge ที่สันนิษฐานว่าการทำให้เป็นอนุกรมนั้นทำกับ JSON ค่าของพารามิเตอร์ _column อาจเป็น String หรือ Symbol
TODO: แก้ไข kludge เพื่อให้สามารถใช้งานอนุกรมใด ๆ ได้
มีความเป็นไปได้มากมายที่จะเป็นตัวอย่างแนวคิดปลั๊กอินนี้ของอะแดปเตอร์ที่เก็บข้อมูล นี่คือการพิจารณา:
กำลังมองหาข้อเสนอแนะและผู้มีส่วนร่วมเพื่อเพิ่มความสามารถของ PROMPTION_MANAGER
รายงานข้อผิดพลาดและคำขอดึงยินดีต้อนรับบน GitHub ที่ https://github.com/madbomber/prompt_manager
อัญมณีมีให้เป็นโอเพ่นซอร์สภายใต้ข้อกำหนดของใบอนุญาต MIT