Überblick über das Projekt
Durch die Integration von DuckDuckGo
Such-APIs, die dem gemeinsamen großen Sprachmodell eine ähnliche Neues Bing
Web-Zugang in Echtzeit und intelligente Frage- und Antwortfunktionen. Multiplexing großer Modelle bestehender FunktionsaufrufFunktionen für eine effiziente und flexible Verarbeitung von Anfragen und die Generierung von Antworten.
Kern-Umsetzung
Das System verwendet die Funktionsaufruf
Mechanismus für die nahtlose Integration von Anfrageverarbeitung und Antwortgenerierung:
- Abfrageanalyse und Suche: Verwendung
claude-3-haiku
vielleichtgpt-3.5-turbo
Das einfachere Modell erzeugt optimierte Suchbegriffe und ruft die Such-API über Funktionsaufrufe auf. - Websuche: Rufen Sie die DuckDuckGo API auf, um Informationen in Echtzeit abzurufen.
- Intelligente Antwortgenerierung: mit
claude-3-5-sonnnet
vielleichtgpt-4o
Komplexere Modelle wie diese kombinieren Suchergebnisse und ursprüngliche Fragen, um genaue und umfassende Antworten zu generieren.
Code-Implementierung
1. die Umgebungseinstellungen und Funktionsdefinitionen
importieren os
json importieren
von openai importieren OpenAI
from duckduckgo_search import DDGS
API_KEY = os.getenv("OPENAI_API_KEY")
BASE_URL = os.getenv("OPENAI_BASE_URL")
client = OpenAI(api_key=API_KEY, base_url=BASE_URL)
FUNCTIONS = [
{
"name": "search_duckduckgo",
"description": "Suchen Sie nach Informationen mit der DuckDuckGo-Suchmaschine. Sie können nach den neuesten Nachrichten, Artikeln, Blogs und mehr suchen." ,
"Parameter": {
"Typ": "Objekt",
"Eigenschaften": {
"keywords": {
"type": "array", "items": { "type": "string", { "string": {
"items": { "type": "string"}, "description": "searchlist".
"description": "Eine Liste von Schlüsselwörtern, nach denen gesucht werden soll. Zum Beispiel: ['Python', 'maschinelles Lernen', 'jüngste Fortschritte']."
}
},.
"required": ["keywords"]
}
}
]
2. verwandte Hilfsfunktionen
def search_duckduckgo(keywords):
search_term = " ".join(keywords)
with DDGS() as ddgs:
return list(ddgs.text(keywords=search_term, region="cn-zh", safesearch="on", max_results=5))
def print_search_results(results):
for result in results:
print(
f"标题: {result['title']}\n链接: {result['href']}\n摘要: {result['body']}\n---")
def get_openai_response(messages, model="gpt-3.5-turbo", functions=None, function_call=None):
try:
response = client.chat.completions.create(
model=model,
messages=messages,
functions=functions,
function_call=function_call
)
return response.choices[0].message
except Exception as e:
print(f"调用OpenAI API时出错: {str(e)}")
return None
def process_function_call(response_message):
function_name = response_message.function_call.name
function_args = json.loads(response_message.function_call.arguments)
print(f"\n模型选择调用函数: {function_name}")
if function_name == "search_duckduckgo":
keywords = function_args.get('keywords', [])
if not keywords:
print("错误:模型没有提供搜索关键词")
return None
print(f"关键词: {', '.join(keywords)}")
function_response = search_duckduckgo(keywords)
print("\nDuckDuckGo搜索返回结果:")
print_search_results(function_response)
return function_response
else:
print(f"未知的函数名称: {function_name}")
return None
3. die wichtigsten Verarbeitungsfunktionen
def main(Frage).
print(f "Frage: {Frage}")
messages = [{"role": "user", "content": question}]
response_message = get_openai_response(
messages, functions=FUNCTIONS, function_call="auto")
if not response_message: return
if not response_message: return
if response_message.function_call.
function_response = process_function_call(response_message)
if function_response.
messages.extend([
response_message.model_dump(), {
{
"role": "function", "name": response_message.model_dump(), {
"name": response_message.function_call.name, {
"Inhalt": json.dumps(function_response, ensure_ascii=False)
}
])
final_response = get_openai_response(messages, model="gpt-4o")
if final_response.
print("\n endgültige Antwort:")
print(final_response.content)
else: if final_response: print("\n endgültige Antwort:")
print("\n model direct response:")
print(response_message.content)
Realisierung
Auf diese Weise können große Modelle erstellt werden, mit denen beispielsweise eine Vielzahl von Fragen beantwortet werden kann:
- Geografische Informationen: "Gehört Foshan zur PRD?"
- Fragen zu den eigenen Fähigkeiten der KI, "Was kannst du?"
- Domänenspezifische Frage: "Wer ist der Autor von Plants vs. Zombies Hybrid?"
- Philosophische Betrachtung: "Das Leben besteht aus zwei Worten, welche zwei Worte sind es?"
- Aktuelle Veranstaltungen zum Thema "Was ist springende Ungleichheit?"
- Zeitbezogene Frage: "Wie spät ist es jetzt in Peking?
Vollständiger Code
import os import json from openai import OpenAI from duckduckgo_search import DDGS API_KEY = os.getenv("OPENAI_API_KEY") BASE_URL = os.getenv("OPENAI_BASE_URL") client = OpenAI(api_key=API_KEY, base_url=BASE_URL) FUNCTIONS = [ { "name": "search_duckduckgo", "description": "使用DuckDuckGo搜索引擎查询信息。可以搜索最新新闻、文章、博客等内容。", "parameters": { "type": "object", "properties": { "keywords": { "type": "array", "items": {"type": "string"}, "description": "搜索的关键词列表。例如:['Python', '机器学习', '最新进展']。" } }, "required": ["keywords"] } } ] def search_duckduckgo(keywords): search_term = " ".join(keywords) with DDGS() as ddgs: return list(ddgs.text(keywords=search_term, region="cn-zh", safesearch="on", max_results=5)) def print_search_results(results): for result in results: print( f"标题: {result['title']}\n链接: {result['href']}\n摘要: {result['body']}\n---") def get_openai_response(messages, model="gpt-3.5-turbo", functions=None, function_call=None): try: response = client.chat.completions.create( model=model, messages=messages, functions=functions, function_call=function_call ) return response.choices[0].message except Exception as e: print(f"调用OpenAI API时出错: {str(e)}") return None def process_function_call(response_message): function_name = response_message.function_call.name function_args = json.loads(response_message.function_call.arguments) print(f"\n模型选择调用函数: {function_name}") if function_name == "search_duckduckgo": keywords = function_args.get('keywords', []) if not keywords: print("错误:模型没有提供搜索关键词") return None print(f"关键词: {', '.join(keywords)}") function_response = search_duckduckgo(keywords) print("\nDuckDuckGo搜索返回结果:") print_search_results(function_response) return function_response else: print(f"未知的函数名称: {function_name}") return None def main(question): print(f"问题:{question}") messages = [{"role": "user", "content": question}] response_message = get_openai_response( messages, functions=FUNCTIONS, function_call="auto") if not response_message: return if response_message.function_call: if not response_message.content: response_message.content = "" function_response = process_function_call(response_message) if function_response: messages.extend([ response_message.model_dump(), { "role": "function", "name": response_message.function_call.name, "content": json.dumps(function_response, ensure_ascii=False) } ]) final_response = get_openai_response(messages, model="gpt-4o") if final_response: print("\n最终回答:") print(final_response.content) else: print("\n模型直接回答:") print(response_message.content) if __name__ == "__main__": main("植物大战僵尸杂交版的作者是谁?他是怎么想到做出来这个游戏的?")