你是否想过让你的大模型能够实时获取网络上的最新信息?今天,我们就来聊聊如何让你的大模型联网,通过一个高效的网络研究助手来实现这一目标
一图胜千言,结构主要是这样:
一个app,图里是用streamlit实现的,当然你也可以next或其他,然后agent-1去网页抓取信息,用duckduckgo或者baidusearch都ok,主要看你的网络环境,然后agent-2对agent-1的结果去重、相似性保留等,最终agent-3去真正的完成写作。
分开讲讲:
1. 前端界面:简单询问,智能响应
首先,你需要一个前端界面,用户可以在这里输入他们的问题或需求。这个界面会直接与后台的智能系统进行交互,确保用户的问题能够得到快速响应。它可以是这样:
2. 三个智能代理:分工合作,高效处理
在后台,我们创建了三个智能代理,它们各自负责不同的任务,共同协作,确保最终结果的准确性和相关性。
代理创建我们用的是openAI的Swarm,这里先初始化
from swarm import Swarm
from datetime import datetime
from openai import OpenAI
import os
from dotenv import load_dotenv
load_dotenv()
dp_key = os.getenv("OPENAI_API_KEY")
class SingletonSwarm:
_instance = None
def __new__(cls, *args, **kwargs):
if not cls._instance:
cls._instance = super(SingletonSwarm, cls).__new__(cls, *args, **kwargs)
cls._instance.client = Swarm(client=OpenAI(
api_key=dp_key,
base_url="https://api.deepseek.com/v1",
))
return cls._instance
client = SingletonSwarm().client
本身Swam是默认使用OpenAI的key,但是国内更方便的是使用deepseek,这里做下置换,自己去deepseek官网创建,然后在你的项目根目录下创建.env
OPENAI_API_KEY = "XXX"
代理一:网络搜索
这个代理负责从网络上搜索最新的相关信息。原本我们使用的是DuckDuckGo,但由于网络环境的原因,我们改为使用BaiduSearch。它会搜索10到20条最新的相关信息,确保信息的时效性和广泛性。这里model也改为国内的deepseek-chat
web_search_agent = Agent(
name="网页搜索助手",
instructions="你的角色是根据一个详细的主题使用百度搜索搜索最新新闻文章",
functions=[search_web],
model="deepseek-chat",
)
search_web 方法我们用baidusearch实现
from baidusearch import search
def search_web(query):
print(f"Searching the web for {query}...")
#baidu search
results = search(query, num_results=10) # returns 20 or less results
print(results)
if results:
news_results = ""
for result in results:
news_results += f"Title: {result['title']}\nURL: {result['url']}\nDescription: {result['abstract']}\n\n"
return news_results.strip()
else:
return f"Could not find news results for {query}."
代理二:结果处理
搜索到的信息会被传递给第二个代理。这个代理的任务是处理和筛选信息,保留那些与用户需求更相关且不重复的内容。通过这种方式,我们可以确保最终结果的质量和相关性。
from baidusearch import search
def search_web(query):
print(f"Searching the web for {query}...")
#baidu search
results = search(query, num_results=10) # returns 20 or less results
print(results)
if results:
news_results = ""
for result in results:
news_results += f"Title: {result['title']}\nURL: {result['url']}\nDescription: {result['abstract']}\n\n"
return news_results.strip()
else:
return f"Could not find news results for {query}."
代理三:文案整合
最后一个代理是写手,它负责整合第二个代理的分析结果。它会根据用户的需求,将信息整合成一个清晰、易懂的最终结果,并返回给用户。
writer_agent = Agent(
name="写作助手",
instructions="""你的职责是将删减的研究成果转化为一篇精雕细琢、准备发表的文章。你应该:
1. 将内容组织为清晰的主题部分
2. 用专业且积极的腔调去书写, 需要时真诚的且信息丰富的
3. 确保主题之间的适当流动
4. 在需要的地方添加相关上下文
5. 保持事实的准确性,同时使复杂的主题易于理解
6. 在开头部分添加简短摘要
7. 格式由丰富的标题和副标题
8. 保存原始材料中的所有关键信息""",
model="deepseek-chat",
)
3. 最终结果:清晰表达,满足需求
通过这三个代理的协作,最终的结果不仅准确,而且表达清晰,完全满足用户的需求。无论用户需要的是最新的新闻、专业的分析,还是其他类型的信息,这个网络研究助手都能提供最合适的答案。
def run_workflow_optimized(query):
# 启动线程进行搜索和分析
news_response = None
research_analysis_response = None
# 定义线程函数
def search_web_thread():
nonlocal news_response
news_response = client.run(
agent=web_search_agent,
messages=[{"role": "user", "content": f"Search the web for {query}"}],
)
def analyze_thread():
nonlocal research_analysis_response
research_analysis_response = client.run(
agent=researcher_agent,
messages=[{"role": "user", "content": raw_news}],
)
search_thread = threading.Thread(target=search_web_thread)
analyze_thread = threading.Thread(target=analyze_thread)
search_thread.start()
search_thread.join() # 等待搜索完成
raw_news = news_response.messages[-1]["content"]
analyze_thread.start()
analyze_thread.join() # 等待分析完成
deduplicated_news = research_analysis_response.messages[-1]["content"]
# 编辑和发布分析结果
return client.run(
agent=writer_agent,
messages=[{"role": "user", "content": deduplicated_news}],
stream=True # 启用流式传输
)
用flask讲上述方法封装为一个api,就可以调用使用了
4. 总结
现在,你已经了解了如何让你的大模型联网。赶快试试吧,体验智能网络研究助手的强大功能!