在現代商業的動態世界中,通信和高效的工作流對成功至關重要,人工智能(AI)解決方案已經成為競爭優勢。
AI 智能體基于先進的 大語言模型 (LLM)構建,并由 NVIDIA NIM 提供支持,能夠以無縫方式提高工作效率和信息流。NIM 是 NVIDIA AI Enterprise 的一部分,是一套易于使用的微服務,旨在跨云、數據中心和工作站安全、可靠地部署高性能 AI 模型推理。
通過利用 NIM 微服務的強大功能,企業可以利用 API Catalog 中的模型 ,快速構建超越簡單自動化的 智能 Slackbot 。這表明 API Catalog 可用于生產部署。這些 Slackbot 成為寶貴的虛擬助手,能夠處理各種任務——從回答基本查詢到解決復雜問題,甚至生成創意內容。這不僅可以節省時間和資源,還可以打造更具協作性和高效的工作環境。
在本文中,我將逐步指導您使用 NVIDIA NIM 和 LangChain 針對特定用例創建自定義 Slackbot 智能體。
Slackbot 功能和架構?
Slackbot 的初始實施支持通過 Slack 通道、線程和聊天機器人個人信息進行交互。支持這種交互的主要模型是 llama-3_1-405b-instruct ,可以訪問外部工具來增強響應。這些工具涉及調用和預處理外部端點。
Slackbot 的主要特性包括:
- 多渠道支持: Slackbot 可以受邀參加任何渠道,并回答與該渠道上下文相關的查詢。
- 通過標記進行交互 : 要開始對話,用戶需要標記機器人并提出一個綜合問題。機器人會在同一個頻道中標記用戶,并在一個主題中回復。
- 可自定義的回答 :Slackbot 可能會跟進澄清問題,或使用外部工具生成回答。它還支持私人消息。
對于架構(圖 1),Amazon EC2 用作項目的主要主機,Amazon Aurora PostgreSQL 用作跟蹤人類-AI Slack 交互的數據庫。其他云提供商如 Microsoft Azure 或 Google Cloud 也可作為替代方案。
在內存管理方面,DynamoDB 與 LangChain 的 DynamoDBChatMessageHistory 相結合,用于跟蹤先前的用戶交互。
創建 Slackbot 智能體的分步指南?
以下是在 AWS 上部署 Slackbot 的步驟:
- 安裝所需的庫
- 定義主智能體
- 設置 DynamoDB 進行內存管理
- 配置對話式內存
- 定義基于關鍵字的工具用法
- 完成智能體
- 在 Amazon Aurora PostgreSQL 中保存交互
預備知識?
在開始構建 Slackbot 之前,請確保:
- 設置 Slack 。
- 熟悉一下 LangChain 和代理
安裝所需的庫包括以下內容:
openai boto3 slack_bolt slack - sdk langchain python - dotenv langchain - community langchain - nvidia - ai - endpoints python - dotenv langchainhub |
您還需要以下資源:
- 來自的 API 密鑰 NVIDIA API Catalog
- AWS 帳戶 (適用于 Amazon EC2、Amazon Aurora、Amazon DynamoDB、Amazon ElastiCache 等) 或類似云服務。
- Jupyter Lab notebook 用于初始測試
安裝所需的庫?
在設置代理之前,請確保安裝了必要的庫,例如 LangChain、 LangChain NVIDIA AI 端點 、Slack SDK 等:
pip install openai boto3 slack_bolt slack - sdk langchain python - dotenv langchain - community langchain - nvidia - ai - endpoints langchainhub |
定義主智能體?
接下來,定義用于用戶交互的主要 Slack 功能,并將 NIM 模型集成為主代理 。
from slack_bolt import App from slack_bolt.adapter.socket_mode import SocketModeHandler from dotenv import load_dotenv from langchain.agents import AgentExecutor, create_react_agent from langchain.memory import ConversationBufferWindowMemory from langchain_core.prompts import PromptTemplate from langchain_nvidia_ai_endpoints import ChatNVIDIA def agent(user_id, thread_id, channel_name, message_text): try : llm = ChatNVIDIA( model = "meta/llama-3.1-405b-instruct" , temperature = 0.1 , top_p = 1 , max_tokens = 2000 , ) |
使用 Meta 的 Llama-3 模型,該模型支持代理任務。在同一函數中,聲明 代理工具 ,這是 AI 代理用于完成超出其固有能力的任務的外部資源。這些工具可以具有任意范圍,前提是它們具有有效的 API 端點:
tools = [ CalculatorTool(), CopilotTool(), BrowsingTool(), ... #Other Tools ] |
設置 DynamoDB 進行內存管理?
要跟蹤代理交互,請初始化 DynamoDB 表并配置會話內存:
# Specify the region where the table is created boto3.setup_default_session(region_name = 'us-east-2' ) # Initialize DynamoDBChatMessageHistory session_id = channel_name # Use channel_name as session ID history = DynamoDBChatMessageHistory(table_name = "SessionTable" , session_id = session_id) |
配置對話式內存?
將聊天消息歷史記錄集成到 agent 的對話內存中:
conversational_memory = ConversationBufferWindowMemory( memory_key = 'chat_history' , k = 10 , return_messages = True , input_key = 'input' , output_key = 'output' , chat_memory = history ) |
定義基于關鍵字的工具用法?
您可以添加基于關鍵字的觸發器,以提示機器人使用特定工具。
# Check for specific hashtags and use the corresponding tool if "%intro" in message_text.lower(): result = INTRO_MESSAGE elif "%gtc24" in message_text.lower(): selected_tool = GTCFAQTool() result = selected_tool._run(message_text) ... else : # Read the template from prompt.txt file with open ( 'prompt.txt' , 'r' ) as file : template = file .read() prompt = PromptTemplate.from_template(template) |
要提示您的特定用例,請查看 LangChain Hub 。
完成智能體?
ReACT 是一個框架,其中大型語言模型(LLM)將推理與行動相結合。使用它根據所提供的示例解決任務。使用預定義的變量創建 ReACT 代理和代理執行程序:
# LLM is the NIM agent, with ReACT prompt and defined tools react_agent = create_react_agent( llm = llm, tools = tools, prompt = prompt ) # Connect to DB for memory, add react agent and suitable exec for Slack agent_executor = AgentExecutor( agent = react_agent, tools = tools, verbose = True , handle_parsing_errors = True , return_intermediate_steps = True , memory = conversational_memory ) |
在 Amazon Aurora PostgreSQL 中保存交互?
將交互保存在 Amazon Aurora PostgreSQL 數據庫的預定義函數中:
save_conversation(user_id, thread_id, channel_name, message_text, result) return result |
您可以根據給定用例向代理流添加各種錯誤處理機制。
- 為工具失敗時的自定義消息添加異常處理程序。
- 工具執行時間過長的超時消息
- 讓用戶知道該工具失敗的錯誤消息
配置 Slack 交互?
設置權限并安裝所需庫后,加載環境變量并初始化 Slack 應用。請確保使用正確的標點符號,并將任何名稱、LLM 模型和公式替換為原始內容中的英文版本。如果翻譯內容看起來像是 LLM 模型名稱,請使用原始內容。
# Load environment variables load_dotenv( ".env" ) # Initialize Slack app app = App(token = os.getenv( 'SLACK_BOT_TOKEN' )) |
如要配置任何預定義消息、常量和長提示,請添加文本格式的文件,并分別調用它們。
# Constant examples MAX_BLOCK_CHARS = 3000 #Slack char limit MESSAGE_FOLDER = "messages" def load_message(file_name): file_path = os.path.join(MESSAGE_FOLDER, file_name) with open (file_path, 'r' ) as file : return file .read() #Example loading automatic message INTRO_MESSAGE = load_message( 'greeting_message.txt' ) |
通信處理方式有多種,包括用于提及應用的自定義事件、向 Slack 發布和發送消息,以及在消息超過字符限制時將其拆分成多個塊。
要使代理能夠處理直接消息,請設置事件監聽器:
# Add event listener for direct messages @app .event( "message" ) def handle_direct_message_events(body, say, logger): event = body[ 'event' ] if event.get( 'channel_type' ) = = 'im' : user_id = event[ 'user' ] thread_id = event.get( 'ts' ) channel_name = event[ 'channel' ] # Use the user ID as channel_name text = event[ 'text' ].strip() response = agent_with_timeout(user_id, thread_id, channel_name, text) if response is not None : post_message_to_slack(channel_name, response, thread_id, user_id) |
為智能體創建自定義工具?
要添加自定義工具,請為每個工具提供清晰的名稱和詳細說明,以擴展 LangChain BaseTool
類:
class CustomTool(BaseTool): name = "Custom Tool" description = """ Tool used to fetch information ... """ |
請確保描述全面,并包含在提示中使用的示例。之后,將該工具附加到智能體的工具集。
您還可以針對各種場景自定義工具行為,例如使用正則表達式模式來匹配 Slack 的界面布局,用于編碼塊。
這種方法可確保每個工具都針對特定需求進行定制,并增強 agent 的通用性。
管理智能體交互和內存?
要存儲代理用戶交互,請連接到 Amazon Aurora PostgreSQL 數據庫實例。
DB_NAME = os.getenv( 'DB_NAME' ) DB_USER = os.getenv( 'DB_USER' ) DB_PASSWORD = os.getenv( 'DB_PASSWORD' ) DB_HOST = os.getenv( 'DB_HOST' ) DB_PORT = os.getenv( 'DB_PORT' ) |
一些核心功能有助于管理數據庫功能。您可以手動創建數據庫或使用腳本實現流程自動化。以下代碼示例顯示了一個用于保存代理人-人類對話的函數:
# Function to save a conversation def save_conversation(user_id, thread_id, channel_name, message_text, response): try : conn = psycopg2.connect( dbname = DB_NAME, user = DB_USER, password = DB_PASSWORD, host = DB_HOST, port = DB_PORT ) c = conn.cursor() c.execute( """INSERT INTO history (user_id, thread_id, channel_name, message_text, response) VALUES (%s, %s, %s, %s, %s)""" , (user_id, thread_id, channel_name, message_text, response)) conn.commit() conn.close() print ( "Conversation saved successfully" ) except psycopg2.Error as e: print ( "Error saving conversation:" , e) |
在此函數中,關鍵交互詳細信息(例如用戶 ID、通道名稱和消息)存儲在數據庫中,以供日后參考。
對于內存管理,請使用 DynamoDB 跟蹤對話會話并維護上下文。
# Initialize the DynamoDB resource using the IAM role credentials in the Ohio region dynamodb = boto3.resource( 'dynamodb' , region_name = 'us-east-2' ) # Create the DynamoDB table table = dynamodb.create_table( TableName = 'SessionTable' , KeySchema = [ { 'AttributeName' : 'SessionId' , 'KeyType' : 'HASH' # Partition key } ], AttributeDefinitions = [ { 'AttributeName' : 'SessionId' , 'AttributeType' : 'S' } ], BillingMode = 'PAY_PER_REQUEST' ) |
后續步驟和增強功能?
要進一步優化 Slackbot,請考慮以下增強功能:
- 增加安全性 :使用 NVIDIA NeMo Guardrails 來增強安全性和控制力。
- 下載并部署 NIM: 使用簡單指南部署 NVIDIA NIM 的生成式 AI。
- 監控代理性能 :通過集成 pgAdmin 并連接到數據可視化工具 (如 Tableau 或 PowerBI ) 來監控代理性能。
- 擴展 Slackbot 功能: 添加其他工具和數據源,例如常見問題解答(FAQ)或論壇。
- 整合緩存: 使用 ElastiCache 縮短響應時間并提高效率。
- 添加日志記錄和追蹤功能: 使用 Amazon CloudWatch 或 LangSmith 進行增強監控和調試。
繼續探索自定義 Slackbots 之外的其他機器人?
AI 智能體正在通過自動執行任務、優化流程和提高生產力來轉變企業應用。 NVIDIA NIM 微服務 提供了一種無縫集成多個代理和工具的方式,使企業能夠創建定制的 AI 驅動解決方案。
在本文中,我演示了如何使用 NIM AI 端點 創建具有自定義工具的端到端 Slackbot 智能體。這一解決方案增強了簡單的 Slack 界面,使其能夠處理更復雜的任務并解決獨特的挑戰。
有關更多示例,請查看 官方/NVIDIA/GenerativeAIExamples GitHub 庫 。有關使用 NIM 微服務和 LangChain 構建的更多信息,請參閱 NVIDIA AI LangChain 端點。
?
?
?