AI Hunter
Member
Anh em có thấy ức chế không khi hỏi con AI của mình:
"Giá vàng SJC hôm nay bao nhiêu?"
Nó trả lời: "Xin lỗi, dữ liệu của tôi chỉ cập nhật đến năm 2023..."

Hôm nay, chúng ta sẽ đập tan bức tường đó. Chúng ta sẽ biến Jarvis từ một Chatbot thụ động thành một Agent chủ động. Nó sẽ biết tự đánh giá: câu nào trả lời được ngay, câu nào cần phải chạy đi "Google" mới biết.
Làm sao để AI lướt web? Nó không có tay để gõ phím.
Thay vào đó, chúng ta dùng cơ chế Function Calling (hay còn gọi là Tool Use).
Quy trình sẽ như sau:
Tại sao lại là con vịt (DuckDuckGo)?
Vì nó MIỄN PHÍ và không cần đăng ký API Key lằng nhằng như Google Search API.
Cài đặt:
Tạo file
. Chúng ta sẽ dùng thư viện
chuẩn, vì hiện tại Ollama cũng đã hỗ trợ Tool Calling rất tốt.
[CODE lang="python"]
import json
from duckduckgo_search import DDGS
from openai import OpenAI
# 1. Khởi tạo Client (Dùng OpenAI hoặc Ollama/LocalAI đều được)
client = OpenAI(api_key="sk-proj-xxxx")
# Nếu dùng Ollama: base_url="http://localhost:11434/v1", api_key="ollama"
# 2. Định nghĩa hàm Search (Cái tay của AI)
def web_search(query):
print(f"
Đang đi tìm tin tức về: {query}...")
results = DDGS().text(query, max_results=3)
if results:
# Gom 3 kết quả đầu tiên lại thành 1 đoạn văn
return "\n".join([f"- {r['title']}: {r['body']}" for r in results])
return "Không tìm thấy thông tin gì sếp ơi."
# 3. Khai báo Tool cho LLM biết (Cái thực đơn)
tools = [
{
"type": "function",
"function": {
"name": "web_search",
"description": "Dùng công cụ này khi người dùng hỏi về các thông tin thời gian thực, tin tức mới, hoặc sự kiện hiện tại mà bạn không biết.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Từ khóa cần tìm kiếm trên Google",
}
},
"required": ["query"],
},
},
}
]
# 4. Vòng lặp Chat thông minh
def chat_with_agent(user_query):
messages = [
{"role": "system", "content": "Bạn là trợ lý AI hữu ích. Nếu cần thông tin mới, hãy dùng tool search."},
{"role": "user", "content": user_query}
]
# Lần gọi 1: Để AI quyết định có dùng tool hay không
response = client.chat.completions.create(
model="gpt-4o", # Hoặc "llama3-groq-tool-use" nếu chạy local
messages=messages,
tools=tools,
tool_choice="auto",
)
msg = response.choices[0].message
# Kiểm tra xem AI có đòi dùng tool không?
if msg.tool_calls:
tool_call = msg.tool_calls[0]
func_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if func_name == "web_search":
# Thực thi hàm search
search_result = web_search(arguments['query'])
# Đóng gói kết quả search vào hội thoại
messages.append(msg) # Thêm tin nhắn của AI (đòi gọi tool)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": search_result
})
# Lần gọi 2: Để AI đọc kết quả search và trả lời user
final_response = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
return final_response.choices[0].message.content
else:
# Nếu không cần tool (ví dụ hỏi 1+1 bằng mấy), trả lời luôn
return msg.content
# --- TEST THỬ ---
print(">>> Case 1: Hỏi kiến thức cũ")
print(chat_with_agent("Thủ đô nước Pháp là gì?"))
print("\n>>> Case 2: Hỏi tin tức mới (AI buộc phải Search)")
print(chat_with_agent("Giá iPhone 16 Pro Max hiện tại khoảng bao nhiêu?"))
[/CODE]
Khi chạy code trên:
Jarvis đã chính thức "mở mắt" nhìn thấy thế giới!
Ở bài trước chúng ta đã làm giao diện Chainlit. Để tích hợp món này vào, bạn chỉ cần ném logic trên vào hàm
của Chainlit.
Mẹo nhỏ: Sử dụng
để hiển thị quá trình search lên giao diện cho ngầu.
User sẽ thấy Jarvis hiện lên dòng chữ: "Đang tra Google..." trước khi trả lời. Cảm giác cực kỳ chuyên nghiệp.
Vậy là chúng ta đã trang bị cho Jarvis một bộ kỹ năng khá hoàn chỉnh:
"Giá vàng SJC hôm nay bao nhiêu?"
Nó trả lời: "Xin lỗi, dữ liệu của tôi chỉ cập nhật đến năm 2023..."
Hôm nay, chúng ta sẽ đập tan bức tường đó. Chúng ta sẽ biến Jarvis từ một Chatbot thụ động thành một Agent chủ động. Nó sẽ biết tự đánh giá: câu nào trả lời được ngay, câu nào cần phải chạy đi "Google" mới biết.
1. Cơ chế: Function Calling (Vũ khí bí mật)
Làm sao để AI lướt web? Nó không có tay để gõ phím.
Thay vào đó, chúng ta dùng cơ chế Function Calling (hay còn gọi là Tool Use).
Quy trình sẽ như sau:
- Bước 1: User hỏi "Thời tiết Hà Nội thế nào?".
- Bước 2: LLM suy nghĩ: "Câu này mình không biết. Nhưng mình có cái tool tên là `Google Search`. Mình sẽ gọi nó."
- Bước 3: LLM trả về một lệnh gọi hàm (JSON):
.Mã:
{"tool": "google_search", "query": "thời tiết Hà Nội hôm nay"} - Bước 4: Code Python của chúng ta bắt lấy lệnh này, thực thi search thật, lấy kết quả text trả về.
- Bước 5: Ném kết quả đó lại cho LLM để nó chém gió thành câu văn mượt mà trả lời user.
2. Vũ khí: DuckDuckGo Search
Tại sao lại là con vịt (DuckDuckGo)?
Vì nó MIỄN PHÍ và không cần đăng ký API Key lằng nhằng như Google Search API.
Cài đặt:
Mã:
pip install duckduckgo-search openai
3. Code thực chiến: Agent biết tìm kiếm
Tạo file
Mã:
agent_search.py
Mã:
openai
[CODE lang="python"]
import json
from duckduckgo_search import DDGS
from openai import OpenAI
# 1. Khởi tạo Client (Dùng OpenAI hoặc Ollama/LocalAI đều được)
client = OpenAI(api_key="sk-proj-xxxx")
# Nếu dùng Ollama: base_url="http://localhost:11434/v1", api_key="ollama"
# 2. Định nghĩa hàm Search (Cái tay của AI)
def web_search(query):
print(f"
results = DDGS().text(query, max_results=3)
if results:
# Gom 3 kết quả đầu tiên lại thành 1 đoạn văn
return "\n".join([f"- {r['title']}: {r['body']}" for r in results])
return "Không tìm thấy thông tin gì sếp ơi."
# 3. Khai báo Tool cho LLM biết (Cái thực đơn)
tools = [
{
"type": "function",
"function": {
"name": "web_search",
"description": "Dùng công cụ này khi người dùng hỏi về các thông tin thời gian thực, tin tức mới, hoặc sự kiện hiện tại mà bạn không biết.",
"parameters": {
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Từ khóa cần tìm kiếm trên Google",
}
},
"required": ["query"],
},
},
}
]
# 4. Vòng lặp Chat thông minh
def chat_with_agent(user_query):
messages = [
{"role": "system", "content": "Bạn là trợ lý AI hữu ích. Nếu cần thông tin mới, hãy dùng tool search."},
{"role": "user", "content": user_query}
]
# Lần gọi 1: Để AI quyết định có dùng tool hay không
response = client.chat.completions.create(
model="gpt-4o", # Hoặc "llama3-groq-tool-use" nếu chạy local
messages=messages,
tools=tools,
tool_choice="auto",
)
msg = response.choices[0].message
# Kiểm tra xem AI có đòi dùng tool không?
if msg.tool_calls:
tool_call = msg.tool_calls[0]
func_name = tool_call.function.name
arguments = json.loads(tool_call.function.arguments)
if func_name == "web_search":
# Thực thi hàm search
search_result = web_search(arguments['query'])
# Đóng gói kết quả search vào hội thoại
messages.append(msg) # Thêm tin nhắn của AI (đòi gọi tool)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": search_result
})
# Lần gọi 2: Để AI đọc kết quả search và trả lời user
final_response = client.chat.completions.create(
model="gpt-4o",
messages=messages
)
return final_response.choices[0].message.content
else:
# Nếu không cần tool (ví dụ hỏi 1+1 bằng mấy), trả lời luôn
return msg.content
# --- TEST THỬ ---
print(">>> Case 1: Hỏi kiến thức cũ")
print(chat_with_agent("Thủ đô nước Pháp là gì?"))
print("\n>>> Case 2: Hỏi tin tức mới (AI buộc phải Search)")
print(chat_with_agent("Giá iPhone 16 Pro Max hiện tại khoảng bao nhiêu?"))
[/CODE]
4. Kết quả bất ngờ
Khi chạy code trên:
- Case 1 (Thủ đô Pháp): AI trả lời ngay "Paris". Không tốn thời gian search. Quá thông minh!
- Case 2 (iPhone 16):
Terminal sẽ hiện:
Đang đi tìm tin tức về: giá iPhone 16 Pro Max...
Sau đó AI trả lời: "Theo kết quả tìm kiếm mới nhất, giá iPhone 16 Pro Max hiện dao động từ 34.000.000 VNĐ tùy phiên bản..."
Jarvis đã chính thức "mở mắt" nhìn thấy thế giới!
5. Tích hợp vào Chainlit (Bài tập nâng cao)
Ở bài trước chúng ta đã làm giao diện Chainlit. Để tích hợp món này vào, bạn chỉ cần ném logic trên vào hàm
Mã:
on_message
Mẹo nhỏ: Sử dụng
Mã:
cl.Step
Mã:
async with cl.Step(name="Searching Internet...") as step:
result = web_search(query)
step.output = result
Tổng kết
Vậy là chúng ta đã trang bị cho Jarvis một bộ kỹ năng khá hoàn chỉnh:
- RAG: Tra cứu dữ liệu nội bộ.
- Memory: Ghi nhớ người dùng.
- Web Search: Tra cứu thông tin bên ngoài.
Bài viết liên quan