用 LangChain Agents 和 Ollama 建立LLM多功能 AI 助手:支援日期查詢與數學運算
日期:2024-11-28
建立一個支援日期查詢與數學運算的 AI 助手,用 LangChain Agents 的工具整合方式,讓助理可根據需求選擇合適的工具回答使用者問題。
崴寶 Weibert 教學目標:
- 建立一個支援
日期查詢
與數學運算
的 AI 助手。 - 使用
LangChain Agents
的工具整合方式,讓助理可根據需求選擇合適的工具
回答使用者問題。
Github Repository : weitsung50110/Huggingface_Langchain_kit
本文是使用到裡面的
成果展示
告訴你今天的日期和星期幾。
處理數學運算。
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。
步驟一:環境準備與安裝依賴套件
在開始之前,請先確認已安裝以下工具與套件:
- Python 版本(建議 3.8 以上)
- 必要的 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)
我們將定義兩個功能工具:
日期工具:回答今天的日期和星期幾。
from datetime import datetime def get_today_date(_): """ 返回今天的日期和星期幾 """ return datetime.now().strftime("今天是 %Y 年 %m 月 %d 日,星期%a。")
數學運算工具:處理簡單數學表達式。
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 助手已經可以回答日期問題,也能進行數學運算。
如果想進一步擴展功能,可以考慮以下方向:
- 添加更多工具,例如天氣查詢或翻譯功能。
- 使用更強大的 LLM 模型,提升回答的準確性與多樣性。
喜歡 好崴寶 Weibert Weiberson 的文章嗎?在這裡留下你的評論!本留言區支援 Markdown 語法。