人工智能基础知识笔记二十二:构建一个可以搜索Web的Agent

1、什么是 Agent(智能体)?

简单来说,一个 Agent 是一个能够感知环境、自主决策并采取行动以实现特定目标的系统或实体。

Agent 将语言模型与工具相结合,以创建能够对任务进行推理、决定使用哪些工具并逐步解决问题的系统。创建一个Agent很简单,只需要调用create_agent即可。

您可以把它想象成一个数字世界的"智能助理"或"虚拟员工"。它不是简单地响应一个指令,而是拥有一定程度的自主权,去规划并完成一个复杂目标。

一个 Agent 通常具备以下核心特征:

  1. 自主性:能在没有人类直接干预的情况下运行。

  2. 感知能力:能从环境(如文本、数据、传感器、用户输入)中获取信息。

  3. 决策与推理能力:能处理信息,理解目标,并制定行动计划。

  4. 行动能力:能执行决策,对环境产生影响(如输出文字、调用工具、控制设备)。

  5. 目标导向:所有行为都围绕实现预设或动态生成的目标。

2、Agent 的主要类型

根据https://docs.langchain.com/oss/python/langchain/agents,可以看到Agent有两种类型:一种是基于Static model的,就是模型在配置之后,固定不变;另外一种是基于动态模型的,在运行时根据状态和背景动态选择模型。

2.1 Static model

Static Model比较简单,在初始化时,初始化选择的模型,在整个Agent运行期间,都是用固定的模型。它有如下几个特征:

  1. 模型参数固定

    1. 这个Agent所依赖的模型(如DeepSeek、qwen等大语言模型)是一个已经训练完成的"冻结"版本。

    2. 它在与用户交互时,不会因为对话内容而改变其内部的权重或参数。它不会从单次对话中"学习"或"记住"你(除非在对话上下文中临时提及)。

  2. 依赖提示工程与上下文

    1. 由于模型本身不变,要让Agent完成特定任务,主要依靠精心设计的系统提示词(Prompt)提供给它的上下文信息
  3. 行为可预测且一致

    1. 在相同的输入和提示下,静态模型Agent会产生基本一致的输出。这种行为稳定性对于需要可靠性和一致性的生产环境至关重要。

2.1.1 Static Model Agent的主要作用与优势

尽管听起来"静态"不如"动态"高级,但它正是当前绝大多数AI应用落地的基石和主流选择,因为:

  1. 稳定与可靠:行为可预测,适合部署在需要稳定输出的商业场景(如客服、内容生成)。

  2. 安全与可控:由于模型不会自行改变,开发者可以更好地测试、审核和约束其输出,避免意外行为。

  3. 低成本与高效率:无需复杂的持续训练基础设施,利用强大的基础模型(如GPT-4),通过巧妙的提示工程和外部工具扩展,就能快速构建出功能强大的Agent。

  4. 聚焦于工作流与工具集成 :它的智能化体现在如何利用好一个强大的静态大脑。开发重点在于:

    • 规划:让Agent将大目标分解为子任务。

    • 工具使用:让Agent能调用搜索引擎、计算器、数据库、API等,弥补其知识静态性的不足。

    • 记忆外挂:通过向量数据库等技术,为Agent提供外部知识库,实现"长期记忆"。

2.1.2 典型应用场景

  • 基于大模型构建的各类助手:如编程助手、写作助手、数据分析助手。

  • 客服聊天机器人

  • AutoGPT、MetaGPT等早期实验项目:它们虽然能自动规划复杂任务,但其核心LLM模型在运行中依然是静态的。

2.1.3 一个网络查询的实例:

构建一个可以通过网络查询问题的Agent:

python 复制代码
from langchain_ollama import ChatOllama
from langchain.agents import create_agent
import tools
from langchain_core.tools import tool
from ddgs import DDGS

@tool
def web_search(query: str, num_results: int = 10)-> str:
    """Search the web using DuckDuckGo.
    Args :
    query:Search query stringnum results: Number of results to return(default: 10)
    Returns:
    Formatted search results with titles, descriptions, and URLs
    """

    try:
        results = list(DDGS().text(query=query,
                                   max_results=num_results,
                                   region="us-en",
                                   timelimit="d",
                                   backend="bing, brave, duckduckgo, yahoo, wikipedia"))
        if not results:
            return f"No results found for '{query}'"
        formatted_results =[f"search Results for '{query}':\n"]
        for i,result in enumerate(results, 1):
            title = result.get('title','No title')
            body =result.get('body','No description available')
            href = result.get('href','')
            formatted_results.append(f"{i}. **{title}**\n  {href} \n {body}")
    
        return "\n\n".join(formatted_results)
    except Exception as e:
        return f"search error:{str(e)}"


system_prompt = """
You are a helpful assistant. Use the available tools when needed to answer questions accurately.
If you need to search for information, use the search tool web_search.
Always provide a clear and concise answer.
"""

base_url = "http://localhost:11434"
model = ChatOllama(base_url=base_url, model="qwen2.5")

agent =  create_agent(model=model, tools=[web_search], system_prompt=system_prompt)

result = agent.invoke({'messages':"what is the top 10 global news right now?"})
print(result['messages'][-1].content)

2.2 Dynamic model

Dynamic Model的Agent(动态模型智能体) 指的是其核心的"大脑"(AI模型)在部署后参数能够根据新数据、交互经验或环境反馈进行持续更新、调整和学习 的智能体。它的核心特征是**"持续进化"**。

如果说Static Model Agent是一部出厂后系统就无法升级的手机,那么Dynamic Model Agent就是一部可以随时通过OTA升级系统、并能根据你的使用习惯自我优化的手机。

它有如下几个特征:

1) 模型参数可更新

  • 它的能力、知识、甚至行为偏好都可能随着时间而改变。

2) 具备持续学习能力

  • 从经验中学习:Agent通过试错获得奖励或惩罚,从而优化其决策策略(强化学习范式)。
  • 从新数据中学习:当遇到新知识或用户反馈时,它能将信息吸收并整合到自身模型中。
  • 适应环境变化:当任务目标或外部环境改变时,它能调整自身行为以适应新情况。

3) 拥有长期记忆与个性化

  • 这种学习能力使其能够建立真正的、内化的长期记忆。它不仅能记住用户的偏好,还能将这些偏好融入其未来的反应模式中,实现深度个性化。

2.2.1 Dynamic Model Agent的作用与优势

  1. 应对复杂和不确定的环境:在游戏(如AlphaGo)、机器人控制、金融市场交易等动态变化的环境中,静态规则无效,Agent必须通过试错和适应来找到最佳策略。

  2. 提供深度个性化服务:理想的个人AI助手应该越用越懂你,其建议和风格会随着与你互动的加深而演变,这需要动态学习能力。

  3. 实现自主优化:例如,一个用于内容推荐的Agent,可以通过实时分析用户的点击、停留时间等反馈,动态调整其推荐模型,提升点击率和用户满意度。

  4. 突破基础模型的能力上限:允许Agent在特定领域或任务上,通过专门的数据和经验,变得比其初始的通用基础模型更强大、更专业。

2.2.2 典型应用场景

  • 高级游戏AI:在游戏中通过自我对弈强化学习进化的AI。

  • 自适应机器人:能在真实物理世界中学习行走、抓取新物体的机器人。

  • 高频交易算法:根据市场变化动态调整策略的交易系统。

  • 下一代个人助理(尚在研究中):能真正理解用户长期习惯、主动进化的数字伴侣。

2.2.3 一个网络查询的实例:

主要是参考https://docs.langchain.com/oss/python/langchain/agents实现的一个基于网络查询的实例:

python 复制代码
from ddgs import DDGS

@tool
def web_search(query: str, num_results: int = 10)-> str:
    """Search the web using DuckDuckGo.
    Args :
    query:Search query stringnum results: Number of results to return(default: 10)
    Returns:
    Formatted search results with titles, descriptions, and URLs
    """

    try:
        results = list(DDGS().text(query=query,
                                   max_results=num_results,
                                   region="us-en",
                                   timelimit="d",
                                   backend="bing, brave, duckduckgo, yahoo, wikipedia"))
        if not results:
            return f"No results found for '{query}'"
        formatted_results =[f"search Results for '{query}':\n"]
        for i,result in enumerate(results, 1):
            title = result.get('title','No title')
            body =result.get('body','No description available')
            href = result.get('href','')
            formatted_results.append(f"{i}. **{title}**\n  {href} \n {body}")
    
        return "\n\n".join(formatted_results)
    except Exception as e:
        return f"search error:{str(e)}"

from langchain_ollama import ChatOllama
from langchain.agents import create_agent, AgentState
from langgraph.runtime import Runtime
import tools
from langchain.agents.middleware import wrap_model_call, ModelRequest, ModelResponse

base_url = "http://localhost:11434"
basic_model = ChatOllama(base_url=base_url, model="qwen2.5", num_predict=1000)
advanced_model = ChatOllama(base_url=base_url, model="llama3.2" , num_predict=1000)

# To use a dynamic model, create middleware using the @wrap_model_call decorator that modifies the model in the request:
@wrap_model_call
def dynamic_modlel_selection(request: ModelRequest, handler) -> ModelResponse:
    message_count = len(request.messages)
    if message_count > 5:
        print("Using basic model")
        request.model = basic_model
    else:
        print("Using advanced model")
        request.model = advanced_model  

    return handler(request)

agent = create_agent(model = basic_model, 
                     tools=[tools.web_search],
                     system_prompt = system_prompt,
                     middleware=[dynamic_modlel_selection])

def get_agent_output(messages: list):
    message =  {'messages':messages}
    result = agent.invoke(message)
    return result

messages = [
    "How are you?","What's the weather in Shanghai today?"
]

result = get_agent_output(messages)

运行程序打印如下:

javascript 复制代码
{'messages': [HumanMessage(content='How are you?', additional_kwargs={}, response_metadata={}, id='3930c215-6a11-4699-be17-64556e7a7331'),
  HumanMessage(content="What's the weather in Shanghai today?", additional_kwargs={}, response_metadata={}, id='6f733ed7-a4f6-4010-a9a0-275562c0b5d8'),
  AIMessage(content='{"name":"web_search",""parameters":{}}"', additional_kwargs={}, response_metadata={'model': 'llama3.2', 'created_at': '2025-12-02T11:15:17.9515601Z', 'done': True, 'done_reason': 'stop', 'total_duration': 21438158600, 'load_duration': 6808923300, 'prompt_eval_count': 253, 'prompt_eval_duration': 12804241900, 'eval_count': 12, 'eval_duration': 1810753800, 'logprobs': None, 'model_name': 'llama3.2', 'model_provider': 'ollama'}, id='lc_run--f1f09700-fd49-4865-b4b7-44fc46fee091-0', usage_metadata={'input_tokens': 253, 'output_tokens': 12, 'total_tokens': 265})]}

3、总结

Static Model Agent(静态智能体)的优势在于稳定、可控、成本低 ,其固定参数确保了行为可预测,易于部署和测试,当前已成为绝大多数AI应用(如客服、编程助手)的主流和基石 ;而Dynamic Model Agent(动态智能体)的优势在于能持续学习和自我进化,适应复杂环境并提供深度个性化,但其面临稳定性、安全性和控制难等巨大挑战

相关推荐
AA陈超23 分钟前
只想克隆项目中的 Source 文件夹,而不影响其他内容
笔记·git·学习
AA陈超30 分钟前
Lyra学习5:GameFeatureAction分析
c++·笔记·学习·ue5·lyra
YJlio30 分钟前
Autologon 学习笔记(9.13):安全启用“自动登录”的边界、风险与替代方案
笔记·学习·安全
我的golang之路果然有问题37 分钟前
word中latex插入矩阵的语法问题
笔记·学习·矩阵·word·latex·template method·分享
暗然而日章1 小时前
C++基础:Stanford CS106L学习笔记 2 初始化与引用
c++·笔记·学习
pq113_61 小时前
开源软件学习笔记 - little_flash + littlefs
笔记·学习·spi nand flash·ft4222h·little_flash
im_AMBER1 小时前
Canvas架构手记 08 副作用与同步 | 不可变更新 | 调试与错误边界 | ESLint
前端·笔记·学习·react.js·架构·typescript·前端框架
暗然而日章1 小时前
C++基础:Stanford CS106L学习笔记 5 内存与指针
c++·笔记·学习
锦锦锦aaa1 小时前
【版图面试之60问】
经验分享·笔记