在本部分我们将向您展示如何:
- 进行环境与应用工程准备
- 构建一个简单的agent
- 使用模式组件完成多agent协同
- 对agent执行效果进行测试调优
- 对agent进行快速服务化
- python 3.10+
我们提供了一个标准的工程模板,您可以到 这里 查看并进行下载。
sample_standard_app文件夹包含了一个标准的工程模板,您可以根据自己的需求进行修改。您也可以将sample_standard_app文件夹复制作为您的应用工程根目录。
通过pip安装
pip install agentUniverse
更多版本信息请查看PyPi agentUniverse
或使用poetry
等包管理工具安装与管理:
通过poetry安装
# Enter the root directory of your project
poetry add agentUniverse
poetry update
在您的工程根目录下创建一个config.toml
文件,内容如下:
# config.toml
[BASE_INFO]
# The app name will be applied to all processes including agent service integration.
appname = 'demo_app'
[CORE_PACKAGE]
# Perform a full component scan and registration for all the paths under this list.
default = ['sample_standard_app.app.core']
# Further information is omitted here.
[SUB_CONFIG_PATH]
# Custom key file path, use to save your own secret key like open ai or sth else. REMEMBER TO ADD IT TO .gitignore.
custom_key_path = './custom_key.toml'
# Further information is omitted here.
其中,[BASE_INFO]
部分是基础信息配置,[CORE_PACKAGE]
部分是组件扫描注册配置,[SUB_CONFIG_PATH]
部分是子配置文件路径配置。更详细的信息请参考后续的配置文件章节。
在使用过程中,您可能需要一些私有配置,比如密钥等。我们建议您将这些私有配置保存在一个独立的文件中,比如custom_key.toml
。您可以在config.toml
的custom_key_path
中配置这个文件的路径,custom_key_path
路径中的私有配置文件会自动注册到系统的环境变量中,您可以在后续代码中通过Config
操作器或通过系统变量来读取这些私有配置。
下面是一个custom_key.toml
的示例:
# Example file of custom_key.toml. Rename to custom_key.toml while using.
[KEY_LIST]
# Perform a full component scan and registration for all the paths under this list.
example_key = 'AnExampleKey'
SERPER_API_KEY='YourSerKey'
OPENAI_API_KEY='YourOpenAIKey'
在您的工程agent目录下创建xx_agent_case_a.yaml
文件,内容样例如下:
info:
name: 'demo_rag_agent'
description: 'demo rag agent'
profile:
introduction: 你是一位精通信息分析的ai助手。
target: 你的目标是判断问题对应的答案是否提供了有价值的信息,并对问题的答案做出建议和评价。
instruction: |
你需要遵守的规则是:
1. 必须使用中文结合查询的背景信息结合你所拥有的知识回答用户提出的问题。
2. 结构化答案生成,必要时通过空行提升阅读体验。
3. 不采用背景信息中的错误信息。
4. 要考虑答案和问题的相关性,不做对问题没有帮助的回答。
5. 详尽回答问题,重点突出,不过多花哨词藻。
6. 不说模糊的推测。
7. 尽量多的使用数值类信息。
背景信息是:
{background}
开始!
需要回答的问题是: {input}
llm_model:
name: 'demo_llm'
model_name: 'gpt-4-turbo'
plan:
planner:
name: 'rag_planner'
action:
tool:
- 'google_search_tool'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.rag_agent_case.demo_rag_agent'
class: 'DemoRagAgent'
在xx_agent_case_a.yaml
中,我们定义了一个DemoRagAgent
的配置。info
部分是agent的基本信息设置,profile
部分包含了agent使用llm模型设置 ,plan
部分包含了agent的行为计划设置(决定了agent的工作模式),action
部分包含了agent可使用的工具及知识设置,metadata
部分包含了agent对象的元数据设置。
创建一个同名的xx_agent_case_a.py
文件,内容样例如下:
from agentuniverse.agent.agent import Agent
from agentuniverse.agent.input_object import InputObject
class DemoRagAgent(Agent):
def input_keys(self) -> list[str]:
return ['input']
def output_keys(self) -> list[str]:
return ['output']
def parse_input(self, input_object: InputObject, agent_input: dict) -> dict:
agent_input['input'] = input_object.get_data('input')
return agent_input
def parse_result(self, planner_result: dict) -> dict:
return planner_result
在xx_agent_case_a.py
中,我们定义了一个DemoRagAgent
类,继承自Agent
类。我们在DemoRagAgent
类中实现了input_keys
、output_keys
、parse_input
和parse_result
方法。这些方法分别用于定义输入输出的key,解析输入和解析输出。
更多的agent开发细节请参考后续的agent开发章节。
planner决定了agent在协作模式中的作用。在xx_agent_case_a.yaml
中,我们定义了一个rag_planner
的配置,其决定了XXagent
会采用RAG的方式进行工作;在复杂的工作场景中,我们往往需要多个agent协同工作。我们可以通过配置多个agent来实现这一目的。
例如PEER模式就是一个典型的协同模式,它可以让多个agent同时工作,互相协作,共同完成一个任务,接下来我们将创建一个PEER模式的agent配置。
在您的工程agent目录下创建xx_agent_case_b.yaml
文件,内容样例如下:
info:
name: 'demo_peer_agent'
description: 'demo peer agent'
plan:
planner:
name: 'peer_planner'
eval_threshold: 60
retry_count: 2
planning: 'demo_planning_agent'
executing: 'demo_executing_agent'
expressing: 'demo_expressing_agent'
reviewing: 'demo_reviewing_agent'
metadata:
type: 'AGENT'
module: 'sample_standard_app.app.core.agent.peer_agent_case.demo_peer_agent'
class: 'DemoPeerAgent'
在xx_agent_case_b.yaml
中,我们定义了一个DemoPeerAgent
的配置。info
部分是agent的基本信息设置,plan
部分包含了agent的行为计划设置(决定了agent的工作模式),metadata
部分包含了agent对象的元数据设置。
其中plan
部分的planner
字段定义了一个peer_planner
的配置,其中planning
、executing
、expressing
和reviewing
字段分别定义了PEER的四个环节的agent配置。您可以继续创建每个环节对应的子agent,每个子agent的配置又可以采用不同的agent pattern模式。
更多的agent pattern开发细节请参考后续的agent pattern章节。
创建一个同名的xx_agent_case_b.py
文件,过程同构建一个简单的agent对象,省略。
试一试agent的效果,您参考使用应用工程的测试类进行测试,如下:
import unittest
from agentuniverse.agent.agent import Agent
from agentuniverse.agent.agent_manager import AgentManager
from agentuniverse.agent.output_object import OutputObject
from agentuniverse.base.agentuniverse import AgentUniverse
class RagAgentTest(unittest.TestCase):
"""
Test cases for the rag agent
"""
def setUp(self) -> None:
AgentUniverse().start(config_path='../../config/config.toml')
def test_rag_agent(self):
"""Test demo rag agent."""
instance: Agent = AgentManager().get_instance_obj('demo_rag_agent')
output_object: OutputObject = instance.run(input='英伟达股票大涨原因是什么?')
print(output_object.get_data('output'))
if __name__ == '__main__':
unittest.main()
在test_rag_agent
方法中,我们通过AgentManager().get_instance_obj
获取了demo_rag_agent
的实例对象,然后通过instance.run
方法执行了agent的逻辑。
通过测试,你可以观察agent的思路与答案是否符合你的预期,并且优化对应的设定、增强工具与知识,不断的重复这个步骤直到效果达到满意。
在工程的service
目录下创建xx_service.yaml
文件,内容样例如下:
name: 'demo_service'
description: 'demo service of demo agent'
agent: 'demo_rag_agent'
metadata:
type: 'SERVICE'
在xx_service.yaml
中,我们定义了一个demo_service
的配置。name
字段定义了服务的名称,description
字段定义了服务的描述,agent
字段定义该服务由哪个agent提供。
使用在IDE中bootstrap
文件夹下的server_application.py
文件启动,
或在终端中输入如下命令完成服务接口的启动与监听:
# under the bootstrap directory of the project
cd `your bootstrap directory path`
python server_application.py
当出现如下命令行说明监听成功,默认监听127.0.0.1地址8000端口,worker数为5,可在config/gunicorn_config.toml
中修改配置。(注意windows系统与直接使用flask启动的目前默认监听8888端口)
你可以在终端通过curl指令或者如postman工具进行服务访问,curl访问指令如下:
curl http://127.0.0.1:8000/service_run -X POST --header "Content-Type: application/json;charset=UTF-8" -d '{"service_id":"demo_service", "params":{"input":"Your input text here"}}'
如果您的服务部署在远程服务器上,您可以通过域名或者IP地址进行访问。
更多的服务化开发细节请参考后续的服务化章节。除了标准的HTTP服务化方式,我们在近期还将扩展gRPC服务化方式,您可以根据自己的需求选择合适的服务化方式。
通过本章您已经掌握了如何使用本框架进行环境与应用工程准备、如何构建一个简单的agent、如何使用模式组件完成多agent协同、如何对agent执行效果进行测试调优、如何对agent进行快速服务化。
本框架的实际能力远比这广泛的多,你可以继续阅读下列部分。 进一步研究框架中的原理及其核心组件; 进一步将框架结合专业的工具、知识与测评方法增强你的agents能力; 进一步运用框架提供端到端方案与产品; 进一步阅读框架在当前在各个产业场景的最佳实践。
让我们共同探索,共同进步!