CH8 - SunXiaoXiang/learn_wowagent GitHub Wiki

Zigent 是一个基于 Agentlite 框架改进的智能代理开发框架。Agentlite 最初由 Salesforce AI Research 团队开发,是一个强大的 Agent 开发框架。Zigent 在其基础上进行了定制化改进,使其更适合特定场景的应用。

环境准备

pip install duckduckgo_search

从源代码拷贝

# 加载环境变量
load_dotenv()

# 从环境变量中读取api_key
api_key = os.getenv('ZISHU_API_KEY')
base_url = "https://open.bigmodel.cn/api/paas/v4/"
chat_model = "glm-4-flash"

引入 zigent 相关的方法如Action、Agent、大模型配置等以及 duckduckgo_search :

from typing import List
from zigent.agents import ABCAgent, BaseAgent
from zigent.llm.agent_llms import LLM
from zigent.commons import TaskPackage
from zigent.actions.BaseAction import BaseAction
from zigent.logging.multi_agent_log import AgentLogger
from duckduckgo_search import DDGS

配置 LLM

需要配置大语言模型。这里使用 zigent 封装的 LLM加载和配置 LLM 服务:

llm = LLM(api_key=api_key, base_url=base_url, model_name=chat_model)
response = llm.run("你是谁?")
print(response)

创建搜索动作

首先,我们需要创建一个搜索动作类,它将处理与 DuckDuckGo 的具体交互: 需要注意的是,DuckDuckGo需要科学上网。

class DuckSearchAction(BaseAction):
    def __init__(self) -> None:
        action_name = "DuckDuckGo_Search"
        action_desc = "Using this action to search online content."
        params_doc = {"query": "the search string. be simple."}
        self.ddgs = DDGS()
        super().__init__(
            action_name=action_name, 
            action_desc=action_desc, 
            params_doc=params_doc,
        )

    def __call__(self, query):
        results = self.ddgs.chat(query)
        return results

这个类主要做两件事:

  1. 初始化时配置动作的名称、描述和参数说明
  2. 通过 call 方法执行实际的搜索操作 使用示例:
search_action = DuckSearchAction()
results = search_action("什么是 agent")
print(results)

我们将得到类似结果:

“Agent”这个词在不同的领域有不同的含义。以下是一些常见的解释:

  1. 一般意义:在日常用语中,agent指的是一个代理人或代表,负责代表他人进行某种活动或决策 。
  2. 计算机科学:在人工智能和计算机科学中,agent通常指的是一种能够感知其环境并采取行动以 实现特定目标的程序或系统。例如,智能代理可以在网络上自动执行任务。
  3. 商业:在商业领域,agent可以指代中介或代理商,他们代表公司或个人进行交易或谈判。
  4. 生物学:在生物学中,agent可以指代某种物质或生物体,能够引起特定的生物反应,例如病原 体。

具体的含义通常取决于上下文。如果你有特定的领域或上下文,请告诉我,我可以提供更详细的信息。

创建搜索代理

接下来,我们创建一个继承自 BaseAgent 的搜索代理类,它需要一个大语言模型 (llm)、一组动作(默认是 DuckSearchAction)、代理名称和角色描述:

class DuckSearchAgent(BaseAgent):
    def __init__(
        self,
        llm: LLM,
        actions: List[BaseAction] = [DuckSearchAction()],
        manager: ABCAgent = None,
        **kwargs
    ):
        name = "duck_search_agent"
        role = "You can answer questions by using duck duck go search content."
        super().__init__(
            name=name,
            role=role,
            llm=llm,
            actions=actions,
            manager=manager
        )

执行代理

最后,我们来执行我们创建的代理:

def do_search_agent():
    # 创建代理实例
    search_agent = DuckSearchAgent(llm=llm)

    # 创建任务
    task = "what is the found date of microsoft"
    task_pack = TaskPackage(instruction=task)

    # 执行任务并获取响应
    response = search_agent(task_pack)
    print("response:", response)

if __name__ == "__main__":
    do_search_agent()

所有代码如下:


import os

from dotenv import load_dotenv

from typing import List

from zigent.agents import ABCAgent, BaseAgent

from zigent.llm.agent_llms import LLM

from zigent.commons import TaskPackage

from zigent.actions.BaseAction import BaseAction

from zigent.logging.multi_agent_log import AgentLogger

from duckduckgo_search import DDGS

  

# 加载环境变量

load_dotenv()

  

# 从环境变量中读取api_key

api_key = os.getenv('ZISHU_API_KEY')

base_url = "https://open.bigmodel.cn/api/paas/v4/"

chat_model = "glm-4-flash"

  

# 配置 LLM

llm = LLM(api_key=api_key, base_url=base_url, model_name=chat_model)

  

# 测试 LLM

response = llm.run("你是谁?")

print(response)

  

# 创建搜索动作

class DuckSearchAction(BaseAction):

def __init__(self) -> None:

action_name = "DuckDuckGo_Search"

action_desc = "Using this action to search online content."

params_doc = {"query": "the search string. be simple."}

self.ddgs = DDGS()

super().__init__(

action_name=action_name,

action_desc=action_desc,

params_doc=params_doc,

)

  

def __call__(self, query):

results = self.ddgs.chat(query)

return results

  

# 使用示例

search_action = DuckSearchAction()

results = search_action("什么是 agent")

print(results)

  

# 创建搜索代理

class DuckSearchAgent(BaseAgent):

def __init__(

self,

llm: LLM,

actions: List[BaseAction] = [DuckSearchAction()],

manager: ABCAgent = None,

**kwargs

):

name = "duck_search_agent"

role = "You can answer questions by using duck duck go search content."

super().__init__(

name=name,

role=role,

llm=llm,

actions=actions,

manager=manager

)

  

# 执行代理

def do_search_agent():

# 创建代理实例

search_agent = DuckSearchAgent(llm=llm)

  

# 创建任务

task = "what is the found date of microsoft"

task_pack = TaskPackage(instruction=task)

  

# 执行任务并获取响应

response = search_agent(task_pack)

print("response:", response)

  

if __name__ == "__main__":

do_search_agent()

执行结果