.env
檔案裡: TAVILY_API_KEY=xxxxxx
pip install llama-index-tools-tavily-research
import os
from dotenv import find_dotenv, load_dotenv
_ = load_dotenv(find_dotenv())
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY")
from llama_index.tools.tavily_research.base import TavilyToolSpec
tavily_tool = TavilyToolSpec(
api_key=TAVILY_API_KEY,
)
query = '徵象(Signs)及症狀(Symptoms)之區別?'
tavily_response = tavily_tool.search(query, max_results=1)
tavily_response
tavily_tool_list = tavily_tool.to_tool_list()
print(tavily_tool_list[0].metadata.name) # search
from llama_index.core.agent.workflow import FunctionAgent
from llama_index.llms.openai import OpenAI
agent = FunctionAgent(
tools=tavily_tool_list,
llm=OpenAI(model="gpt-5-mini"),
streaming=False,
verbose=True,
)
result = await agent.run(query)
print(result)
Running step init_run
, Step init_run produced event AgentInput
這樣的 workflow 資訊,後續可以追蹤一下system_prompt = """
你是一個考題助理,不能直接用自己的知識回答。
任務流程:
1. 根據使用者問題,先分析並決定最重要的 **關鍵字或子問題**(必須明確列出)。
2. 對每個關鍵字或子問題,呼叫 tavily 搜尋工具來獲取相關資訊。
3. 根據搜尋回傳的內容,整理出最終答案。
- 不允許只靠你內建的知識作答。
規則:
- 如果沒有搜尋結果,請誠實說明。
- 回答時,先列出你選定的關鍵字,再呈現答案。
"""
agent = FunctionAgent(
tools=tavily_tool_list,
llm=OpenAI(model="gpt-5-mini"),
system_prompt=system_prompt,
streaming=False,
verbose=True,
)
result = await agent.run(query)
print("-----\nResult: ")
print(result)
for tool_call_result in result.tool_calls:
print(f'tool_name: {tool_call_result.tool_name}')
print(f'query: {tool_call_result.tool_kwargs}')
tool_name: search
query: {'query': 'definition of signs and symptoms medical', 'max_results': 6}
tool_name: search
query: {'query': 'definition of medical sign', 'max_results': 5}
tool_name: search
query: {'query': 'definition of medical sign', 'max_results': 5}
tool_name: search
query: {'query': 'signs vs symptoms definition', 'max_results': 5}
tool_name: search
query: {'query': 'examples of signs and symptoms medical examples', 'max_results': 6}
tool_name: search
query: {'query': 'definition of medical sign examples Medical News Today MedlinePlus', 'max_results': 5}
tool_name: search
query: {'query': 'definition of medical sign', 'max_results': 5}
tool_name: search
query: {'query': 'definition of symptom medical', 'max_results': 6}
prompt = """你是一個知識卡生成器。
請將輸入的資訊整理成三段,分別是:
1. # question (原始問題,保持簡潔明確)
2. # context (可協助用來回答原始問題的關鍵資訊,如原始問題中特殊名詞的定義)
3. # answer (最終整合的答案,盡可能一言以蔽之,否則條列清楚,避免多餘贅述)
請務必輸出成以下格式,不要額外加其他文字:
# question
{填入問題}
# context
{填入相關的關鍵資訊}
# answer
{填入條理清晰的答案}
"""
from llama_index.core.llms import ChatMessage
query = '徵象(Signs)及症狀(Symptoms)之區別?'
messages_dict = [
{'role': 'user', 'content': query},
{'role': 'assistant', 'content': result},
{'role': 'user', 'content': prompt}
]
messages = [ChatMessage(**msg) for msg in messages_dict]
response = llm.chat(messages)
print(response)
# question
徵象(Signs)及症狀(Symptoms)之區別?
# context
- 症狀(Symptom):患者主觀感受或自述,無法由第三方直接測量或觀察,如疼痛、噁心、頭暈、疲倦、心悸等。
- 徵象(Sign):醫療人員或他人可客觀觀察或測量的發現,如發燒(體溫)、皮疹、腫脹、血壓、檢驗或影像結果。
- 臨床記錄:SOAP 中 S = 症狀(Subjective),O = 徵象(Objective)。
- 邊界:患者描述可見現象(如看到皮疹或血尿)為症狀;經醫師觀察或檢驗確認後成為徵象。
# answer
一言以蔽之:症狀 = 主觀(patient-reported);徵象 = 客觀(observer-或 test-detected)。
- 症狀例:疼痛、噁心、頭暈、疲倦、發冷感。
- 徵象例:體溫升高、血壓異常、皮疹、腹部壓痛、實驗室或影像異常。
- 臨床應用:醫師綜合症狀與徵象以鑑別診斷;病歷中症狀寫入 S,徵象寫入 O。
- 小提醒:患者自述的可見變化若經檢查確認即成徵象。