️ اجعل LLMs تتحدث لغة كل تطبيق. ?️
تم صنعه باستخدام ❤?️ بواسطة الفريق في .txt.
قناة اليوتيوب | مدونة .txt | تغريد
pip install outlines
أول مرة هنا؟ انتقل إلى دليل الإعداد لدينا
outlinesdev/outlines
!يحتوي تطبيق Outlines على إصدارات وميزات جديدة تأتي كل أسبوع. تأكد من النجمة و ? شاهد هذا المستودع، تابع @dottxtai لتبقى على اطلاع!
لقد أنشأنا شركة لمواصلة دفع حدود التوليد المنظم. تعرف على المزيد حول ملف .txt، وقم بتجربة واجهة برمجة تطبيقات .json الخاصة بنا إذا كنت بحاجة إلى حل مستضاف
الخطوة الأولى نحو موثوقية الأنظمة التي تتضمن نماذج لغوية كبيرة هي التأكد من وجود واجهة محددة جيدًا بين مخرجاتها والتعليمات البرمجية المحددة من قبل المستخدم. توفر الخطوط العريضة طرقًا للتحكم في إنشاء نماذج اللغة لجعل مخرجاتها أكثر قابلية للتنبؤ بها.
يمكنك تقليل الإكمال إلى الاختيار بين احتمالات متعددة:
import outlines
model = outlines . models . transformers ( "microsoft/Phi-3-mini-4k-instruct" )
prompt = """You are a sentiment-labelling assistant.
Is the following review positive or negative?
Review: This restaurant is just awesome!
"""
generator = outlines . generate . choice ( model , [ "Positive" , "Negative" ])
answer = generator ( prompt )
يمكنك توجيه النموذج لإرجاع الأعداد الصحيحة أو العوامات فقط:
import outlines
model = outlines . models . transformers ( "WizardLM/WizardMath-7B-V1.1" )
prompt = "<s>result of 9 + 9 = 18</s><s>result of 1 + 2 = "
answer = outlines . generate . format ( model , int )( prompt )
print ( answer )
# 3
prompt = "sqrt(2)="
generator = outlines . generate . format ( model , float )
answer = generator ( prompt , max_tokens = 10 )
print ( answer )
# 1.41421356
تأتي الخطوط العريضة أيضًا مع إنشاء سريع منظم للتعبيرات العادية. في الواقع، تستخدم وظائف choice
format
قبل كل شيء إنشاءًا منظمًا لـ regex تحت الغطاء:
import outlines
model = outlines . models . transformers ( "microsoft/Phi-3-mini-4k-instruct" )
prompt = "What is the IP address of the Google DNS servers? "
generator = outlines . generate . text ( model )
unstructured = generator ( prompt , max_tokens = 30 )
generator = outlines . generate . regex (
model ,
r"((25[0-5]|2[0-4]d|[01]?dd?).){3}(25[0-5]|2[0-4]d|[01]?dd?)" ,
)
structured = generator ( prompt , max_tokens = 30 )
print ( unstructured )
# What is the IP address of the Google DNS servers?
#
# Passive DNS servers are at DNS servers that are private.
# In other words, both IP servers are private. The database
# does not contain Chelsea Manning
print ( structured )
# What is the IP address of the Google DNS servers?
# 2.2.6.1
على عكس المكتبات الأخرى، فإن الإنشاء المنظم بالتعبير العادي في الخطوط العريضة يكون بنفس سرعة الإنشاء غير المنظم تقريبًا.
تسمح الخطوط العريضة بتوجيه عملية الإنشاء بحيث يتم ضمان أن يتبع الإخراج مخطط JSON أو نموذج Pydantic:
from enum import Enum
from pydantic import BaseModel , constr
import outlines
import torch
class Weapon ( str , Enum ):
sword = "sword"
axe = "axe"
mace = "mace"
spear = "spear"
bow = "bow"
crossbow = "crossbow"
class Armor ( str , Enum ):
leather = "leather"
chainmail = "chainmail"
plate = "plate"
class Character ( BaseModel ):
name : constr ( max_length = 10 )
age : int
armor : Armor
weapon : Weapon
strength : int
model = outlines . models . transformers ( "microsoft/Phi-3-mini-4k-instruct" )
# Construct structured sequence generator
generator = outlines . generate . json ( model , Character )
# Draw a sample
seed = 789001
character = generator ( "Give me a character description" , seed = seed )
print ( repr ( character ))
# Character(name='Anderson', age=28, armor=<Armor.chainmail: 'chainmail'>, weapon=<Weapon.sword: 'sword'>, strength=8)
character = generator ( "Give me an interesting character description" )
print ( repr ( character ))
# Character(name='Vivian Thr', age=44, armor=<Armor.plate: 'plate'>, weapon=<Weapon.crossbow: 'crossbow'>, strength=125)
تعمل الطريقة مع الأنواع الموحدة، والأنواع الاختيارية، والمصفوفات، والمخططات المتداخلة، وما إلى ذلك. بعض قيود الحقول غير مدعومة بعد، ولكن كل شيء آخر يجب أن يعمل.
في بعض الأحيان تريد فقط أن تكون قادرًا على تمرير مخطط JSON بدلاً من نموذج Pydantic. لقد قمنا بتغطيتك:
import outlines
schema = '''{
"title": "Character",
"type": "object",
"properties": {
"name": {
"title": "Name",
"maxLength": 10,
"type": "string"
},
"age": {
"title": "Age",
"type": "integer"
},
"armor": {"$ref": "#/definitions/Armor"},
"weapon": {"$ref": "#/definitions/Weapon"},
"strength": {
"title": "Strength",
"type": "integer"
}
},
"required": ["name", "age", "armor", "weapon", "strength"],
"definitions": {
"Armor": {
"title": "Armor",
"description": "An enumeration.",
"enum": ["leather", "chainmail", "plate"],
"type": "string"
},
"Weapon": {
"title": "Weapon",
"description": "An enumeration.",
"enum": ["sword", "axe", "mace", "spear", "bow", "crossbow"],
"type": "string"
}
}
}'''
model = outlines . models . transformers ( "microsoft/Phi-3-mini-4k-instruct" )
generator = outlines . generate . json ( model , schema )
character = generator ( "Give me a character description" )
قواعد النحو الرسمية تحكم العالم، والمخططات تجعلها تحكم ماجستير اللغة أيضًا. يمكنك تمرير أي قواعد نحوية خالية من السياق بتنسيق EBNF وستقوم الخطوط العريضة بإنشاء مخرجات صالحة لهذه القواعد:
import outlines
arithmetic_grammar = """
?start: expression
?expression: term (("+" | "-") term)*
?term: factor (("*" | "/") factor)*
?factor: NUMBER
| "-" factor
| "(" expression ")"
%import common.NUMBER
"""
model = outlines . models . transformers ( "WizardLM/WizardMath-7B-V1.1" )
generator = outlines . generate . cfg ( model , arithmetic_grammar )
sequence = generator ( "Alice had 4 apples and Bob ate 2. Write an expression for Alice's apples:" )
print ( sequence )
# (8-2)
كانت هذه قواعد نحوية بسيطة للغاية، ويمكنك استخدام outlines.generate.cfg
لإنشاء لغة Python وSQL صحيحة نحويًا، وأكثر من ذلك بكثير. أي نوع من النص المنظم، حقا. كل ما عليك فعله هو البحث عن "X EBNF grammar" على الويب وإلقاء نظرة على وحدة grammars
التفصيلية.
يمكن أن تستنتج الخطوط العريضة بنية الإخراج من توقيع الوظيفة. والنتيجة هي قاموس، ويمكن تمريرها مباشرة إلى الوظيفة باستخدام بناء جملة توسيع القاموس المعتاد **
:
import outlines
def add ( a : int , b : int ):
return a + b
model = outlines . models . transformers ( "WizardLM/WizardMath-7B-V1.1" )
generator = outlines . generate . json ( model , add )
result = generator ( "Return json with two integers named a and b respectively. a is odd and b even." )
print ( add ( ** result ))
# 3
من المزايا الرائعة لتمرير الوظائف مباشرة لتحديد البنية أن بنية LLM ستتغير مع تعريف الوظيفة. لا حاجة لتغيير الرمز في عدة أماكن!
يمكنك أيضًا تضمين وظائف مختلفة في التعداد لإنشاء المعلمات:
from enum import Enum
from functools import partial
import outlines
def add ( a : int , b : int ) -> int :
return a + b
def mul ( c : float , d : float ) -> float :
return c * d
class Operation ( Enum ):
add = partial ( add )
mul = partial ( mul )
model = outlines . models . transformers ( "WizardLM/WizardMath-7B-V1.1" )
generator = outlines . generate . json ( model , add )
result = generator ( "Return json with two float named c and d respectively. c is negative and d greater than 1.0." )
print ( result )
# {'c': -3.14, 'd': 1.5}
قد تصبح مطالبات البناء فوضوية. تسهل الخطوط العريضة كتابة المطالبات وإدارتها من خلال تغليف القوالب داخل "وظائف القالب".
تتيح هذه الوظائف إمكانية فصل منطق المطالبة عن منطق البرنامج العام بدقة؛ يمكن استيرادها من الوحدات النمطية والمكتبات الأخرى.
لا تتطلب وظائف القالب تجريدًا غير ضروري، فهي تستخدم محرك القوالب Jinja2 للمساعدة في إنشاء مطالبات معقدة بطريقة موجزة:
import outlines
examples = [
( "The food was disgusting" , "Negative" ),
( "We had a fantastic night" , "Positive" ),
( "Recommended" , "Positive" ),
( "The waiter was rude" , "Negative" )
]
@ outlines . prompt
def labelling ( to_label , examples ):
"""You are a sentiment-labelling assistant.
{% for example in examples %}
{{ example[0] }} // {{ example[1] }}
{% endfor %}
{{ to_label }} //
"""
model = outlines . models . transformers ( "microsoft/Phi-3-mini-4k-instruct" )
prompt = labelling ( "Just awesome" , examples )
answer = outlines . generate . text ( model )( prompt , max_tokens = 100 )
@article{willard2023efficient,
title={Efficient Guided Generation for LLMs},
author={Willard, Brandon T and Louf, R{'e}mi},
journal={arXiv preprint arXiv:2307.09702},
year={2023}
}