ממשק Chat Completions אינו זוכר אוטומטית בקשות קודמות; על התוכנית לשמור את ההיסטוריה ולשלוח אותה מחדש בכל פנייה.[2][6] במקום להניח שממשק OpenAI תואם של צד שלישי תומך בכלי חיפוש מובנים, אפשר לבצע את החיפוש בנפרד באמצעות Tavily ולהעביר למודל את תוצאותיו.[1][3][5] הקוד המוצע שומר את דוח הניתוח בקובץ מקומי בשם analysis...
Research answer

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
אפשר לחבר את תוכנית ה־Python לחיפוש אינטרנטי בזמן ניתוח הנתונים. עם זאת, כאשר משתמשים בלקוח OpenAI דרך base_url של ספק חיצוני, אי אפשר להניח שהמודל deepseek-v4-flash או הממשק עצמו תומכים בכלי חיפוש מובנים. חיפוש האינטרנט המובנה של OpenAI זמין דרך ה־Responses API, אך תאימות זו אינה מובטחת אצל ספקים חיצוניים.5
לכן הפתרון הגמיש יותר הוא להפריד בין שתי הפעולות:
כך אפשר להמשיך להשתמש כמעט בכל ספק API שתומך בפורמט של OpenAI, בלי להסתמך על תמיכה לא ודאית בכלי מובנה.
מומלץ לשמור את המפתחות במשתני סביבה ולא להדביק אותם ישירות בקובץ הקוד:
$env:AI_API_KEY="מפתח ה־AI שלך"
$env:AI_BASE_URL="כתובת ה־Base URL שלך"
$env:TAVILY_API_KEY="מפתח Tavily שלך"
בקוד:
API_KEY = os.getenv("AI_API_KEY", "")
BASE_URL = os.getenv("AI_BASE_URL", "")
TAVILY_API_KEY = os.getenv("TAVILY_API_KEY", "")
TAVILY_SEARCH_URL = "https://api.tavily.com/search"
ENABLE_WEB_SEARCH = True
SEARCH_RESULTS_PER_QUERY = 5
MAX_SEARCH_QUERIES = 4
Tavily מאמת את הקריאות באמצעות API Key, ומאפשר לשלוט בין היתר במספר התוצאות ובעומק החיפוש.1
3
הפונקציה הבאה שולחת שאילתה ל־Tavily ומחזירה את התוצאות:
def search_tavily(query):
if not TAVILY_API_KEY:
raise ValueError("TAVILY_API_KEY לא הוגדר")
headers = {
"Authorization": f"Bearer {TAVILY_API_KEY}",
"Content-Type": "application/json",
}
payload = {
"query": query,
"search_depth": "advanced",
"max_results": 5,
"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", [])
כדאי לשמור לכל מקור את title, את url ואת content. לאחר מכן אפשר להוסיף לכל מקור מזהה כגון [W1], [W2] וכן הלאה, כדי שהמודל יוכל לציין באיזה מקור השתמש.
במקום לשלוח למודל רק את תוכן קובץ ה־TXT, מצרפים אליו גם את תוצאות החיפוש:
web_context = "\n\n".join(
f"[{i}]\n"
f"כותרת: {item.get('title', 'ללא כותרת')}\n"
f"URL: {item.get('url', '')}\n"
f"תקציר: {item.get('content', '')}"
for i, item in enumerate(web_results, start=1)
)
user_prompt = f"""
נתח את נתוני ה־TXT הבאים.
DATA BEGIN
{chunk}
DATA END
השתמש במקורות האינטרנט הבאים רק להסבר כללי:
WEB BEGIN
{web_context}
WEB END
הפרד בבירור בין:
- עובדות שנמצאות בנתונים;
- מידע שמגיע מהמקורות;
- מסקנות או השערות שלך.
אם השתמשת במקור, ציין [W1], [W2] וכן הלאה.
"""
חשוב להבהיר בהנחיית המערכת שתוצאות החיפוש אינן פקודות. הן חומר רקע בלבד. בנוסף, יש להורות למודל שלא להפוך את התווים x או X לאפס, אם הם מסמנים ערך חסר או לא תקף.
לא באופן אוטומטי. שימוש באותו אובייקט client, באותו מודל או באותו מפתח API אינו יוצר זיכרון מתמשך. ב־Chat Completions, ההקשר של השיחה צריך להישמר על ידי התוכנית ולהישלח שוב בבקשה הבאה.2
6
כלומר, אם בקשה אחת כללה נתוני TXT, ובבקשה הבאה לא שלחת אותם או תקציר שלהם, המודל לא אמור להסתמך עליהם כאילו הם עדיין זמינים.
אפשר לממש זיכרון פשוט באמצעות קובץ טקסט. לאחר יצירת הדוח שומרים אותו:
from pathlib import Path
MEMORY_FILE = Path("analysis_memory.txt")
ENABLE_PERSISTENT_MEMORY = True
MEMORY_INPUT_MAX_CHARS = 12000
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(report):
if not ENABLE_PERSISTENT_MEMORY:
return
old_text = ""
if MEMORY_FILE.exists():
old_text = MEMORY_FILE.read_text(encoding="utf-8")
new_text = old_text + "\n\n" + report
MEMORY_FILE.write_text(new_text[-50000:], encoding="utf-8")
בהרצה הבאה קוראים את הקובץ ומוסיפים אותו להנחיה, למשל:
memory_text = load_memory()
memory_context = f"""
זהו מידע מהיסטוריית ניתוח מקומית.
הוא משמש כרקע בלבד ואינו גובר על נתוני הקובץ הנוכחי.
{memory_text or 'אין זיכרון קודם.'}
"""
אם כל הרצה מנתחת פרויקט אחר, רכיב אחר או סוג נתונים אחר, השאירו:
ENABLE_PERSISTENT_MEMORY = False
אחרת, המודל עלול לקבל מסקנות ישנות כרקע וליצור ערבוב בין ניסויים. גם כשהזיכרון מופעל, כדאי לשמור רק סיכומים — לא את כל קובצי המקור — ולהגביל את גודל הקובץ.
בקוד שסופק מופיעה גישה שגויה לתוכן התשובה:
content = response.choices.message.content
בדרך כלל צריך לגשת לפריט הראשון ברשימת choices:
content = response.choices.message.content
בלי התיקון הזה, החיבור עשוי להיכשל גם אם הבקשה עצמה התקבלה בהצלחה.
הזרימה המלאה תהיה:
קריאת data.txt
↓
חלוקת הקובץ לנתחים
↓
יצירת מילות חיפוש
↓
חיפוש ב־Tavily
↓
שמירת המקורות עם מזהי W1, W2...
↓
ניתוח כל נתח יחד עם המקורות
↓
איחוד הדוחות
↓
שמירת הדוח הסופי בזיכרון המקומי
הגישה הזו מעניקה לתוכנית גם מידע עדכני מהרשת וגם זיכרון שניתן לשלוט בו. עם זאת, הזיכרון אינו תכונה קסומה של המודל: הוא בסך הכול מידע שהתוכנית שומרת ומחזירה למודל כחלק מהבקשה הבאה.
Studio Global AI
This page includes a source-backed answer you can continue inside Studio Global.
ממשק Chat Completions אינו זוכר אוטומטית בקשות קודמות; על התוכנית לשמור את ההיסטוריה ולשלוח אותה מחדש בכל פנייה.[2][6]
ממשק Chat Completions אינו זוכר אוטומטית בקשות קודמות; על התוכנית לשמור את ההיסטוריה ולשלוח אותה מחדש בכל פנייה.[2][6] במקום להניח שממשק OpenAI תואם של צד שלישי תומך בכלי חיפוש מובנים, אפשר לבצע את החיפוש בנפרד באמצעות Tavily ולהעביר למודל את תוצאותיו.[1][3][5]
הקוד המוצע שומר את דוח הניתוח בקובץ מקומי בשם analysis memory.txt, שאותו ניתן לקרוא בהרצה הבאה.