รูปแบบลูปการวิจัยเชิงลึก
ค้นหา → อ่าน → ดึงข้อมูล → สังเคราะห์ → ค้นหาอีกครั้ง สำหรับการวิจัยหลายขั้น
รูปแบบลูปการวิจัยเชิงลึก เป็นบทเรียน AI Agents ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน AI Agents และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
วงจรการค้นคว้าเชิงลึกคืออะไร
วงจรการค้นคว้าเชิงลึก เป็นรูปแบบการทำงานของเอเจนต์ที่เอเจนต์จะค้นหา อ่าน ระบุช่องว่างของความรู้ และค้นหาอีกครั้งซ้ำไปเรื่อย ๆ จนรวบรวมข้อมูลได้เพียงพอสำหรับเขียนคำตอบที่ครอบคลุม
รูปแบบนี้แตกต่างจากการค้นหาเพียงครั้งเดียว เพราะเลียนแบบวิธีทำงานของนักค้นคว้ามนุษย์: สำรวจ → เรียนรู้ → ค้นพบสิ่งที่ยังไม่รู้ → ค้นคว้าให้ลึกขึ้น
ภาพรวมสถาปัตยกรรมของวงจร
วงจรการค้นคว้าเชิงลึกมี 5 ระยะที่ทำซ้ำกัน:
- คำค้นเริ่มต้น — ค้นหาด้วยคำถามเดิมของผู้ใช้
- อ่านผลลัพธ์อันดับต้น — ดึงข้อเท็จจริงสำคัญจากแหล่งข้อมูลที่ดีที่สุด 3 แหล่ง
- ระบุช่องว่าง — ยังมีคำถามสำคัญใดที่ไม่ได้รับคำตอบ
- คำค้นติดตามผล — สร้างการค้นหาเฉพาะจุดสำหรับช่องว่างเหล่านั้น
- สังเคราะห์ — รวมข้อเท็จจริงทั้งหมดที่รวบรวมได้เป็นคำตอบสุดท้าย
def deep_research(question, max_iterations=3):
all_facts = []
queries_used = [question]
for iteration in range(max_iterations):
results = search_and_rank(queries_used[-1])
facts = extract_facts(results, question)
all_facts.extend(facts)
gaps = identify_knowledge_gaps(question, all_facts)
if not gaps:
print(f'Research complete after {iteration + 1} iterations')
break
follow_up = generate_follow_up_query(gaps)
queries_used.append(follow_up)
print(f'Iteration {iteration + 1}: {follow_up}')
return synthesize_answer(question, all_facts)ระยะที่ 1: การค้นหาเริ่มต้น
การค้นหาครั้งแรกใช้คำถามเดิมของผู้ใช้ ดึงผลลัพธ์ 3–5 รายการและแยกเนื้อหาข้อความดิบออกมา ระยะนี้มุ่งเน้นความครอบคลุม เพื่อให้เห็นภาพรวมของขอบเขตหัวข้อ
from tavily import TavilyClient
import os
client = TavilyClient(api_key=os.getenv('TAVILY_API_KEY'))
def initial_search(question, n_results=5):
results = client.search(
query=question,
max_results=n_results,
search_depth='advanced' # deeper extraction for research tasks
)
return results.get('results', [])
# Also capture the direct answer if available
def get_direct_answer(question):
results = client.search(query=question, max_results=3)
return results.get('answer', '') # Tavily's synthesized answerระยะที่ 2: การแยกข้อเท็จจริงสำคัญ
ส่งผลการค้นหาดิบให้ LLM แล้วขอให้แยกข้อเท็จจริงเฉพาะที่ตรวจสอบได้และเกี่ยวข้องกับคำถามการค้นคว้า ข้อเท็จจริงควรเป็นหน่วยย่อย กล่าวคือหนึ่งข้อกล่าวอ้างต่อหนึ่งรายการ
EXTRACT_FACTS_PROMPT = '''You are a research assistant.
From the search results below, extract all factual claims relevant to the question.
Question: {question}
Search results:
{results_text}
Return a JSON list of facts:
["GPT-4 was released in March 2023",
"GPT-4 supports 128k context window",
...]
Only include verifiable facts. No opinions or summaries. JSON:'''
def extract_facts(results, question):
import json
results_text = '\n\n'.join(
f"[{i+1}] {r['title']}\n{r['content'][:600]}"
for i, r in enumerate(results)
)
response = llm_call(EXTRACT_FACTS_PROMPT.format(
question=question, results_text=results_text
))
return json.loads(response)ระยะที่ 3: การระบุช่องว่างของความรู้
หลังการค้นหาแต่ละรอบ ให้ถาม LLM ว่า เมื่อพิจารณาจากสิ่งที่เราทราบจนถึงตอนนี้ ยังมีประเด็นสำคัญใดของคำถามเดิมที่ไม่ได้รับการกล่าวถึง
ช่องว่างเหล่านี้จะกลายเป็นคำค้นสำหรับการค้นหารอบถัดไป
GAPS_PROMPT = '''You are a research analyst.
Original research question: {question}
Facts gathered so far:
{facts}
What important aspects of the question are still NOT covered by these facts?
List 2-3 specific knowledge gaps as a JSON array of strings.
If the question is fully answered, return an empty array [].
JSON:'''
def identify_knowledge_gaps(question, facts):
import json
facts_text = '\n'.join(f'- {f}' for f in facts)
response = llm_call(GAPS_PROMPT.format(
question=question, facts=facts_text
))
return json.loads(response)ระยะที่ 4: การสร้างคำค้นติดตามผล
เปลี่ยนช่องว่างของความรู้ให้เป็นคำค้นที่มีประสิทธิภาพ ช่องว่างอย่าง “เราไม่ทราบรูปแบบการคิดราคา” อาจกลายเป็นคำค้นเฉพาะจุดอย่าง “ราคาของ GPT-4 API ต่อตัวอักษรในปี 2024”
QUERY_GEN_PROMPT = '''Convert these knowledge gaps into specific web search queries.
Original topic: {topic}
Knowledge gaps:
{gaps}
Return a JSON array of search query strings.
Make each query specific and searchable.
JSON:'''
def generate_follow_up_queries(topic, gaps):
import json
gaps_text = '\n'.join(f'- {g}' for g in gaps)
response = llm_call(QUERY_GEN_PROMPT.format(
topic=topic, gaps=gaps_text
))
queries = json.loads(response)
return queries[:3] # max 3 follow-up queries per iterationเกณฑ์การยุติ
หากไม่มีเกณฑ์การยุติที่ชัดเจน วงจรจะทำงานไม่สิ้นสุด ควรหยุดเมื่อ: (1) ไม่พบช่องว่างใด ๆ (2) ทำงานครบจำนวนรอบสูงสุด (3) ใช้งบประมาณโทเค็นหมด หรือ (4) ข้อเท็จจริงใหม่คล้ายกับข้อเท็จจริงเดิมมากเกินไปจนได้ข้อมูลเพิ่มเพียงเล็กน้อย
MAX_ITERATIONS = 4
MAX_FACTS = 50
MIN_NEW_FACTS_TO_CONTINUE = 3
def should_continue(gaps, all_facts, new_facts, iteration):
if iteration >= MAX_ITERATIONS:
print(f'Stopping: max iterations ({MAX_ITERATIONS}) reached')
return False
if not gaps:
print('Stopping: no knowledge gaps found')
return False
if len(all_facts) >= MAX_FACTS:
print(f'Stopping: fact budget ({MAX_FACTS}) reached')
return False
if len(new_facts) < MIN_NEW_FACTS_TO_CONTINUE:
print(f'Stopping: diminishing returns ({len(new_facts)} new facts)')
return False
return True
if __name__ == '__main__':
print('Continue?', should_continue(gaps=['gap1'], all_facts=['f'] * 10, new_facts=['f1', 'f2', 'f3'], iteration=1))
print('Continue?', should_continue(gaps=[], all_facts=['f'] * 10, new_facts=['f1'], iteration=1))
ระยะที่ 5: การสังเคราะห์คำตอบสุดท้าย
เมื่อวงจรยุติแล้ว ให้ส่งข้อเท็จจริงที่รวบรวมทั้งหมดให้ LLM สังเคราะห์ หน้าที่ของ LLM คือจัดระเบียบข้อเท็จจริงให้เป็นคำตอบที่สอดคล้องกัน มีโครงสร้างชัดเจน และระบุแหล่งที่มา
SYNTHESIS_PROMPT = '''You are a research writer.
Original question: {question}
Researched facts (gathered from {n_iterations} search iterations):
{facts}
Write a comprehensive, well-structured answer based on these facts.
Format with clear sections. Be specific and cite facts where relevant.
If any aspect of the question could not be fully answered, say so.
Answer:'''
def synthesize_answer(question, all_facts, n_iterations):
facts_text = '\n'.join(f'- {f}' for f in all_facts)
return llm_call(SYNTHESIS_PROMPT.format(
question=question,
facts=facts_text,
n_iterations=n_iterations
))การติดตามแหล่งที่มาตลอดหลายรอบ
ในวงจรที่มีหลายรอบ คุณจะรวบรวมข้อเท็จจริงจากแหล่งข้อมูลที่แตกต่างกันจำนวนมาก ควรติดตามว่าข้อเท็จจริงแต่ละข้อมาจากแหล่งใด เพื่อให้คำตอบสุดท้ายอ้างอิงได้อย่างถูกต้อง
def extract_facts_with_sources(results, question):
import json
PROMPT = '''Extract facts from these search results. For each fact include the source URL.
Question: {question}
Results: {results_text}
Return JSON list:
[{{"fact": "GPT-4 supports 128k context", "source": "https://openai.com/..."}}, ...]
JSON:'''
results_text = '\n\n'.join(
f"[URL: {r['url']}]\n{r['content'][:500]}"
for r in results
)
response = llm_call(PROMPT.format(
question=question, results_text=results_text
))
return json.loads(response)การทำงานของการค้นหาแบบขนาน
เมื่อมีคำค้นติดตามผลหลายคำ ให้ทำงานแบบขนานโดยใช้ asyncio เพื่อลดเวลาการค้นคว้าทั้งหมด วิธีนี้อาจลดเวลาของวงจร 3 รอบจาก 30 วินาทีเหลือ 15 วินาที
import asyncio
async def async_search(client, query):
# Tavily has async support
loop = asyncio.get_event_loop()
result = await loop.run_in_executor(
None,
lambda: client.search(query=query, max_results=3)
)
return result.get('results', [])
async def parallel_search(queries):
tasks = [async_search(client, q) for q in queries]
results_list = await asyncio.gather(*tasks)
# Flatten
return [r for results in results_list for r in results]
# Run in event loop
all_results = asyncio.run(parallel_search(follow_up_queries))การลบข้อเท็จจริงซ้ำ
แหล่งข้อมูลต่างกันมักระบุข้อเท็จจริงเดียวกันด้วยถ้อยคำต่างกัน ก่อนการสังเคราะห์ ให้ลบข้อเท็จจริงซ้ำโดยใช้ความคล้ายคลึงของเวกเตอร์ฝังตัว เพื่อไม่ให้ข้อมูลเดียวกันปรากฏซ้ำหลายครั้งในคำตอบสุดท้าย
def deduplicate_facts(facts, similarity_threshold=0.92):
if not facts:
return facts
# Get embeddings for all facts
embeddings = [embed(f) for f in facts]
unique_indices = [0] # always keep first
for i in range(1, len(facts)):
is_duplicate = False
for j in unique_indices:
sim = cosine_similarity(embeddings[i], embeddings[j])
if sim > similarity_threshold:
is_duplicate = True
break
if not is_duplicate:
unique_indices.append(i)
unique_facts = [facts[i] for i in unique_indices]
print(f'Deduplicated: {len(facts)} -> {len(unique_facts)} facts')
return unique_factsตรวจสอบความรู้
เมื่อไม่พบช่องว่างของความรู้ เงื่อนไขการยุติที่ถูกต้องสำหรับวงจรการค้นคว้าเชิงลึกคืออะไร
ทบทวน: รูปแบบวงจรการค้นคว้าเชิงลึก
รูปแบบวงจรการค้นคว้าเชิงลึกคือ ค้นหา → แยกข้อเท็จจริง → ค้นหาช่องว่าง → สร้างคำค้นติดตามผล → ทำซ้ำ → สังเคราะห์ ซึ่งเลียนแบบวิธีทำงานของนักค้นคว้ามนุษย์
การตัดสินใจด้านการออกแบบที่สำคัญ ได้แก่ เกณฑ์การยุติ (จำนวนรอบสูงสุด ไม่มีช่องว่าง หรือได้ข้อมูลเพิ่มเพียงเล็กน้อย) การติดตามแหล่งที่มาเพื่อการอ้างอิง การค้นหาแบบขนานเพื่อความรวดเร็ว และการลบข้อเท็จจริงซ้ำก่อนสังเคราะห์ ควรจำกัดไว้ที่ 3–4 รอบเพื่อรักษาสมดุลระหว่างความลึก ค่าใช้จ่าย และเวลาแฝง
คำถามที่พบบ่อย
บทเรียน “รูปแบบลูปการวิจัยเชิงลึก” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “รูปแบบลูปการวิจัยเชิงลึก” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส AI Agents ให้อัปเกรดเป็น CoddyKit PRO คอร์ส AI Agents มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “รูปแบบลูปการวิจัยเชิงลึก”
ค้นหา → อ่าน → ดึงข้อมูล → สังเคราะห์ → ค้นหาอีกครั้ง สำหรับการวิจัยหลายขั้น คุณปฏิบัติ AI Agents ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน AI Agents หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน AI Agents บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน
บทเรียน “รูปแบบลูปการวิจัยเชิงลึก” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน AI Agents นี้ได้ไหม
ได้ บทเรียน AI Agents ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- Tavily และ SerpAPI สำหรับการค้นหาของตัวแทน
- การจัดอันดับและกรองผลการค้นหา
- รูปแบบลูปการวิจัยเชิงลึก
- การผสานการค้นหาเว็บกับ RAG