• <xmp id="om0om">
  • <table id="om0om"><noscript id="om0om"></noscript></table>
  • 對話式人工智能

    使用 NVIDIA NIM 和 LangChain 創建自定義 Slackbot LLM 智能體

    在現代商業的動態世界中,通信和高效的工作流對成功至關重要,人工智能(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 之前,請確保:

    安裝所需的庫包括以下內容:

    openai
    boto3
    slack_bolt
    slack-sdk
    langchain
    python-dotenv
    langchain-community
    langchain-nvidia-ai-endpoints
    python-dotenv
    langchainhub

    您還需要以下資源:

    安裝所需的庫?

    在設置代理之前,請確保安裝了必要的庫,例如 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,請考慮以下增強功能:

    繼續探索自定義 Slackbots 之外的其他機器人?

    AI 智能體正在通過自動執行任務、優化流程和提高生產力來轉變企業應用。 NVIDIA NIM 微服務 提供了一種無縫集成多個代理和工具的方式,使企業能夠創建定制的 AI 驅動解決方案。

    在本文中,我演示了如何使用 NIM AI 端點 創建具有自定義工具的端到端 Slackbot 智能體。這一解決方案增強了簡單的 Slack 界面,使其能夠處理更復雜的任務并解決獨特的挑戰。

    有關更多示例,請查看 官方/NVIDIA/GenerativeAIExamples GitHub 庫 。有關使用 NIM 微服務和 LangChain 構建的更多信息,請參閱 NVIDIA AI LangChain 端點。

    ?

    ?

    ?

    +3

    標簽

    人人超碰97caoporen国产