|
from dataclasses import dataclass |
|
from datetime import datetime |
|
from typing import Generator |
|
|
|
import requests |
|
|
|
|
|
@dataclass |
|
class SearchResult: |
|
def __init__(self, title: str, body: str, url: str): |
|
self.title = title |
|
self.body = body |
|
self.url = url |
|
|
|
|
|
def get_web_search_results( |
|
prompt: str, |
|
num_results: int, |
|
) -> Generator[SearchResult, None, None]: |
|
"""Adds web search results to the prompt. |
|
Using """ |
|
url = f"https://ddg-webapp-aagd.vercel.app/search?max_results={num_results}&q=${prompt}" |
|
response = requests.get(url) |
|
if response.status_code != 200: |
|
raise ValueError(f"Failed to get web search results for prompt: {prompt}") |
|
results = response.json() |
|
for result in results: |
|
yield SearchResult( |
|
title=result["title"], |
|
body=result["body"], |
|
url=result["href"], |
|
) |
|
|
|
|
|
def format_search_result(search_result: Generator[SearchResult, None, None]) -> str: |
|
"""Formats a search result to be added to the prompt.""" |
|
ans = "" |
|
for i, result in enumerate(search_result): |
|
ans += f"[{i}] {result.body}\nURL: {result.url}\n\n" |
|
return ans |
|
|
|
|
|
def rewrite_prompt( |
|
prompt: str, |
|
num_results: int, |
|
) -> str: |
|
"""Rewrites the prompt by adding web search results to it.""" |
|
raw_results = get_web_search_results(prompt, num_results) |
|
formatted_results = "Web search results: " + format_search_result(raw_results) |
|
formatted_date = "Current date: " + datetime.now().strftime("%d/%m/%Y") |
|
default_instructions = "Instructions: Using the provided web search results, write a comprehensive reply to the given query. Make sure to cite results using [[number](URL)] notation after the reference. If the provided search results refer to multiple subjects with the same name, write separate answers for each subject." |
|
formatted_prompt = f"Query: {prompt}" |
|
return "\n".join([formatted_results, formatted_date, default_instructions, formatted_prompt]) |
|
|