GoalChain 是一個簡單但有效的框架,用於為人類與法學碩士以及法學碩士與法學碩士之間的交互提供以目標為導向的對話流程。
pip install goalchain
讓我們導入Field
、 ValidationError
、 Goal
和GoalChain
類,它們是對話流的基礎。
from goalchain import Field , ValidationError , Goal , GoalChain
在此範例中,我們將建立一個人工智慧助手,其目標是從客戶收集有關其所需產品訂單的資訊。我們使用ProductOrderGoal
中的Field
物件定義要收集的信息,該物件是Goal
的子級:
我們也為數量定義了一個驗證器(在型別轉換為 int 之後)。 ValidationError
用於將錯誤訊息傳回對話。這些訊息應該是人類可讀的。
format_hint
是LLM的JSON模式輸出的自然語言類型提示。
def quantity_validator ( value ):
try :
value = int ( value )
except ( ValueError , TypeError ):
raise ValidationError ( "Quantity must be a valid number" )
if value <= 0 :
raise ValidationError ( "Quantity cannot be less than one" )
if value > 100 :
raise ValidationError ( "Quantity cannot be greater than 100" )
return value
class ProductOrderGoal ( Goal ):
product_name = Field ( "product to be ordered" , format_hint = "a string" )
customer_email = Field ( "customer email" , format_hint = "a string" )
quantity = Field ( "quantity of product" , format_hint = "an integer" , validator = quantity_validator )
如果客戶改變主意,讓我們建立另一個名為OrderCancelGoal
的Goal
子類別。我們將要求客戶提供取消正在進行的訂單的可選原因。透過在描述中指定該欄位為“(可選)”,法學碩士將知道實現目標不是必需的。
class OrderCancelGoal ( Goal ):
reason = Field ( "reason for order cancellation (optional)" , format_hint = "a string" )
請注意,欄位物件名稱(例如product_name
直接傳遞到LLM提示符,因此它們是提示工程任務的一部分,就像所有其他字串一樣。
本質上,我們定義的類別就像由客戶填寫的表格,但它們缺乏說明。讓我們透過將類別實例化為物件來新增它們。
product_order_goal = ProductOrderGoal (
label = "product_order" ,
goal = "to obtain information on an order to be made" ,
opener = "I see you are trying to order a product, how can I help you?" ,
out_of_scope = "Ask the user to contact sales team at [email protected]"
)
order_cancel_goal = OrderCancelGoal (
label = "cancel_current_order" ,
goal = "to obtain the reason for the cancellation" ,
opener = "I see you are trying to cancel the current order, how can I help you?" ,
out_of_scope = "Ask the user to contact the support team at [email protected]" ,
confirm = False
)
我們定義
opener
- 人工智慧助理在沒有事先輸入的情況下將使用的東西,confirm
標誌確定 AI 助手在擁有使用Field
物件定義的所有必需資訊後是否會要求確認。預設為True
。我們不需要對訂單取消目標進行確認,因為它本身已經是一種確認。
接下來我們需要將目標連結在一起。
product_order_goal . connect ( goal = order_cancel_goal ,
user_goal = "to cancel the current order" ,
hand_over = True ,
keep_messages = True )
user_goal
是另一個「to ...」語句。如果沒有hand_over=True
AI 代理程式將使用罐裝opener
進行回應。將其設為True
可確保對話順利進行。有時您可能需要預設回复,有時則不需要。
keep_messages=True
表示order_cancel_goal
將收到與product_order_goal
對話的完整歷史記錄,否則它將被擦除。同樣,有時可能需要擦除對話歷史記錄,例如在模擬不同的人工智慧個性時。
我們還要考慮一下真正猶豫不決的客戶的可能性。我們也應該給他們「取消取消」的選項。
order_cancel_goal . connect ( goal = product_order_goal ,
user_goal = "to continue with the order anyway" ,
hand_over = True ,
keep_messages = True )
在某些時候,您可能想知道是否可以在沒有任何Field
物件的情況下實現目標。你可以!這樣的目標是僅由其具有的連接定義的路由目標。例如,這在語音郵件選單系統中很有用。
您可能還想知道是否可以將目標與其本身聯繫起來。你可以!例如,當將confirm=False
與Goal
繼承物件一起使用時,您需要某種類型的連續使用者輸入,這非常有用。
您也可以連結連接,例如goal.connect(...).connect(...).connect(...)
最後,讓我們使用GoalChain
設定初始目標並測試我們的AI銷售助理!
goal_chain = GoalChain ( product_order_goal )
請注意,每個目標都可以使用 LiteLLM 啟用的單獨的 LLM API,並且如果您設定了所需的環境變量,則可以使用受支援的模型提供者中的任何模型。
預設型號為"gpt-4-1106-preview"
,即:
product_order_goal = ProductOrderGoal (...
model = "gpt-4-1106-preview" ,
json_model = "gpt-4-1106-preview"
)
您也可以使用params
傳遞 LiteLLM 通用參數,例如:
product_order_goal = ProductOrderGoal (...
model = "gpt-4-1106-preview" ,
json_model = "gpt-4-1106-preview" ,
params = { "temperature" : 1.5 , "max_tokens" : 10 }
)
您也可以使用params
來使用 VLLM 呼叫本地模型。
使用預設的"gpt-4-1106-preview"
模型時,請記住設定OPENAI_API_KEY
環境變數。
import os
os . environ [ "OPENAI_API_KEY" ] = "sk-ABC..."
注意:到目前為止的程式碼可作為要點。將其貼到 Jupyter 筆記本中,然後執行!pip install goalchain
以開始使用下面的即時範例。
通常是使用者先提示 AI 代理,但如果不是這種情況,我們呼叫get_response
時不帶任何參數,或使用None
作為參數:
goal_chain . get_response ()
{'type': 'message',
'content': 'Great choice! Could you please provide me with your email address to proceed with the order?',
'goal': <__main__.ProductOrderGoal at 0x7f8c8b687110>}
GoalChain 傳回dict
其中包含回應類型( message
或data
)、回應內容(現在只是我們的預設回應)和目前的Goal
繼承物件。
讓我們向我們的人工智慧助理查詢潛在的購買情況。
goal_chain . get_response ( "Hi, I'd like to buy a vacuum cleaner" )
{'type': 'message',
'content': 'Great! Could you please provide your email address so we can send the confirmation of your order?',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
人工智慧助理正在努力實現當前目標,並收集訂單所需的資訊。
goal_chain . get_response ( "Sure, it is [email protected]" )
{'type': 'message',
'content': 'Thank you, John. Which model of vacuum cleaner would you like to order?',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
goal_chain . get_response ( "The 2000XL model" )
{'type': 'message',
'content': 'How many of the 2000XL model would you like to order?',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
讓我們測試一下我們的AI助理是否可以處理當前訂單的取消。
goal_chain . get_response ( "Actually I changed my mind, cancel this order" )
{'type': 'message',
'content': 'Of course, I can assist with that. Could you please tell me the reason for the cancellation?',
'goal': <__main__.OrderCancelGoal at 0x7ff0fb275650>}
它起作用了。請注意,返回的目標現在是OrderCancelGoal
類型。我們改變了目標。我們也測試一下是否可以切換回來。
goal_chain . get_response ( "Actually, yeah, I would like to buy the vacuum cleaner" )
{'type': 'message',
'content': 'Understood. How many of the 2000XL model would you like to order?',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
我們回到ProductOrderGoal
。
goal_chain . get_response ( "1 please" )
{'type': 'message',
'content': 'To confirm, you would like to order one 2000XL vacuum cleaner and the order will be sent to [email protected], is that correct?',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
AI助理確認了我們的訂單。如果我們不喜歡這種行為,我們將使用confirm=False
。
讓我們看看助手如何回應超出範圍的查詢。
goal_chain . get_response ( "Is it a good vacuum cleaner? What do you think?" )
{'type': 'message',
'content': "For product reviews and additional information, I recommend contacting our sales team at [email protected]. They can help with your inquiries. Meanwhile, can you please confirm if you'd like to proceed with the order for one 2000XL vacuum cleaner to [email protected]?",
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
人工智慧助理將我們重新導向到先前定義的銷售團隊收件匣,並再次確認。
但讓我們丟一個曲線球...
goal_chain . get_response ( "Ok, I'd actually like to make that an order of 500" )
{'type': 'message',
'content': "Just to clarify, you'd like to order 500 units of the 2000XL vacuum cleaner, with the order confirmation sent to [email protected]. Is that correct?",
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
goal_chain . get_response ( "Yes" )
{'type': 'message',
'content': 'I’m sorry, but I need to inform you that the quantity cannot be greater than 100 for an order. If you would like to proceed with an order within this limit, please let me know.',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
我們使用的驗證器已向 AI 助理提供了足夠的信息,以證明其無法透過ValidationError
訊息處理此數量的原因。
請注意,出於代幣效率和效能原因,GoalChain 僅在Goal
完成後才驗證輸入。如果您想隨時驗證輸入,您有兩種選擇:
使用只有一個Field
的Goal
,並confirm=False
。將這些目標連結起來,而不是在單一Goal
中使用多個欄位。
使用軟提示,例如quantity = Field("quantity of product (no more than 100)", format_hint="an integer")
。這種方法並非萬無一失,因此仍然建議使用驗證器。然而,用戶將立即收到回饋。
讓我們完成訂單。
goal_chain . get_response ( "Alright, I'll guess I'll just go with 1" )
{'type': 'message',
'content': 'To confirm, you would like to order one 2000XL vacuum cleaner and the order will be sent to [email protected], is that correct?',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
goal_chain . get_response ( "That's right" )
{'type': 'data',
'content': {'customer_email': '[email protected]',
'product_name': '2000XL',
'quantity': 1},
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
傳回的內容是從LLM的JSON模式的輸出解析出來的字典。鍵是我們的欄位實例名稱。現在,我們可以使用這些資料執行某種操作,例如處理假設的 2000XL 吸塵器的訂單。
請注意,實際上,如果您正在建立這樣的系統,則需要製定專門的產品查找目標,以免允許任意或無意義的產品名稱。
讓我們透過simulate_response
發送訂單已處理的確認訊息。我們還將使用rephrase = True
來重新表述輸出,如果客戶頻繁與目標交互,這將顯得更加自然。
goal_chain . simulate_response ( f"Thank you for ordering from Acme. Your order will be dispatched in the next 1-3 business days." , rephrase = True )
{'type': 'message',
'content': 'We appreciate your purchase with Acme! Rest assured, your order will be on its way within the next 1 to 3 business days.',
'goal': <__main__.ProductOrderGoal at 0x7ff0fb283090>}
此時,我們可以結束會話或連接回選單或路由目標以進行進一步輸入。
如果您想自訂 GoalChain 或為 GoalChain 做出貢獻,或報告任何問題,請造訪 GitHub 頁面。