搜尋結果

×

用 LangChain Agents 和 Ollama 建立LLM多功能 AI 助手:支援日期查詢與數學運算

建立一個支援日期查詢與數學運算的 AI 助手,用 LangChain Agents 的工具整合方式,讓助理可根據需求選擇合適的工具回答使用者問題。

崴寶帶你一步步學習如何利用 Python 和 LangChain 開發一個簡單但實用的 AI 助手。這個助手可以回答使用者的日期問題,也能進行簡單的數學運算。教學內容適合有基本 Python 基礎的讀者,讓你快速上手 AI 工具的實作。

崴寶 Weibert 教學目標:

  • 建立一個支援日期查詢數學運算的 AI 助手。
  • 使用 LangChain Agents 的工具整合方式,讓助理可根據需求選擇合適的工具回答使用者問題。

Github Repository : weitsung50110/Huggingface_Langchain_kit

本文是使用到裡面的

成果展示

  1. 告訴你今天的日期和星期幾。

  2. 處理數學運算。

     root@4be643ba6a94:/app# python3 langchain_agents_math.py
    
     請輸入您的問題:今天是幾月幾號
    
     > Entering new AgentExecutor chain...
     我需要獲取今天的日期。
     Action: get today date(_)
     Action Input: 空白(這個工具不需要輸入我需要獲取今天的日期。
     Action: get today date(_)
     Action Input: 空白(這個工具不需要輸入
     Observation: 今天是 2024 年 11 月 27 日,星期Wed。
     Thought:現在我們知道了今天的日期。
     Final Answer: 今天是 2024 年 11 月 27 日,星期三。現在我們知道了今天的日期。
     Final Answer: 今天是 2024 年 11 月 27 日,星期三。
    
     > Finished chain.
    
     AI 助手的回答:
     今天是 2024 年 11 月 27 日,星期三。
     請輸入您的問題:幫我算出5的三次方是多少
    
    
     > Entering new AgentExecutor chain...
     我們需要使用 Python Calculator 來計算數學表達式。
     Action: Python Calculator
     Action Input: '5**3我們需要使用 Python Calculator 來計算數學表達式。
     Action: Python Calculator
     Action Input: '5**3
     Observation: 計算結果是: 125
     Thought:現在我已經知道了最終答案。
     Final Answer: 5的三次方等於125。現在我已經知道了最終答案。
     Final Answer: 5的三次方等於125。
    
     > Finished chain.
    
     AI 助手的回答:
     5的三次方等於125。
    

步驟一:環境準備與安裝依賴套件

在開始之前,請先確認已安裝以下工具與套件:

  1. Python 版本(建議 3.8 以上)
  2. 必要的 Python 套件
    • langchain
    • datetime

步驟二:初始化 Ollama LLM 模型

LangChain 支援多種 LLM(大型語言模型),這裡我們使用 kenneth85/llama-3-taiwan:8b-instruct 模型,並透過回調機制實現輸出串流。

from langchain_community.llms import Ollama
from langchain.callbacks.manager import CallbackManager
from langchain.callbacks.streaming_stdout import StreamingStdOutCallbackHandler

llm = Ollama(
    model="kenneth85/llama-3-taiwan:8b-instruct",
    callback_manager=CallbackManager([StreamingStdOutCallbackHandler()])
)

步驟三:建立兩個工具(Tool)

我們將定義兩個功能工具:

  1. 日期工具:回答今天的日期和星期幾。

     from datetime import datetime
    
     def get_today_date(_):
         """
         返回今天的日期和星期幾
         """
         return datetime.now().strftime("今天是 %Y 年 %m 月 %d 日,星期%a。")
    
  2. 數學運算工具:處理簡單數學表達式。

     def calculate_math(expression):
         """
         計算數學表達式,添加預處理和檢查
         """
         try:
             # 清理輸入表達式
             expression = expression.strip().strip("'").strip('"')
             
             # 檢查表達式是否合法
             allowed_chars = "0123456789+-*/(). "
             if not all(char in allowed_chars for char in expression):
                 return "數學表達式包含無效字符,請檢查輸入。"
             
             # 計算表達式
             result = eval(expression)
             return f"計算結果是: {result}"
         except Exception as e:
             return f"計算過程中發生錯誤: {e}"
    

步驟四:將工具轉換為 LangChain 的 Tool

LangChain 提供了 Tool 類別來封裝功能函式。
我們需要分別為日期工具數學運算工具定義對應的 Tool 實例

from langchain.agents import Tool

# 日期工具
get_today_date_tool = Tool(
    name="get today date(_)",
    func=get_today_date,
    description="回答今天的日期和星期幾。"
)

# 數學工具
math_tool = Tool(
    name="Python Calculator",
    func=calculate_math,
    description="可以計算數學表達式的工具。"
)

步驟五:定義自訂 Prompt 模板

為了讓 AI 更精確地選擇工具,我們需要定義一個 Prompt 模板
這個模板將告訴 AI 具體有哪些工具可以使用,並鼓勵它選擇合適的工具解決問題

from langchain_core.prompts import PromptTemplate

custom_prompt = PromptTemplate(
    input_variables=["input"],
    template="""\
你是一個智慧型 AI 助手,可以使用以下工具來完成任務:
- get today date(_): 回答今天是幾月幾號以及星期幾。
- Python Calculator: 計算數學表達式的工具。

請根據使用者的問題,選擇最適合的工具並提供準確、簡潔的回答。

使用者問題:{input}
"""
)

步驟六:整合工具與模型並初始化 Agent

完成工具和 Prompt 的定義後,我們可以利用 initialize_agent 函數將它們整合,
形成一個完整的 AI 助手

from langchain.agents import initialize_agent

tools = [get_today_date_tool, math_tool]

agent = initialize_agent(
    tools=tools,
    llm=llm,
    agent="zero-shot-react-description",
    verbose=True,
    agent_prompt=custom_prompt,
    handle_parsing_errors=True
)

步驟七:實作主程式邏輯

最後,我們撰寫主程式,讓使用者能與這個 AI 助手進行互動。
該主程式將允許用戶輸入問題,並由 AI 助手根據需求選擇工具並回答

if __name__ == "__main__":
    try:
        while True:
            user_query = input("請輸入您的問題:")
            if user_query.lower() in ["退出", "結束", "exit", "quit"]:
                print("感謝您的使用,再見!")
                break

            response = agent.run({"input": user_query})
            print("\nAI 助手的回答:")
            print(response)
    except Exception as e:
        print(f"執行時發生錯誤:{e}")

崴寶結語

現在,你的 AI 助手已經可以回答日期問題,也能進行數學運算。

如果想進一步擴展功能,可以考慮以下方向:

  1. 添加更多工具,例如天氣查詢或翻譯功能。
  2. 使用更強大的 LLM 模型,提升回答的準確性與多樣性。

    喜歡 好崴寶 Weibert Weiberson 的文章嗎?在這裡留下你的評論!本留言區支援 Markdown 語法