第三方 OpenAI 相容介面不一定支援 OpenAI Responses API 的原生網頁搜尋功能。[5] 較通用的架構是先以 Tavily 搜尋網路,再將搜尋摘要與 TXT 資料交給模型分析;Tavily 以 API Key 驗證,並回傳結構化搜尋結果。[1][3] 使用 chat.completions.create() 不代表模型會自動記住過往請求;對話上下文必須由程式自行保存並在下一次請求時重新傳入。[2][6]
研究答案

Create a landscape editorial hero image for this Studio Global article: 我想让其在分析数据的时候连接网络搜索,帮我改一下代码,另外它会有记忆吗?我之前喂给它的东西会记得吗. Article summary: 可以,但你当前使用的是第三方 OpenAI 兼容接口,无法确定 deepseek v4 flash 是否原生支持联网工具。官方 OpenAI 的内置网页搜索主要通过 Responses API 提供,而第三方 base url 不一定兼容该功能。[5] 因此,下面采用更通用的方案:程序先调用 Tavily 搜索互联网,再把搜索结果连同 TXT 数据一起交给模型分析;Tavily 支持通过 API Key 调用搜索接口并返回结构化结果。[. Topic tags: deepresearch, general web, openai, agents, prompt engineering. Style: premium digital editorial illustration, source-backed research mood, clean composition, high detail, modern web publication hero. Use reference image context only for broad subject, composition, and topical grounding; do not copy the exact image. Avoid: logos, brand marks, copyrighted characters, real person likenesses, fake screenshots, UI text, readable text, watermarks, charts with fake numbers, clickbait thumbnails, icons, and tiny thumbnail layout
如果目前使用的是第三方 OpenAI 相容介面,例如自訂 base_url 搭配 deepseek-v4-flash,就不能直接假設它支援 OpenAI 的原生網頁搜尋工具。OpenAI 的內建網頁搜尋主要透過 Responses API 提供;第三方服務是否相容,則要看該服務的 API 實作。5
對現有 Python 程式而言,較穩妥、也更容易跨服務使用的做法是採用兩階段流程:
[W1]、[W2] 等編號標示網路來源,方便事後核對。Tavily 的搜尋端點使用 API Key 驗證,並可回傳包含標題、網址與摘要的結構化結果。1
3
TXT 資料
│
├── 分析資料結構與數值
│
└── 產生技術搜尋關鍵字
│
▼
Tavily 網路搜尋
│
▼
整理搜尋摘要與來源編號
│
▼
模型分析 TXT + 網路資料
│
▼
儲存最終分析報告
程式中可用環境變數保存金鑰,避免直接把敏感資訊寫入原始碼:
$env:AI_API_KEY="你的 AI API Key"
$env:AI_BASE_URL="你的 Base URL"
$env:TAVILY_API_KEY="你的 Tavily API Key"
接著設定:
from pathlib import Path
import os
import requests
API_KEY = os.getenv("AI_API_KEY", "")
BASE_URL = os.getenv("AI_BASE_URL", "")
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY", "")
MODEL_NAME = "deepseek-v4-flash"
TAVILY_SEARCH_URL = "https://api.tavily.com/search"
搜尋時可以設定每個關鍵字的結果數量、搜尋深度,以及是否加入原始內容。原始程式的設計是使用最多 4 個關鍵字,每個關鍵字最多取得 5 筆結果,並限制摘要與全部網路內容的長度,避免佔用過多模型上下文:
SEARCH_RESULTS_PER_QUERY = 5
MAX_SEARCH_QUERIES = 4
SEARCH_DEPTH = "advanced"
def search_tavily(query):
headers = {
"Authorization": f"Bearer {TAVILY_API_KEY}",
"Content-Type": "application/json",
}
payload = {
"query": query,
"search_depth": SEARCH_DEPTH,
"max_results": SEARCH_RESULTS_PER_QUERY,
"include_answer": False,
"include_raw_content": False,
"include_images": False,
}
response = requests.post(
TAVILY_SEARCH_URL,
headers=headers,
json=payload,
timeout=60,
)
response.raise_for_status()
return response.json().get("results", [])
整理結果時,建議以 URL 去除重複來源,並為每筆資料分配穩定編號:
def format_web_source(source, index, query):
title = str(source.get("title", "無標題")).strip()
url = str(source.get("url", "")).strip()
content = str(source.get("content", "")).strip()[:1200]
return (
f"[W{index}]\n"
f"標題:{title}\n"
f"URL:{url}\n"
f"搜尋關鍵字:{query}\n"
f"摘要:{content}\n"
)
傳給模型的提示詞則要明確說明:網路摘要只是參考資料,不能覆蓋 TXT 中的實際數值;若資料不足,必須直接寫出「證據不足」。此外,原始資料中的 x 或 X 應視為缺失、無效或無法計算,不能當成數字 0。
不會自動記得。
使用 chat.completions.create() 時,即使重複使用同一個 client 或同一個模型,新的請求也不會因此自動取得先前請求的上下文。要延續對話,必須由應用程式保存歷史訊息,並在下一次請求中重新傳入;對話狀態本質上需要由整合程式管理。2
6
因此,「模型記憶」其實可以分成三種不同概念:
messages 中,模型可以讀取。原始設計提供可選的本地記憶功能:
ENABLE_PERSISTENT_MEMORY = False
MEMORY_FILE = Path("analysis_memory.txt")
MEMORY_INPUT_MAX_CHARS = 12000
MEMORY_FILE_MAX_CHARS = 50000
將 ENABLE_PERSISTENT_MEMORY 改成 True 後,程式會:
analysis_memory.txt。可用以下函式讀取記憶:
def load_memory():
if not ENABLE_PERSISTENT_MEMORY:
return ""
if not MEMORY_FILE.exists():
return ""
text = MEMORY_FILE.read_text(encoding="utf-8")
return text[-MEMORY_INPUT_MAX_CHARS:]
分析完成後再保存:
def save_memory(final_report):
if not ENABLE_PERSISTENT_MEMORY:
return
old_memory = ""
if MEMORY_FILE.exists():
old_memory = MEMORY_FILE.read_text(encoding="utf-8")
new_memory = old_memory + "\n\n" + final_report
new_memory = new_memory[-MEMORY_FILE_MAX_CHARS:]
MEMORY_FILE.write_text(new_memory, encoding="utf-8")
這種方式保存的是「報告」,不是模型永久學會了這些內容。下一次執行程式時,只有在程式再次讀取檔案並把內容放進提示詞,模型才看得到過去的結果。
如果每次分析的是不同專案、不同器件或不同實驗,建議維持:
ENABLE_PERSISTENT_MEMORY = False
否則上一個專案的結論可能干擾目前資料。即使啟用記憶,也應在提示詞中要求模型遵守以下原則:
在讀取 Chat Completions 回應時,應從第一個 choice 取得訊息內容:
content = response.choices.message.content
不要寫成:
content = response.choices.message.content
後者少了 ``,通常會導致屬性存取錯誤。實際回應格式仍應以你所使用的第三方服務文件為準。
這套方案的重點不是讓模型「永久記住」資料,而是由你的程式明確管理資料流:Tavily 負責取得較新的網路資訊,TXT 檔案提供目前分析對象,本地記憶檔案則保存你選擇保留的歷史報告。三者分開管理,並要求模型標示來源與不確定性,會比把所有內容混在單一對話裡更容易追蹤與除錯。
如果資料涉及機密內容,還應避免把完整原始資料或專案名稱放入自動搜尋關鍵字,並在啟用本地記憶前確認記憶檔案的存取權限。
Studio Global AI
這個頁面包含附來源佐證的答案,你可以在 Studio Global 內繼續追問。
第三方 OpenAI 相容介面不一定支援 OpenAI Responses API 的原生網頁搜尋功能。[5]
第三方 OpenAI 相容介面不一定支援 OpenAI Responses API 的原生網頁搜尋功能。[5] 較通用的架構是先以 Tavily 搜尋網路,再將搜尋摘要與 TXT 資料交給模型分析;Tavily 以 API Key 驗證,並回傳結構化搜尋結果。[1][3]
使用 chat.completions.create() 不代表模型會自動記住過往請求;對話上下文必須由程式自行保存並在下一次請求時重新傳入。[2][6]