如何让你的大模型联网:网络研究助手指北

1,515 阅读4分钟

你是否想过让你的大模型能够实时获取网络上的最新信息?今天,我们就来聊聊如何让你的大模型联网,通过一个高效的网络研究助手来实现这一目标

一图胜千言,结构主要是这样:

图片

一个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. 总结

现在,你已经了解了如何让你的大模型联网。赶快试试吧,体验智能网络研究助手的强大功能!

图片