在前三篇,我們了解了 LangChain Agent 的系統架構、SystemTools 的設計,以及自定義 Gemini LLM 包裝器。今天,我們要探討整個智能助手的「神經中樞」:Agent 初始化與工具註冊系統。
這個系統決定了 AI 助手能夠執行哪些任務,以及如何智能地選擇合適的工具。
Agent 初始化與工具註冊系統包含:
def _initialize_langchain(self):
"""初始化 LangChain 組件"""
try:
# Gemini API 設定
api_key = os.getenv('API_KEY')
# 創建自定義 LLM
self.gemini_llm = GeminiLLM(
api_key=api_key,
model_name=os.environ.get("GEMINI_MODEL", "models/gemini-2.5-flash")
)
# 初始化系統工具
self.system_tools = SystemTools(app_instance=self)
# 定義工具
tools = [
# 內容生成工具
Tool(
name="內容生成工具",
func=self.system_tools.generate_content_tool,
description="生成創意內容,如文章、心得、故事等。輸入主題或要求即可。"
),
# 應用程式控制工具群
Tool(
name="開啟小畫家",
func=self.system_tools.open_paint_tool,
description="開啟Windows小畫家應用程式"
),
Tool(
name="開啟記事本",
func=self.system_tools.open_notepad_tool,
description="開啟Windows記事本應用程式"
),
# Word 操作工具群 (6個工具)
Tool(
name="開啟空白Word",
func=self.system_tools.open_blank_word_tool,
description="純粹開啟一個空白的Word應用程式。用於:用戶只是想開啟Word但不需要立即寫入內容的情況。"
),
Tool(
name="開啟Word並輸入內容",
func=self.system_tools.open_word_tool,
description="開啟Word並輸入指定的內容。用於:1)將特定內容直接寫入Word;2)將之前的分析結果/解答寫入Word。"
),
Tool(
name="將已生成內容寫入Word",
func=self.system_tools.write_generated_to_word_tool,
description="將最近的內容寫入Word,包括:1)生成的內容;2)分析結果;3)翻譯結果;4)上傳檔案內容。"
),
Tool(
name="寫內容到Word",
func=self.system_tools.write_to_word_tool,
description="根據指定主題重新生成內容並寫入Word。用於創作新的文章、小說、報告等。"
),
Tool(
name="修改Word內容",
func=self.system_tools.modify_word_tool,
description="修改已開啟的Word文件內容"
),
Tool(
name="儲存Word文件",
func=self.system_tools.save_word_tool,
description="儲存Word文件。如果用戶只說'存檔'而沒有指定檔名,應該詢問檔案名稱。"
),
Tool(
name="檢查Word狀態",
func=self.system_tools.check_word_status_tool,
description="檢查Word應用程式的當前狀態"
),
# 狀態管理工具
Tool(
name="檢查內容狀態",
func=self.system_tools.check_available_content_tool,
description="檢查當前系統中有哪些內容可以寫入Word,包括生成內容、分析結果、上傳檔案等。"
),
# 檔案處理工具群
Tool(
name="檔案上傳分析",
func=self.system_tools.upload_file_tool,
description="上傳檔案並顯示上傳成功訊息,然後詢問用戶要做什麼。支援多種檔案格式。"
),
Tool(
name="檔案內容分析",
func=self.system_tools.analyze_file_content_tool,
description="對已上傳的檔案進行各種分析。可以進行:詳細分析、總結摘要、提取重點、翻譯內容、寫心得感想等。"
),
]
# 基礎應用程式工具
- 開啟小畫家 # Windows Paint
- 開啟記事本 # Notepad
# Word 核心操作鏈
開啟空白Word → 開啟Word並輸入內容 → 修改Word內容 → 儲存Word文件
↓ ↓ ↓ ↓
純開啟 寫入特定內容 編輯現有文件 檔案存檔
# Word 智能操作
- 將已生成內容寫入Word # 智能選擇最新內容
- 寫內容到Word # 重新生成並寫入
- 檢查Word狀態 # 狀態監控
# 內容生命週期管理
內容生成工具 → 檢查內容狀態 → 將已生成內容寫入Word
↓ ↓ ↓
創建內容 狀態查詢 內容寫入
# 檔案處理流程
檔案上傳分析 → 檔案內容分析 → 將已生成內容寫入Word
↓ ↓ ↓
檔案上傳 專家分析 結果輸出
# 創建系統提示
system_prompt = """你是一個智能助手,專門幫助用戶處理各種任務。
重要指導原則:
1. 當用戶說"寫入Word"、"輸入Word"、"把XX寫入Word"時,要理解他們想寫入已有的內容
2. 如果系統剛剛完成了檔案分析、解題、翻譯等任務,用戶要求寫入Word時,他們指的是這些結果
3. 在執行Word寫入操作前,可以先使用「檢查內容狀態」工具確認有什麼內容可用
4. 優先使用「將已生成內容寫入Word」工具,它會自動選擇最新的內容
5. 不要過度詢問用戶,要根據上下文智能判斷用戶意圖
請根據這些原則協助用戶。"""
# 初始化 Agent
self.agent = initialize_agent(
tools,
self.gemini_llm,
agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
verbose=True,
max_iterations=3, # 最大執行次數
max_execution_time=30, # 最大執行時間
early_stopping_method="generate",
handle_parsing_errors=custom_error_handler,
agent_kwargs={"prefix": system_prompt}
)
def custom_error_handler(error) -> str:
"""自定義錯誤處理函數,嘗試解析並執行動作"""
error_msg = str(error)
print(f"[DEBUG] 解析錯誤,嘗試自定義處理: {error_msg}")
# 應用程式開啟請求處理
if "Action: 開啟小畫家" in error_msg:
try:
result = self.system_tools.open_paint_tool("")
return f"小畫家應用程式已成功開啟,您可以開始繪圖了。實際結果:{result}"
except Exception as e:
return f"開啟小畫家時發生錯誤: {e}"
# Word操作請求處理
if ("Action: 開啟Word並輸入內容" in error_msg or "Action: 開啟Word" in error_msg):
try:
result = self.system_tools.open_word_tool("")
return f"Word應用程式已成功開啟,您可以開始編輯文件了。實際結果:{result}"
except Exception as e:
return f"開啟Word時發生錯誤: {e}"
# 智能Word寫入處理
elif ("寫入word" in error_msg.lower() or "寫入Word" in error_msg):
# 防重複調用機制
import time
current_time = time.time()
if hasattr(self, '_last_word_open_time'):
time_diff = current_time - self._last_word_open_time
if time_diff < 5:
return "Word剛開啟過,內容已經寫入完成。"
# 智能內容來源判斷
has_existing_content = False
content_source = ""
if (hasattr(self, 'last_analysis_result') and
self.last_analysis_result and
self.last_analysis_result.strip()):
has_existing_content = True
content_source = "分析結果"
if has_existing_content:
result = self.system_tools.write_generated_to_word_tool("")
return f"已將{content_source}寫入Word。{result}"
# 檔案分析請求處理
elif "檔案內容分析" in error_msg or "檔案分析" in error_msg:
try:
analysis_type = "詳細分析"
if "總結" in error_msg:
analysis_type = "總結"
elif "重點" in error_msg:
analysis_type = "重點"
elif "翻譯" in error_msg:
analysis_type = "翻譯"
result = self.system_tools.analyze_file_content_tool(analysis_type)
return result
except Exception as e:
return f"檔案分析失敗: {e}"
# Final Answer 提取
elif "Final Answer:" in error_msg:
try:
final_answer_part = error_msg.split("Final Answer:")[-1].strip()
if "For troubleshooting" in final_answer_part:
final_answer_part = final_answer_part.split("For troubleshooting")[0].strip()
return final_answer_part
except Exception as e:
return "很抱歉,我無法理解您的問題。請提供更具體的問題或需求。"
# 預設錯誤處理
return f"很抱歉,我無法理解您的問題。請提供更具體的問題或需求。"
# 精確的使用場景描述
Tool(
name="開啟空白Word",
description="純粹開啟一個空白的Word應用程式。用於:用戶只是想開啟Word但不需要立即寫入內容的情況。"
)
Tool(
name="將已生成內容寫入Word",
description="將最近的內容寫入Word,包括:1)生成的內容;2)分析結果;3)翻譯結果;4)上傳檔案內容。用於當用戶說'把剛才的內容寫入Word'、'將解題結果寫入Word'等。"
)
設計原則:
用戶輸入 → LLM 理解意圖 → 工具描述匹配 → 選擇最佳工具 → 執行操作
↓ ↓ ↓ ↓ ↓
自然語言 語義分析 描述比對 智能選擇 實際執行
import time
current_time = time.time()
if hasattr(self.system_tools, '_last_word_operation_time'):
time_diff = current_time - self.system_tools._last_word_operation_time
if time_diff < 1.5:
return "Word剛開啟過,請稍候..."
# 時間戳追蹤
self.app_instance.last_generated_time = time.time()
self.app_instance.last_analysis_time = time.time()
self.app_instance.last_upload_time = time.time()
# 自動選擇最新內容
latest_time = max(gen_time, analysis_time, upload_time)
檔案上傳分析 → 檔案內容分析 → 將已生成內容寫入Word → 儲存Word文件
內容生成工具 → 檢查內容狀態 → 將已生成內容寫入Word → 修改Word內容 → 儲存Word文件
檔案上傳分析 → (用戶指定分析類型) → 檔案內容分析 → 將已生成內容寫入Word
max_iterations=3, # 防止無限循環
max_execution_time=30, # 防止超時
early_stopping_method="generate" # 早期停止策略
# 清理舊的分析結果
if ("小說" in final_answer_part and "數學" not in final_answer_part):
self.system_tools.last_analysis_result = ""
Agent 初始化與工具註冊系統是整個智能助手的「指揮中心」,它:
這個系統將分散的工具整合成一個有機的整體,讓 AI 助手真正具備了「思考」和「行動」的能力。
下一篇,我們將深入探討內容生成引擎,看看 AI 如何創作文章、故事與心得。
分類 | 工具名稱 | 主要功能 |
---|---|---|
應用程式控制 | 開啟小畫家 | Windows Paint 啟動 |
應用程式控制 | 開啟記事本 | Notepad 啟動 |
Word操作 | 開啟空白Word | 純開啟Word應用程式 |
Word操作 | 開啟Word並輸入內容 | 開啟Word並寫入指定內容 |
Word操作 | 將已生成內容寫入Word | 智能選擇最新內容寫入 |
Word操作 | 寫內容到Word | 重新生成內容並寫入 |
Word操作 | 修改Word內容 | 編輯現有Word文件 |
Word操作 | 儲存Word文件 | 檔案儲存功能 |
Word操作 | 檢查Word狀態 | Word狀態監控 |
內容管理 | 內容生成工具 | 創意內容生成 |
內容管理 | 檢查內容狀態 | 內容狀態查詢 |
檔案處理 | 檔案上傳分析 | 檔案上傳和初步處理 |
檔案處理 | 檔案內容分析 | 專家模式深度分析 |