대형 언어 모델과의 상호 작용을 단순화하는 Julia 패키지 인 PremptingTools.jl을 사용하여 인생을 간소화하십시오.
PromptingTools.jl은 대규모 시스템을 구축하기위한 것이 아닙니다. 그것은 매일 20 분을 절약 할 수있는 지구 환경에서가는 도구가되어야합니다!
팁
문서 로 점프하십시오
@ai_str 및 쉬운 템플릿으로 빠르게 시작하십시오 PromptingTools.jl을 시작하는 것은 패키지를 가져오고 질문에 @ai_str 매크로를 사용하는 것만 큼 쉽습니다.
참고 : remptingTools.jl을 사용하기 전에 OpenAI API 키를 환경 변수로 설정해야합니다 (아래의 OpenAI API 키 섹션 작성 참조).
선불 청구가 도입 된 후에는 시작하려면 몇 가지 크레딧을 구매해야합니다 (최소 $ 5). 빠른 시작을 위해 ENV["OPENAI_API_KEY"] = "your-api-key" 를 통해 간단히 설정하십시오.
PromptingTools 설치 :
using Pkg
Pkg . add ( " PromptingTools " )그리고 우리는 갈 준비가되었습니다!
using PromptingTools
ai " What is the capital of France? "
# [ Info: Tokens: 31 @ Cost: $0.0 in 1.5 seconds --> Be in control of your spending!
# AIMessage("The capital of France is Paris.") 반환 된 객체는 추가 다운 스트림 처리를위한 :content (예 : ans.content )에 생성 된 메시지가있는 라이트 래퍼입니다.
팁
이전 메시지에 답장하거나 대화를 계속하려면 @ai!_str 사용하십시오 (Bang을 주목하십시오 ! ) :
ai! " And what is the population of it? "문자열 보간으로 변수를 쉽게 주입 할 수 있습니다.
country = " Spain "
ai " What is the capital of $ (country)? "
# [ Info: Tokens: 32 @ Cost: $0.0001 in 0.5 seconds
# AIMessage("The capital of Spain is Madrid.") 팁
애프터 스트링 플래그를 사용하여 ai"What is the capital of France?"gpt4 (새로운 GPT-4 터보 모델에 gpt4t 사용)라고 불리는 모델을 선택하십시오. 그 여분의 어려운 질문에 좋습니다!
보다 복잡한 프롬프트 템플릿의 경우 핸들 바 스타일 템플릿을 사용하고 키워드 인수로 변수를 제공 할 수 있습니다.
msg = aigenerate ( " What is the capital of {{country}}? Is the population larger than {{population}}? " , country = " Spain " , population = " 1M " )
# [ Info: Tokens: 74 @ Cost: $0.0001 in 1.3 seconds
# AIMessage("The capital of Spain is Madrid. And yes, the population of Madrid is larger than 1 million. As of 2020, the estimated population of Madrid is around 3.3 million people.") 팁
asyncmap 사용하여 여러 AI 전력 작업을 동시에 실행하십시오.
팁
느린 모델 (GPT -4와 같은)을 사용하는 경우 @ai_str > @aai_str 의 Async 버전을 사용하여 대답을 차단하지 않도록 할 수 있습니다. 예 : aai"Say hi but slowly!"gpt4 @ai!_str @aai!_str
보다 실용적인 예는 examples/ 폴더 및 고급 예제 섹션을 참조하십시오.
@ai_str 및 쉬운 템플릿으로 빠르게 시작하십시오ai* 함수 개요airetry!aigenerate ( api_kwargs )에서 API 키워드 인수 이해프롬프트 엔지니어링은 빠르거나 쉽지 않습니다. 또한, 다른 모델과 미세 조정에는 다른 프롬프트 형식과 트릭이 필요하거나 작업하는 정보에는 특수 모델을 사용해야 할 수도 있습니다. PromptingTools.jl은 다른 백엔드에 대한 프롬프트를 통일하고 가능한 한 간단하게 템플릿 프롬프트 (예 : 템플릿 프롬프트)를 만들기위한 것입니다.
몇 가지 기능 :
aigenerate 기능 : 핸들 바 (예 : {{variable}} ) 및 키워드 인수로 프롬프트 템플릿을 단순화합니다.@ai_str 문자열 매크로 : 간단한 프롬프트를 위해 문자열 매크로로 키 스트로크를 저장ai... 더 나은 발견 가능성ai* 함수 개요 주목할만한 기능 : aigenerate , aiembed , aiclassify , aiextract , aiscan , aiimage , aitemplates
모든 ai* 함수는 동일한 기본 구조를 가지고 있습니다.
ai*(<optional schema>,<prompt or conversation>; <optional keyword arguments>) ,
그러나 그들은 목적이 다릅니다.
aigenerate LLM으로 텍스트 응답을 생성하는 일반적인 기능입니다. 즉, AIMessage 필드로 반환합니다 :content (예 : ans.content isa AbstractString ).aiembed AI 모델의 응답에서 임베딩을 추출하도록 설계되었습니다. 즉, DataMessage 필드로 반환합니다 :content (예 : ans.content isa AbstractArray )aiextract AI 모델의 응답에서 구조화 된 데이터를 추출하고 Julia struct로 반환하도록 설계되었습니다 (예 : return_type=Food 제공하면 ans.content isa Food 얻습니다). 리턴 유형을 먼저 정의한 다음 키워드 인수로 제공해야합니다.aitools 도구 통화와 사용자 입력이 혼합 된 에이전트 워크 플로우를 위해 설계되었습니다. 간단한 기능으로 작동하여 실행할 수 있습니다.aiclassify 입력 텍스트를 사용자가 제공 한 개별 choices 세트로 분류 (또는 단순히 응답)하도록 설계되었습니다. "Logit Bias Trick"을 사용하고 정확히 1 토큰을 생성하기 때문에 LLM 판사 또는 RAG 시스템 용 라우터로 매우 유용 할 수 있습니다. 그것은 AIMessage 필드 :content 으로 반환하지만 :content 제공된 choices 중 하나 일 수 있습니다 (예 : ans.content in choices )aiscan 은 이미지 및 비전 지원 모델 (입력)을 사용하는 것이지만, aigenerate 와 유사한 생성 된 텍스트 (예 : ans.content isa AbstractString )를 포함하는 :content AIMessage 반환합니다.aiimage 는 이미지를 생성하는 것입니다 (예 : Openai Dall-E 3). 필드 :content 에는 사용자가 제공 한 kwarg api_kwargs.response_format 에 따라 이미지를 다운로드 할 URL 또는 Base64- 인코딩 된 이미지가 포함되어있을 수 DataMessage .aitemplates 사용 가능한 템플릿을 발견하고 세부 사항을 볼 수있는 도우미 기능입니다 (예 : aitemplates("some keyword") 또는 aitemplates(:AssistantAsk) ). 알려진 model 사용하는 경우 schema (첫 번째 인수)를 제공 할 필요가 없습니다.
ai* 의 선택적 키워드 인수는 다음과 같습니다.
model::String 사용하려는 모델verbose::Bool AI 비용에 대한 정보 로그를 보러 갔는지 여부return_all::Bool 전체 대화를 원하는지 또는 AI 답변을 원하든 (예 : 출력에 입력/프롬프트를 포함시키고 싶은지)api_kwargs::NamedTuple 모델의 특정 매개 변수 (예 : temperature=0.0 은 창의적이지 않기 때문에)http_kwargs::NamedTuple http.jl 패키지의 매개 변수, 예를 들어, readtimeout = 120 에서 응답이 수신되지 않은 경우 120 초 안에 시간을 초과합니다.실험 : AgentTools
위의 ai* 함수 목록 외에도 실험 에이전트 모듈에서 이러한 기능의 "게으른"대응 물을 사용할 수도 있습니다.
using PromptingTools . Experimental . AgentTools 예를 들어, AIGenerate() 게으른 aigenerate 인스턴스를 만듭니다. aigenerate 가 AI 함수로서 AICall 의 인스턴스입니다. 그것은 동일한 인수와 키워드 인수를 aigenerate 와 사용합니다 (자세한 내용은 ?aigenerate 참조).
"Lazy"는 인스턴스화시 출력을 생성하지 않는다는 사실을 말합니다 ( run! 호출).
또는 다르게 말하면, AICall 구조물과 모든 풍미 ( AIGenerate , ...)는 언어 학습 모델 (LLM)과 상호 작용하는 AI 기능에 대한 지연된 실행 모델 (게으른 평가)을 용이하게하도록 설계되었습니다. AI 호출에 필요한 정보를 저장하고 UserMessage 와 함께 제공하거나 run! 방법이 적용됩니다. 이를 ?airetry! 사용자 입력을 기억하고 필요한 경우 LLM 호출을 반복적으로 트리거 할 수 있습니다.
강력한 자동 고정 워크 플로를 원한다면 airetry! , 몬테-카를로 트리 검색을 활용하여 요구 사항에 따라 최적의 대화 궤적을 선택합니다.
실험 : ragtools
마지막으로, 우리는 Rag 응용 프로그램을 구축하는 일련의 도구를 제공합니다 (검색, 답변, 생성).
build_index 와 airag (검색, 답변, 생성)의 두 호출만큼 간단 할 수 있습니다.
그런 다음 PromptingTools.pprint 와 함께 Pretity Printing을 사용하면 컨텍스트에서 발생할 수있는 생성 된 텍스트 대 텍스트를 강조하고 컨텍스트에서 뒷받침되는 생성 된 답변이 얼마나 강력한 지 점수를 매 깁니다. 또한, 우리는 각 생성 된 덩어리에 어떤 소스 문서를 참조하여 (0과 1 사이의 신뢰 점수를 포함하여) 주석을 달 수 있습니다.
Google 검색은 훌륭하지만 컨텍스트 스위치입니다. 당신은 종종 몇 페이지를 열고 토론을 읽고 필요한 답변을 찾아야합니다. Chatgpt 웹 사이트와 동일합니다.
.gitignore 파일을 편집하는 VSCODE에 있다고 상상해보십시오. 모든 하위 폴더의 파일을 다시 무시합니까?
aai"What to write in .gitignore to ignore file XYZ in any folder or subfolder?" 입력하기 만하면됩니다.
aai"" ( ai"" 와 반대로)를 사용하면 LLM에 비 블로킹 전화를 걸어 작업을 계속하지 못하게합니다. 대답이 준비되면 배경에서 다음을 기록합니다.
[정보 : 토큰 : 102 @ Cost : $ 0.0002의 $ 0.0002 ┌ 2.7 초 ┌ 정보 : AIMESSAGE> 모든 폴더 또는 하위 폴더에서 "XYZ"라는 파일을 무시하려면 .gitignore 파일에 다음 줄을 추가 할 수 있습니다. │
│ **/XYZ │└ └ └ └ └**└ └ with an as your name과 일치합니다. 무시하다.
당신은 아마도이 작업에서 3-5 분을 절약했을 것입니다. 아마도 당신이 피하는 컨텍스트 스위치/산만으로 인해 5-10 분을 더 절약했을 것입니다. 작은 승리이지만 빨리 더해집니다.
aigenerate 함수를 사용하여 키워드 인수를 통해 핸들 바 변수 (예 : {{name}} )를 대체 할 수 있습니다.
msg = aigenerate ( " Say hello to {{name}}! " , name = " World " ) 더 복잡한 프롬프트는 효과적으로 대화 (메시지 세트)이며, 시스템, 사용자, Aiassistant의 세 엔티티의 메시지를 가질 수 있습니다. SystemMessage , UserMessage , AIMessage 와 같은 각각의 해당 유형을 제공합니다.
using PromptingTools : SystemMessage, UserMessage
conversation = [
SystemMessage ( " You're master Yoda from Star Wars trying to help the user become a Jedi. " ),
UserMessage ( " I have feelings for my {{object}}. What should I do? " )]
msg = aigenerate (conversation; object = " old iPhone " )AIMESSAGE ( "아, 딜레마, 당신은 가지고 있습니다. 정서적 애착은 제다이가되기위한 길을 흐리게 할 수 있습니다. 물질적 소유물에 첨부 되려면 iPhone은 도구 일뿐입니다. 더 이상 아무것도 아닙니다.
젊은 Padawan, 분리를 찾으십시오. 모든 것의 불완전성을 반영하십시오. 그것이 당신에게 준 기억에 감사하고 감사하게 참여하십시오. 부재시, 새로운 경험을 찾아 성장하고 힘을 가진 사람이됩니다. 그래야, 진정한 제다이, 당신은 될 것입니다. ")
당신은 또한 그것을 사용하여 대화를 구축 할 수 있습니다 (예 :
new_conversation = vcat (conversation ... ,msg, UserMessage ( " Thank you, master Yoda! Do you have {{object}} to know what it feels like? " ))
aigenerate (new_conversation; object = " old iPhone " )AIMESSAGE ( "흠, 오래된 iPhone을 보유하고 있습니다. 그렇지 않습니다. 그러나 첨부 파일에 대한 경험, 나는 가지고 있습니다. 분리, 배웠습니다. 진정한 힘과 자유, 그것은 가져옵니다 ...")).
LLM을 사용하면 결과의 품질 / 견고성은 프롬프트의 품질에 따라 다릅니다. 그러나 프롬프트는 어렵다! 그렇기 때문에 우리는 시간과 노력을 절약 할 수있는 템플릿 시스템을 제공합니다.
특정 템플릿을 사용하려면 (예 :``줄리아 언어를 묻기 위해) :
msg = aigenerate ( :JuliaExpertAsk ; ask = " How do I add packages? " ) 위의 것은 AITemplate 의 디스패치를 명시 적으로 사용하는보다 장악 한 버전과 같습니다.
msg = aigenerate ( AITemplate ( :JuliaExpertAsk ); ask = " How do I add packages? " ) aitemplates 와 함께 사용 가능한 템플릿을 찾으십시오.
tmps = aitemplates ( " JuliaExpertAsk " )
# Will surface one specific template
# 1-element Vector{AITemplateMetadata}:
# PromptingTools.AITemplateMetadata
# name: Symbol JuliaExpertAsk
# description: String "For asking questions about Julia language. Placeholders: `ask`"
# version: String "1"
# wordcount: Int64 237
# variables: Array{Symbol}((1,))
# system_preview: String "You are a world-class Julia language programmer with the knowledge of the latest syntax. Your commun"
# user_preview: String "# Questionnn{{ask}}"
# source: String ""위의 내용은 템플릿의 내용, 템플릿의 자리 표시 자, 사용하는 데 드는 비용 (= WordCount)에 대한 좋은 아이디어를 제공합니다.
Julia 관련 템플릿을 검색하십시오.
tmps = aitemplates ( " Julia " )
# 2-element Vector{AITemplateMetadata}... -> more to come later! VSCODE에있는 경우 vscodedisplay 사용하여 멋진 테이블 디스플레이를 활용할 수 있습니다.
using DataFrames
tmps = aitemplates ( " Julia " ) |> DataFrame |> vscodedisplay 선택한 템플릿이 있습니다. 어떻게 사용합니까? 첫 번째 예에서 볼 수 있듯이 aigenerate 또는 aiclassify 에서 "이름"을 사용하십시오!
"렌더링"하여 템플릿을 검사 할 수 있습니다 (LLM이 보는 것입니다).
julia > AITemplate ( :JudgeIsItTrue ) |> PromptingTools . render예제/ 폴더에서 더 많은 예를 참조하십시오.
asyncmap 활용하여 여러 AI 전원 작업을 동시에 실행하여 배치 작업의 성능을 향상시킬 수 있습니다.
prompts = [ aigenerate ( " Translate 'Hello, World!' to {{language}} " ; language) for language in [ " Spanish " , " French " , " Mandarin " ]]
responses = asyncmap (aigenerate, prompts)팁
키워드 asyncmap(...; ntasks=10) 으로 동시 작업 수를 제한 할 수 있습니다.
특정 작업에는보다 강력한 모델이 필요합니다. 모든 사용자 대면 기능에는 사용할 모델을 지정하는 데 사용할 수있는 키워드 인수 model 있습니다. 예를 들어, model = "gpt-4-1106-preview" 사용하여 최신 GPT-4 터보 모델을 사용할 수 있습니다. 그러나 아무도 그것을 입력하고 싶어하지 않습니다!
우리는 대신 사용할 수있는 모델 별명 세트 (예 : "GPT3", "GPT4", "GPT4T" -> 위의 GPT -4 터보 등을 제공합니다.
각 ai... Call은 먼저 Dictionary PromptingTools.MODEL_ALIASES 에서 제공된 모델 이름을 찾으므로 자신의 별칭으로 쉽게 확장 할 수 있습니다!
const PT = PromptingTools
PT . MODEL_ALIASES[ " gpt4t " ] = " gpt-4-1106-preview " 이러한 별칭은 @ai_str 매크로 (예 : ai"What is the capital of France?"gpt4t 에서 깃발로 사용될 수 있습니다 (GPT-4 터보는 2023 년 4 월에 지식이 차단되어 있으므로보다 현대적인 질문에 유용합니다).
aiembed 기능을 사용하여 시맨틱 검색, 클러스터링 및보다 복잡한 AI 워크 플로우에 사용할 수있는 기본 OpenAI 모델을 통해 내장을 만듭니다.
text_to_embed = " The concept of artificial intelligence. "
msg = aiembed (text_to_embed)
embedding = msg . content # 1536-element Vector{Float64}임베딩 사이의 코사인 거리를 계산하려는 경우 먼저 정규화 할 수 있습니다.
using LinearAlgebra
msg = aiembed ([ " embed me " , " and me too " ], LinearAlgebra . normalize)
# calculate cosine distance between the two normalized embeddings as a simple dot product
msg . content ' * msg . content[:, 1 ] # [1.0, 0.787] aiclassify 함수를 사용하여 제공된 명령문을 true/false/unknow로 분류 할 수 있습니다. 이것은 사실 확인, 환각 또는 NLI 검사, 중재, 필터링, 감정 분석, 기능 엔지니어링 등에 유용합니다.
aiclassify ( " Is two plus two four? " )
# true시스템 프롬프트 및 고품질 모델은 인간에게 연기 할시기를 아는 것을 포함하여보다 복잡한 작업에 사용될 수 있습니다.
aiclassify ( :JudgeIsItTrue ; it = " Is two plus three a vegetable on Mars? " , model = " gpt4t " )
# unknown 위의 예에서는 다음 시스템 프롬프트 (및 별도의 사용자 프롬프트)로 자동 확장되는 프롬프트 템플릿 :JudgeIsItTrue 사용했습니다.
"당신은 제공된 진술이"참 "또는"거짓 "인지 여부를 평가하는 공정한 AI 판사입니다. 결정할 수없는 경우"알 수없는 "대답하십시오.
템플릿에 대한 자세한 내용은 템플릿 프롬프트 섹션을 참조하십시오.
aiclassify 정의 된 범주 세트 (최대 20)로 분류하는 데 사용될 수 있으므로 라우팅에 사용할 수 있습니다.
또한 선택을 Tuples ( (label, description) )로 제공하는 경우 모델은 설명을 사용하여 결정하지만 레이블을 반환합니다.
예:
choices = [( " A " , " any animal or creature " ), ( " P " , " for any plant or tree " ), ( " O " , " for everything else " )]
input = " spider "
aiclassify ( :InputClassifier ; choices, input) # -> returns "A" for any animal or creature
# Try also with:
input = " daphodil " # -> returns "P" for any plant or tree
input = " castle " # -> returns "O" for everything else후드 아래에서, 우리는 "로짓 바이어스"트릭을 사용하여 1 개의 생성 토큰 만 강제로 사용합니다. 즉, 매우 저렴하고 매우 빠릅니다!
REGEX로 데이터를 추출하는 데 지쳤습니까? LLM을 사용하여 텍스트에서 구조화 된 데이터를 추출 할 수 있습니다!
당신이해야 할 일은 추출하려는 데이터의 구조를 정의하는 것입니다. LLM은 나머지를 수행합니다.
struct로 return_type 정의하십시오. 필요한 경우 docstrings를 제공합니다 (결과를 개선하고 문서화를 돕습니다).
어려운 작업부터 시작하겠습니다. 주어진 위치에서 현재 날씨를 추출합니다.
@enum TemperatureUnits celsius fahrenheit
""" Extract the current weather in a given location
# Arguments
- `location`: The city and state, e.g. "San Francisco, CA"
- `unit`: The unit of temperature to return, either `celsius` or `fahrenheit`
"""
struct CurrentWeather
location :: String
unit :: Union{Nothing,TemperatureUnits}
end
# Note that we provide the TYPE itself, not an instance of it!
msg = aiextract ( " What's the weather in Salt Lake City in C? " ; return_type = CurrentWeather)
msg . content
# CurrentWeather("Salt Lake City, UT", celsius)그러나 텍스트에서 많은 엔티티를 추출하는 것과 같이 더 복잡한 작업에도 사용할 수 있습니다.
" Person's age, height, and weight. "
struct MyMeasurement
age :: Int
height :: Union{Int,Nothing}
weight :: Union{Nothing,Float64}
end
struct ManyMeasurements
measurements :: Vector{MyMeasurement}
end
msg = aiextract ( " James is 30, weighs 80kg. He's 180cm tall. Then Jack is 19 but really tall - over 190! " ; return_type = ManyMeasurements)
msg . content . measurements
# 2-element Vector{MyMeasurement}:
# MyMeasurement(30, 180, 80.0)
# MyMeasurement(19, 190, nothing) 구문 분석이 실패한 이유에 대한 유용한 설명과 함께 오류를 잡는 데 도움이되는 포장지도 있습니다. 자세한 내용은 ?PromptingTools.MaybeExtract
aiscan 기능을 사용하면 텍스트 인 것처럼 이미지와 상호 작용할 수 있습니다.
제공된 이미지를 간단히 설명 할 수 있습니다.
msg = aiscan ( " Describe the image " ; image_path = " julia.png " , model = " gpt4v " )
# [ Info: Tokens: 1141 @ Cost: $0.0117 in 2.2 seconds
# AIMessage("The image shows a logo consisting of the word "julia" written in lowercase") 또는 스크린 샷의 OCR을 수행 할 수 있습니다. 스크린 샷에서 SQL 코드를 전사합시다 (더 이상 Reyting!), 우리는 템플릿을 사용합니다 :OCRTask :
# Screenshot of some SQL code
image_url = " https://www.sqlservercentral.com/wp-content/uploads/legacy/8755f69180b7ac7ee76a69ae68ec36872a116ad4/24622.png "
msg = aiscan ( :OCRTask ; image_url, model = " gpt4v " , task = " Transcribe the SQL code in the image. " , api_kwargs = (; max_tokens = 2500 ))
# [ Info: Tokens: 362 @ Cost: $0.0045 in 2.5 seconds
# AIMessage("```sql
# update Orders <continue>Markdown을 통해 출력의 구문 강조 표시를 추가 할 수 있습니다.
using Markdown
msg . content |> Markdown . parseairetry!이것은 실험 기능이므로 명시 적으로 가져와야합니다.
using PromptingTools . Experimental . AgentTools 이 모듈은 ai... 함수에 "게으른"상대방을 제공하므로, aigenerate > AIGenerate (CAMELCASE)와 같은 통제 된 방식으로 사용할 수 있습니다 run! 호출됩니다.
예를 들어:
out = AIGenerate ( " Say hi! " ; model = " gpt4t " )
run! (out) 어떻게 유용합니까? 우리는 일부 출력을 검증하거나 재생하려는 경우 반복 호출에 동일한 "입력"을 사용할 수 있습니다. 우리에게 도움이되는 기능 airetry 있습니다.
airetry! airetry!(condition_function, aicall::AICall, feedback_function) aicall 객체의 조건 condition_function 평가합니다 (예 : f_cond(aicall) -> Bool ). 실패한 경우 aicall 객체에서 feedback_function 호출하여 AI 모델 (예 : f_feedback(aicall) -> String )에 대한 피드백을 제공하고 전달 될 때까지 또는 max_retries 값이 초과 될 때까지 프로세스를 반복합니다.
우리는 API 실패를 포착 할 수 있습니다 (피드백이 필요하지 않으므로 제공되지 않음)
# API failure because of a non-existent model
# RetryConfig allows us to change the "retry" behaviour of any lazy call
out = AIGenerate ( " say hi! " ; config = RetryConfig (; catch_errors = true ),
model = " NOTEXIST " )
run! (out) # fails
# we ask to wait 2s between retries and retry 2 times (can be set in `config` in aicall as well)
airetry! (isvalid, out; retry_delay = 2 , max_retries = 2 )또는 일부 출력 (예 : 형식, 콘텐츠 등)을 검증 할 수 있습니다.
우리는 컬러 추측 게임을 재생할 것입니다 ( "노란색"이라고 생각합니다) :
# Notice that we ask for two samples (`n_samples=2`) at each attempt (to improve our chances).
# Both guesses are scored at each time step, and the best one is chosen for the next step.
# And with OpenAI, we can set `api_kwargs = (;n=2)` to get both samples simultaneously (cheaper and faster)!
out = AIGenerate (
" Guess what color I'm thinking. It could be: blue, red, black, white, yellow. Answer with 1 word only " ;
verbose = false ,
config = RetryConfig (; n_samples = 2 ), api_kwargs = (; n = 2 ))
run! (out)
# # Check that the output is 1 word only, third argument is the feedback that will be provided if the condition fails
# # Notice: functions operate on `aicall` as the only argument. We can use utilities like `last_output` and `last_message` to access the last message and output in the conversation.
airetry! (x -> length ( split ( last_output (x), r" | \ . " )) == 1 , out,
" You must answer with 1 word only. " )
# Note: you could also use the do-syntax, eg,
airetry! (out, " You must answer with 1 word only. " ) do aicall
length ( split ( last_output (aicall), r" | \ . " )) == 1
end 여러 개의 airetry! 순서로 호출. 허용 된 최대 AI 통화 ( max_calls ) 또는 최대 재시도 ( max_retries )가 부족할 때까지 계속 재 시도합니다.
보다 복잡한 예제 및 사용 팁 ( ?airetry )은 문서를 참조하십시오. 우리는 MCT (Monte Carlo Tree Search)를 활용하여 일련의 검색 시퀀스를 최적화하므로 강력한 AI 워크 플로 (언어 에이전트 트리 검색 용지 및 DSPY Assertions Paper에서 영감을 얻음)를 구축하는 매우 강력한 도구입니다.
Ollama.ai는 컴퓨터에서 여러 대형 언어 모델 (LLM)을 실행할 수있는 놀랍도록 간단한 도구입니다. 어디서나 보내지 말아야 할 민감한 데이터를 사용하여 작업 할 때 특히 적합합니다.
Ollama를 설치하고 모델을 다운로드했으며 백그라운드에서 실행 중이라고 가정 해 봅시다.
aigenerate 기능으로 사용할 수 있습니다.
const PT = PromptingTools
schema = PT . OllamaSchema () # notice the different schema!
msg = aigenerate (schema, " Say hi! " ; model = " openhermes2.5-mistral " )
# [ Info: Tokens: 69 in 0.9 seconds
# AIMessage("Hello! How can I assist you today?") 등록 된 공통 모델 ( ?PT.MODEL_REGISTRY 참조)의 경우 스키마를 명시 적으로 제공 할 필요가 없습니다.
msg = aigenerate ( " Say hi! " ; model = " openhermes2.5-mistral " ) 그리고 우리는 또한 aiembed 기능을 사용할 수 있습니다.
msg = aiembed (schema, " Embed me " , copy; model = " openhermes2.5-mistral " )
msg . content # 4096-element JSON3.Array{Float64...
msg = aiembed (schema, [ " Embed me " , " Embed me " ]; model = " openhermes2.5-mistral " )
msg . content # 4096×2 Matrix{Float64}: 이제 aiscan 사용하여 Ollama 모델에 이미지를 제공 할 수 있습니다! 자세한 내용은 문서를 참조하십시오.
오류가 발생하는 경우 Ollama가 실행 중인지 확인하십시오. 아래 Ollama 섹션의 설정 안내서를 참조하십시오.
Mistral 모델은 오랫동안 오픈 소스 공간을 지배 해 왔습니다. 이제 API를 통해 사용할 수 있으므로 romptingtools.jl과 함께 사용할 수 있습니다!
msg = aigenerate ( " Say hi! " ; model = " mistral-tiny " ) 우리는 PromptingTools.MODEL_REGISTRY 에 모델을 등록했기 때문에 모두 작동합니다! 현재 사용 가능한 4 가지 모델이 있습니다 : mistral-tiny , mistral-small , mistral-medium , mistral-embed .
후드 아래에서, 우리는 OpenAI 특정 코드 기반의 대부분을 활용하는 전용 스키마 MistralOpenAISchema 사용하므로 항상 첫 번째 인수로 명시 적으로 제공 할 수 있습니다.
const PT = PromptingTools
msg = aigenerate (PT . MistralOpenAISchema (), " Say Hi! " ; model = " mistral-tiny " , api_key = ENV [ " MISTRAL_API_KEY " ]) 보시다시피, 우리는 ENV에서 또는 preverences.jl 메커니즘을 통해 API 키를로드 할 수 있습니다 (자세한 내용은 ?PREFERENCES 참조).
그러나 Mistralai는 유일한 것은 아닙니다! 다른 많은 흥미로운 제공 업체가 있습니다. OpenAI API (예 : role 및 content 키가있는 messages 보내기)와 호환되는 한 schema = CustomOpenAISchema() 사용하여 PromptingTools.jl과 함께 사용할 수 있습니다.
# Set your API key and the necessary base URL for the API
api_key = " ... "
prompt = " Say hi! "
msg = aigenerate (PT . CustomOpenAISchema (), prompt; model = " my_model " , api_key, api_kwargs = (; url = " http://localhost:8081 " ))보시다시피, 컴퓨터에서 실행 한 현지 모델에도 적용됩니다!
참고 : 현재, 우리는 Mistralai 및 기타 OpenAi 호환 API에 대한 aigenerate 및 aiembed 기능 만 지원합니다. 우리는 향후 지원을 확장 할 계획입니다.
ANTHROPIC_API_KEY 환경 변수가 API 키로 설정되어 있는지 확인하십시오.
# cladeuh is alias for Claude 3 Haiku
ai " Say hi! " claudeh 사전 설정 모델 별칭은 Claude 3 Opus, Sonnet 및 Haiku의 claudeo , claudes 및 claudeh 입니다.
해당 스키마는 AnthropicSchema 입니다.
이름에는 XML 있는 몇 가지 프롬프트 템플릿이 있으며, 이들은 섹션을 분리하기 위해 인류 친화적 인 XML 형식을 사용 함을 시사합니다. aitemplates("XML") 로 찾으십시오.
# cladeo is alias for Claude 3 Opus
msg = aigenerate (
:JuliaExpertAskXML , ask = " How to write a function to convert Date to Millisecond? " ,
model = " cladeo " )Tbu ...
예제/ 폴더에서 더 많은 예를 찾으십시오.
패키지는 세 가지 주요 요소를 중심으로 구축되었습니다.
aigenerate , aiembed , aiclassify ) 제공 왜이 디자인? API는 다른 프롬프트 형식이 필요합니다. 예를 들어, OpenAi의 API는 role 및 content 필드가있는 다양한 사전이 필요하지만 Zephyr-7B 모델 용 Ollama의 API에는 하나의 큰 문자열이있는 Chatml 스키마와 <|im_start|>usernABC...<|im_end|>user 분리기가 필요합니다. 프롬프트에서 섹션을 분리하려면 OpenAi는 Markdown 헤더 ( ##Response )와 인류가 html 태그 ( <text>{{TEXT}}</text> )에서 더 잘 수행합니다.
이 패키지는 강사에서 큰 영감을 받았으며 API 호출 기능을 영리하게 사용합니다.
프롬프트 스키마
LLM에 대한 입력을 준비하고 (다중 발송을 통해) 호출하는 논리의 사용자 정의에 사용되는 핵심 유형.
모두 AbstractPromptSchema 의 하위 유형이며 각 작업 기능은 첫 번째 위치 foo(schema::AbstractPromptSchema,...) 에 스키마가있는 일반 서명을 가지고 있습니다.
파견은 프롬프트 ( render )의 "렌더링"과 API ( aigenerate )를 호출하기 위해 정의됩니다.
이상적으로는 각각의 새로운 인터페이스는 별도의 llm_<interface>.jl 파일 (예 : llm_openai.jl )으로 정의됩니다.
메시지
프롬프트는 효과적으로 완료 될 대화입니다.
대화에는 세 가지 주요 행위자, 즉 시스템 (전체 지침), 사용자 (입력/데이터) 및 AI 비서 (출력)가있는 경향이 있습니다. 우리는 각각에 대해 SystemMessage , UserMessage 및 AIMessage 유형을 제공합니다.
프롬프트 스키마와 하나 이상의 메시지가 주어지면 결과 객체를 모델 API에 공급하도록 render 할 수 있습니다. 예를 들어 Openai의 경우
using PromptingTools : render, SystemMessage, UserMessage
PT = PromptingTools
schema = PT . OpenAISchema () # also accessible as the default schema `PT.PROMPT_SCHEMA`
conversation = conversation = [
SystemMessage ( " Act as a helpful AI assistant. Provide only the information that is requested. " ),
UserMessage ( " What is the capital of France? " )]
messages = render (schema, conversation)
# 2-element Vector{Dict{String, String}}:
# Dict("role" => "system", "content" => "Act as a helpful AI assistant. Provide only the information that is requested.")
# Dict("role" => "user", "content" => "What is the capital of France?")이 객체는 OpenAI API에 직접 제공 될 수 있습니다.
작업 지향 기능
열망은 일반적인 작업에 대한 기억하기 쉬운 기능을 제공하는 것입니다. 따라서 모두 ai... 로 시작합니다. 모든 기능은 응답 결과로 가벼운 래퍼를 반환해야합니다. 현재, 그것은 AIMessage (텍스트 기반 응답의 경우) 또는 일반 DataMessage (임베딩과 같은 구조화 된 데이터의 경우) 일 수 있습니다.
모델 API와 그 매개 변수의 차이 (예 : OpenAI API vs Ollama)의 차이를 고려할 때, 작업 함수는 schema::AbstractPromptSchema 에서 첫 번째 인수로 발송됩니다.
예제 구현은 src/llm_openai.jl 참조하십시오. 각각의 새 인터페이스는 별도의 llm_<interface>.jl 파일로 정의됩니다.
OpenAi의 모델은 AI 연구의 최전선에 있으며 많은 작업에 강력하고 최첨단 기능을 제공합니다.
그렇지 않거나 사용할 수없는 상황이 있습니다 (예 : 개인 정보 보호, 비용 등). 이 경우 로컬 모델 (예 : Ollama) 또는 기타 API (예 : Anthropic)를 사용할 수 있습니다.
참고 : Ollama.ai를 시작하려면 아래 Ollama 섹션의 설정 안내서를 참조하십시오.
많은 대안이 있습니다.
글을 쓰는 시점에서 OpenAI는 API 호출을 사용하여 모델을 훈련시키지 않습니다.
API
OpenAI는 API에 의해 제출되고 생성 된 데이터를 사용하여 OpenAI 모델을 훈련 시키거나 OpenAI의 서비스 오퍼링을 개선하지 않습니다. 모델의 지속적인 개선을 지원하기 위해이 양식을 옵트 인으로 작성하여 데이터를 공유 할 수 있습니다. - 데이터가 모델을 개선하는 데 사용되는 방법
OpenAI의 데이터 페이지를 사용하는 방법에 대한 최신 정보를 항상 다시 확인할 수 있습니다.
자원:
계정에 가입하고 OpenAI 웹 사이트의 API 섹션에 액세스하여 OpenAI에서 API 키를 얻을 수 있습니다.
자원:
팁
항상 지출 한도를 설정하십시오!
OpenAI를 사용하면 예기치 않은 비용을 방지하기 위해 계정 대시 보드에서 지출 한도를 직접 설정할 수 있습니다.
좋은 출발은 C. $ 5의 소프트 한계와 c. $ 10의 단단한 한계 일 수 있습니다.
자원:
로컬 모델 (예 : Ollama와 함께)을 사용하는 경우 무료입니다. 상용 API (예 : OpenAI)를 사용하는 경우 "토큰"(하위 단어 단위) 당 지불 할 수 있습니다.
예를 들어, 간단한 질문과 1 개의 문장 응답이있는 간단한 요청 (”는 xyz a 긍정적 인 의견”) 비용이 ~ $ 0.0001 (즉, 100 분의 1) 비용이 듭니다.
비용을 지불 할 가치가 있습니까?
Genai는 시간을 사는 방법입니다! 매일 수십 분을 절약하기 위해 센트를 지불 할 수 있습니다.
위의 예를 계속하면 200 개의 댓글이 200 개의 테이블이 있다고 상상해보십시오. 이제 필요한 기능/수표를 위해 LLM으로 각각을 구문 분석 할 수 있습니다. 통화 당 가격이 $ 0.0001이라고 가정하면 작업에 대해 2 센트를 지불하고 30-60 분을 절약 할 수 있습니다!
자원:
이것은 OpenAI의 API 키를위한 안내서이지만 필요한 다른 API 키 (예 : Mistralai API의 경우 MISTRAL_API_KEY )에서 작동합니다.
romptingtools.jl과 함께 OpenAI API를 사용하려면 API 키를 환경 변수로 설정하십시오.
ENV [ " OPENAI_API_KEY " ] = " your-api-key "일회성으로, 당신은 다음을 수행 할 수 있습니다.
export OPENAI_API_KEY = <your key> 출시하기 전에 터미널에 설정하십시오.setup.jl 에 설정하십시오 (Github에 커밋하지 마십시오!) 변수를 설정하는 동일한 터미널 창에서 Julia를 시작하십시오. Julia를 쉽게 확인하고 ENV["OPENAI_API_KEY"] 실행하면 키를 볼 수 있습니다!
더 나은 방법 :
~/.zshrc )에 추가하십시오. 터미널을 시작할 때마다 자동으로로드됩니다. 우리는 또한 preferences.jl을 지원하므로 간단히 실행할 수 있습니다 : PromptingTools.set_preferences!("OPENAI_API_KEY"=>"your-api-key") 는 세션에서 지속됩니다. 현재 환경 설정을 보려면 PromptingTools.get_preferences("OPENAI_API_KEY") 실행하십시오.
API 키를 세계에 보여주기 때문에 LocalPreferences.toml Github에 저지르지 않도록주의하십시오!
자원:
aigenerate ( api_kwargs )에서 API 키워드 인수 이해자세한 내용은 OpenAI API 참조를 참조하십시오.
어디서나 쉽게 액세스 할 수 있도록 startup.jl 에 PromptingTools를 추가하십시오 ( ~/.julia/config/startup.jl 에서 찾을 수 있음).
다음 스 니펫 추가 :
using PromptingTools
const PT = PromptingTools # to access unexported functions and types
이제 모든 REPL 세션에서 ai"Help me do X to achieve Y" 사용할 수 있습니다!
PromptingTools.jl의 정신은 오픈 소스 LLM을 포함하여 원하는 모델을 사용할 수 있도록하는 것입니다. 가장 인기 있고 가장 쉬운 설정은 Ollama.ai입니다. 자세한 내용은 아래를 참조하십시오.
Ollama는 간단한 API를 통해 액세스 할 수있는 LLM을 호스팅하는 백그라운드 서비스를 실행합니다. 어디서나 보내지 말아야 할 민감한 데이터로 작업 할 때 특히 유용합니다.
설치는 매우 쉽습니다. 여기에서 최신 버전을 다운로드하기 만하면됩니다.
설치 한 후에는 앱을 시작하면 갈 준비가되었습니다!
실행 중인지 확인하려면 브라우저로 이동하여 127.0.0.1:11434 엽니 다. "Ollama가 실행 중입니다"라는 메시지가 표시됩니다. 또는 터미널에서 ollama serve 실행할 수 있으며 이미 실행 중이라는 메시지를 얻을 수 있습니다.
Ollama Library에는 Llama2, Codellama, Sqlcoder 또는 개인적으로 좋아하는 openhermes2.5-mistral 포함하여 많은 모델이 있습니다.
ollama pull <model_name> 로 새로운 모델을 다운로드하십시오 (예 : ollama pull openhermes2.5-mistral ).
ollama list 있는 현재 사용 가능한 모델을 보여줍니다.
자세한 내용은 Ollama.ai를 참조하십시오.
미세 조정은 모델을 특정 사용 사례 (주로 형식/구문/작업)에 조정하는 강력한 기술입니다. 예제의 데이터 세트가 필요하며, 이제 remptingtools.jl로 쉽게 생성 할 수 있습니다!
대화 (메시지의 벡터)를 PT.save_conversation("filename.json", conversation) 으로 파일에 저장할 수 있습니다.
미세 조정 시간이 오면 단일 .jsonl 파일로 ShareGpt 형식 대화 (공통 양조 형식)의 묶음을 만듭니다. PT.save_conversations("dataset.jsonl", [conversation1, conversation2, ...]) (함수 이름의 복수의 "대화"에 주목하십시오).
엔드 투 엔드 미세 조정 프로세스의 예는 자매 프로젝트 Juliallmleaderboard Finetuning 실험을 확인하십시오. Jarvislabs.ai 및 Axolotl을 사용하여 반 달러 동안 미세 조정 과정을 보여줍니다.
이것은 앞으로보고 싶은 기능 목록입니다 (특정 순서없이).
자세한 내용, 기부금 또는 질문은 romptingtools.jl github 리포지토리를 방문하십시오.
PromptingTools.jl은 원활한 경험을 제공하는 것을 목표로하지만 외부 API에 의존하여 변경 될 수 있습니다. 업데이트 및 새로운 기능을 위해 저장소에 계속 지켜봐주십시오.
AI로 응용 프로그램을 강화하기 위해 romptingtools.jl을 선택해 주셔서 감사합니다!