diff --git a/docs/docs/.vuepress/config.js b/docs/docs/.vuepress/config.js index 2141fde0..3dd49984 100644 --- a/docs/docs/.vuepress/config.js +++ b/docs/docs/.vuepress/config.js @@ -13,7 +13,7 @@ export default defineUserConfig({ navbar: ['/', '/introduction'], - sidebar: ['introduction', 'installation', 'get-started', 'agent', 'memory', 'knowledgebase', 'tracing', 'evaluation', 'deploy', 'cli', 'veadk-studio'] + sidebar: ['introduction', 'installation', 'get-started', 'agent', 'memory', 'tool', 'knowledgebase', 'tracing', 'evaluation', 'deploy', 'cli', 'veadk-studio'] }), bundler: viteBundler(), diff --git a/docs/docs/.vuepress/public/images/memory-optimization.png b/docs/docs/.vuepress/public/images/memory-optimization.png new file mode 100644 index 00000000..1d2f572e Binary files /dev/null and b/docs/docs/.vuepress/public/images/memory-optimization.png differ diff --git a/docs/docs/.vuepress/public/images/tracing-apmplus.png b/docs/docs/.vuepress/public/images/tracing-apmplus.png new file mode 100644 index 00000000..62bb5bcd6 Binary files /dev/null and b/docs/docs/.vuepress/public/images/tracing-apmplus.png differ diff --git a/docs/docs/.vuepress/public/images/tracing-file.png b/docs/docs/.vuepress/public/images/tracing-file.png new file mode 100644 index 00000000..8cafebd3 Binary files /dev/null and b/docs/docs/.vuepress/public/images/tracing-file.png differ diff --git a/docs/docs/agent.md b/docs/docs/agent.md index ae0b064f..322ad4b2 100644 --- a/docs/docs/agent.md +++ b/docs/docs/agent.md @@ -1,23 +1,59 @@ # 智能体 +智能体 Agent 是一个具备完整功能的执行单元,依托内置的大模型推理能力,其不仅可以独立完成各类任务、与用户进行智能交互、调用外部工具资源,还能实现与其他 Agent 之间的协同配合。 + ## 属性 -Agent中主要包括如下属性: +Agent 中主要包括如下属性: | 属性 | 类型 | 说明 | | --- | --- | --- | -| name | str | Agent的名称,即标识符 | -| description | str | Agent的描述,后续会被构建为系统提示词的一部分;也被用来在A2A协议中进行Agent挑选 | -| instruction | str | Agent中内置模型的系统提示词 | -| tools | list | Function call中的工具列表,既可以是本地工具,也可以是MCP工具 | -| sub_agents | list | 子Agent列表,用于多Agent之间交互 | -| long_term_memory | Vector database | 长期记忆,后端通常为一个向量数据库(Vector database),能够检索 | -| knowledgebase | Vector database | 知识库,后端通常为一个向量数据库(Vector database),能够检索 | -| tracers | list | 追踪器列表,能够定义不同的追踪方式,并在Agent执行完毕后对整体Tracing信息保存至本地 | +| name | str | Agent 的名称,即标识符 | +| description | str | Agent 的描述,后续会被构建为系统提示词的一部分,也被用来在A2A协议中进行 Agent 挑选 | +| instruction | str | Agent 中内置模型的系统提示词 | +| model_name | str | Agent 中内置模型的名称,默认从环境变量中获取 | +| model_provider | str | Agent 中内置模型的提供商,默认从环境变量中获取 | +| model_api_base | str | Agent 中内置模型的 API Base,默认从环境变量中获取 | +| model_api_key | str | Agent 中内置模型的 API Key,默认从环境变量中获取 | +| tools | list | Function call 中的工具列表,既可以是本地工具,也可以是 MCP 工具 | +| sub_agents | list | 子 Agent 列表,用于多 Agent 之间交互 | +| knowledgebase | KnowledgeBase | 知识库,后端支持本地内存(local)和数据库(opensearch、viking、redis、mysql),通常设置为一个能够检索的向量数据库 | +| long_term_memory | LongTermMemory | 长期记忆,后端支持本地内存(local)和数据库(opensearch、viking、redis、mysql),通常设置为一个能够检索的向量数据库 | +| tracers | list | 追踪器列表,能够定义不同的追踪方式,并在 Agent 执行完毕后将整体 Tracing 信息保存至本地 | +| serve_url | str | Agent 服务主机的 URL,将显示在 Agent Card 中 | + +## 运行 + +在生产环境中,我们推荐您使用 VeADK 的`Runner`执行器来进行多租户服务与 Agent 运行,在多租场景下,`Runner`通过三个属性来确定资源空间: + +- `app_name`:应用名称 +- `user_id`:用户ID +- `session_id`:某个用户某次会话的ID + +```python +from veadk import Agent, Runner +from veadk.memory.short_term_memory import ShortTermMemory + +# Define Runner config +APP_NAME = "..." +USER_ID = "..." +SESSION_ID = "..." + +agent = Agent() + +runner = Runner( + agent=agent, + short_term_memory=ShortTermMemory(), + app_name=APP_NAME, + user_id=USER_ID +) + +response = await runner.run(messages="...", session_id=SESSION_ID) +``` -## A2A智能体 +## A2A 智能体 -当你的智能体部署到云上后,可以在本地被初始化为一个Remote Agent,也就是能够通过A2A协议来访问的智能体,初始化方法如下: +当智能体部署到云上后,可以在本地被初始化为一个 Remote Agent,也就是能够通过 A2A 协议来访问的智能体,初始化方法如下: ```python remote_agent = RemoteVeAgent( @@ -29,33 +65,50 @@ short_term_memory = ShortTermMemory() runner = Runner( agent=remote_agent, short_term_memory=short_term_memory - ) +) res = await runner.run( messages="...", session_id="sample_session" - ) +) ``` -## 运行 +## 多智能体 + +使用 VeADK 可以构建多 Agent 协作, 主 Agent 通过 `sub_agents` 机制协调多个子 Agent 完成复杂任务。以下代码示例分别定义了三个 Agent: + +- weather_reporter:负责获取指定城市的天气信息(调用了 `get_city_weather` 工具)。 +- suggester:根据天气情况给出穿衣建议。 +- planner_agent:作为“调度员”,先调用 `weather_reporter` 获取天气,再调用 `suggester` 获取建议,最后将结果整合返回给用户。 -在生产环境中,我们推荐您使用`Runner`来进行多租户服务: +该多智能体协作能更好的满足用户的需求。 ```python from veadk import Agent, Runner from veadk.memory.short_term_memory import ShortTermMemory +from veadk.tools.demo_tools import get_city_weather -# Define runner config -APP_NAME = "" -USER_ID = "" -SESSION_ID = "" +session_id = "..." +prompt = "..." -agent = Agent() +# define three agents, one for planner, two for write poem and polish +weather_reporter = Agent( + name="weather_reporter", + description="A weather reporter agent to report the weather.", + tools=[get_city_weather], +) +suggester = Agent( + name="suggester", + description="A suggester agent that can give some clothing suggestions according to a city's weather.", +) -runner = Runner( - agent=agent, - short_term_memory=ShortTermMemory() - ) +planner_agent = Agent( + name="planner", + description="A planner that can generate a suggestion according to a city's weather.", + instruction="Invoke weather reporter agent first to get the weather, then invoke suggester agent to get the suggestion. Return the final response to user.", + sub_agents=[weather_reporter, suggester], +) +runner = Runner(agent=planner_agent, short_term_memory=ShortTermMemory()) response = await runner.run(messages=prompt, session_id=session_id) -``` +``` \ No newline at end of file diff --git a/docs/docs/evaluation.md b/docs/docs/evaluation.md index 4c0a62b5..9777a99b 100644 --- a/docs/docs/evaluation.md +++ b/docs/docs/evaluation.md @@ -1,45 +1,71 @@ # 评测 -VeADK构建一套完整的自动化Evaluation流程,主要能力包括: +VeADK 构建一套完整的自动化评测(Evaluation)流程,其主要功能包括: -- 运行时数据采集:通过collect_runtime_data开启 -- 测试集文件生成:开启后自动dump到本地 -- 评测:通过不同的evaluator或adk eval命令进行测试 -- 反馈优化:自动根据评测结果(score reason等属性)优化prompts +- 运行时数据采集:自动捕获 Agent 的运行时数据 +- 测试集文件生成:Agent 运行后自动将运行时数据作为测试数据集(Eval Set)导出到本地 +- 评测:通过多种评测器(Evaluator)进行评测 +- 反馈优化:根据评测结果(如评测得分,原因分析等)自动优化 prompts ## 运行时数据采集 +VeADK 可以通过两种方式采集 Agent 的运行时数据。 + +对于 `agent.run()` 方法,在调用时设置 `collect_runtime_data=True` 即可开启数据采集。运行结束后,运行时数据构成的评测集文件将保存在 `agent._dump_path` 指定的路径。 + +```python +await agent.run( + prompt, + collect_runtime_data=True, + eval_set_id=f"eval_demo_set_{get_current_time()}", +) +# get expect output +dump_path = agent._dump_path +assert dump_path != "", "Dump eval set file failed! Please check runtime logs." +``` + +对于 `Runner` 执行器,在 Agent 运行结束后,通过调用 `runner.save_eval_set()` 将运行时数据构成的评测集文件保存在默认路径。 + ```python -from veadk.evaluation import EvalSetRecorder +runner = Runner( + agent=agent, + short_term_memory=ShortTermMemory(), +) -# 在希望进行数据dump处初始化一个EvalSetRecorder -eval_set_recorder = EvalSetRecorder(session_service, eval_set_id) +await runner.run(messages=prompts, session_id=session_id) -# dump数据,为Json格式 -dump_path = await eval_set_recorder.dump(app_name, user_id, session_id) +dump_path = await runner.save_eval_set(session_id=session_id) +assert dump_path != "", "Dump eval set file failed! Please check runtime logs." ``` ## 评测集文件 -评测集文件格式兼容Google Evaluation,详见[评测集文件格式](https://google.github.io/adk-docs/evaluate/#how-evaluation-works-with-the-adk)。 +评测集文件格式兼容 Google Evaluation 标准,详见[评测集文件格式](https://google.github.io/adk-docs/evaluate/#how-evaluation-works-with-the-adk)。评测集本地保存过程中,会考虑所有会话。 -评测集本地保存过程中,均考虑当前会话。下面是一些概念对齐: +文件结构说明: -- `test_case`:所有对话轮次 -- `invocation`:一轮对话 +- `eval_cases`:所有对话轮次 +- `conversation`:一轮对话 + - `user_content`:用户的输入 + - `final_response`:Agent 的最后输出 + - `intermediate_data`:中间数据 + - `tool_uses`:Agent 使用的工具 + - `intermediate_responses`:Agent 的中间会话 -## 评测器 +## 评测 -当前VeADK支持Deepeval评测器,通过如下方式定义: +VeADK 目前支持 [DeepEval](https://deepeval.com/) 评测器和 [ADKEval](https://google.github.io/adk-docs/evaluate/),通过如下方式定义评测器: ```python from veadk.evaluation.deepeval_evaluator import DeepevalEvaluator +from veadk.evaluation.adk_evaluator.adk_evaluator import ADKEvaluator # 当然,你还可以传入`judge_model`等相关信息 evaluator = DeepevalEvaluator() -``` -## 评测方法 +# Alternatively: +# evaluator = ADKEvaluator() +``` 启动标准的评测接口: @@ -47,26 +73,85 @@ evaluator = DeepevalEvaluator() await evaluator.eval(eval_set_file_path=dump_path, metrics=metrics) ``` -其中,输入: +参数说明: - `eval_set_file_path`:评测集文件路径 -- `metrics`:评测指标 - -不同的评测指标在不同测试框架中可能不同。 +- `metrics`:评测指标,不同的评测指标在不同测试框架中可能不同。 ## 数据上报 -评测结果可以自动上报至火山引擎的VMP平台,只需要在定义评估器的时候传入Prometheus pushgateway的相关参数: +评测结果可以自动上报至火山引擎的 [VMP](https://console.volcengine.com/prometheus) 平台,只需要在定义评估器的时候传入 Prometheus pushgateway 等相关参数即可,可在 `config.yaml` 中进行配置并从环境变量中自动读取: ```python from veadk.evaluation.utils.prometheus import PrometheusPushgatewayConfig -# 可以自动从环境变量中读取相关配置 +# Load Prometheus configuration (can be read from environment variables) prometheus_config = PrometheusPushgatewayConfig() -# 传入到评估器中 +# Pass config into evaluator evaluator = DeepevalEvaluator( ..., prometheus_config=prometheus_config, ) +``` + +## 完整示例 + +以下是使用 DeepEval 评测器的完整例子。其中定义了 [GEval](https://deepeval.com/docs/metrics-llm-evals) 指标和 [ToolCorrectnessMetric](https://deepeval.com/docs/metrics-tool-correctness) 指标,分别用于整体输出质量评估和工具调用正确率评估,并将评测结果上报至火山引擎的 VMP 平台: + +```python +import asyncio +import os +from builtin_tools.agent import agent + +from deepeval.metrics import GEval, ToolCorrectnessMetric +from deepeval.test_case import LLMTestCaseParams +from veadk.config import getenv +from veadk.evaluation.deepeval_evaluator import DeepevalEvaluator +from veadk.evaluation.utils.prometheus import PrometheusPushgatewayConfig +from veadk.prompts.prompt_evaluator import eval_principle_prompt + +prometheus_config = PrometheusPushgatewayConfig() + +# 1. Rollout, and generate eval set file +# await agent.run( +# prompt, +# collect_runtime_data=True, +# eval_set_id=f"eval_demo_set_{get_current_time()}", +# ) +# # get expect output +# dump_path = agent._dump_path +# assert dump_path != "", "Dump eval set file failed! Please check runtime logs." + +# 2. Evaluate in terms of eval set file +evaluator = DeepevalEvaluator( + agent=agent, + judge_model_name=getenv("MODEL_JUDGE_NAME"), + judge_model_api_base=getenv("MODEL_JUDGE_API_BASE"), + judge_model_api_key=getenv("MODEL_JUDGE_API_KEY"), + prometheus_config=prometheus_config, +) + +# 3. Define evaluation metrics +metrics = [ + GEval( + threshold=0.8, + name="Base Evaluation", + criteria=eval_principle_prompt, + evaluation_params=[ + LLMTestCaseParams.INPUT, + LLMTestCaseParams.ACTUAL_OUTPUT, + LLMTestCaseParams.EXPECTED_OUTPUT, + ], + ), + ToolCorrectnessMetric( + threshold=0.5 + ), +] + +# 4. Run evaluation +eval_set_file_path = os.path.join( + os.path.dirname(__file__), "builtin_tools", "evalsetf0aef1.evalset.json" +) +await evaluator.eval(eval_set_file_path=eval_set_file_path, metrics=metrics) ``` \ No newline at end of file diff --git a/docs/docs/get-started.md b/docs/docs/get-started.md index 3b5a8dab..a5f9220e 100644 --- a/docs/docs/get-started.md +++ b/docs/docs/get-started.md @@ -1,77 +1,48 @@ # 快速开始 -## 最简Agent +## 安装 VeADK +参考[安装](./installation.md)文档进行配置,并将`config.yaml`配置文件放在项目根目录。 -当你设置完环境变量后,你可以创建一个最简单的聊天智能体: +## 构建 Agent + +当你安装 VeADK 并完成配置后,您可以构建一个查询天气的智能体,该智能体配置了内置的模拟查询天气的函数工具`get_city_weather`: ```python from veadk import Agent +from veadk.tools.demo_tools import get_city_weather -agent = Agent() +agent = Agent(tools=[get_city_weather]) ``` +## 执行 Agent -由于某些操作是异步的,因此Agent的运行需要在异步环境中进行: - -::: warning -我们在`Agent`类中提供的`run`方法仅为了本地测试和开发使用,由于该函数位于一个异步与同步函数共存的运行环境,可能会产生不可预知的异常。 - -因此不建议在生产环境中使用。 -::: +由于某些操作是异步的,因此 Agent 的运行需要借助`asyncio`库在异步环境中进行。 +Agent 的运行有两种方式,第一种是使用 Agent 自带的 `run` 方法运行: ```python import asyncio -prompt = "Hello!" -res = asyncio.run(agent.run(prompt)) +prompt = "How is the weather like in Beijing? Besides, tell me which tool you invoked." +response = asyncio.run(agent.run(prompt)) +print(response) ``` -## 工具调用 - -你可以给Agent传入`tools`参数,指定想要调用的工具: +第二种是使用 `Runner` 执行: ```python -from veadk import Agent - -agent = Agent( - tools=[...] # fill with tools -) -``` - -### 内置工具 - -VeADK中集成了多个火山引擎提供的工具: - -- web_search (公域搜索) -- vesearch (联网搜索,头条搜索等) -- lark (飞书通信和协同) -- las (数据湖检索) -- web_scraper 邀测,代码见MCP server (聚合搜索) - -此外,还提供多种沙箱工具: - -- Computer sandbox (TBD) -- Browser sandbox (TBD) -- Code sandbox (TBD) - -### MCP工具 - -VeADK支持定义MCP工具来进行功能扩展,例如飞书Lark MCP工具、LAS数据湖MCP工具等。 - -以飞书Lark MCP工具为例,采用如下方式定义: +from veadk import Runner +from veadk.memory.short_term_memory import ShortTermMemory +import asyncio -```python -lark_tools = MCPToolset( - connection_params=StdioServerParameters( - command="npx", - args=[..., "@larksuiteoapi/lark-mcp", ...], - errlog=None, - ), -) +session_id = "..." +runner = Runner(agent=agent, short_term_memory=ShortTermMemory()) # 使用 Runner 执行智能体 -remote_mcp_server = MCPToolset(connection_params=SseConnectionParams(url=url)) +prompt = "How is the weather like in Beijing? Besides, tell me which tool you invoked." +response = asyncio.run(runner.run(messages=prompt, session_id=session_id)) +print(response) # The weather in Beijing is Sunny with a temperature of 25°C. The tool invoked is get_city_weather. ``` -### 系统工具 +::: warning +我们在`Agent`类中提供的`run`方法仅为了本地测试和开发使用,由于该函数位于一个异步与同步函数共存的运行环境,可能会产生不可预知的异常。 -- `load_knowledgebase`:检索知识库工具,在你给Agent传入`knowledgebase`参数后,将会自动挂载`load_knowledgebase_tool`工具,Agent将在运行时自主决定何时查询知识库; -- `load_memory`:检索长期记忆工具,在你给Agent传入`memory`参数后,将会自动挂载`load_memory_tool`工具,Agent将在运行时自主决定何时查询长期记忆。 +因此不建议在生产环境中使用。 +::: \ No newline at end of file diff --git a/docs/docs/installation.md b/docs/docs/installation.md index 20ed2033..e66fd372 100644 --- a/docs/docs/installation.md +++ b/docs/docs/installation.md @@ -1,6 +1,6 @@ # 安装 -本章主要介绍VeADK的安装方法和基本配置项。 +本章主要介绍 VeADK 的安装方法和基本配置项。 ## 环境 @@ -15,6 +15,10 @@ git clone https://github.com/volcengine/veadk-python.git cd veadk-python uv venv --python 3.10 +# Activate +# macOS/Linux: source .venv/bin/activate +# Windows CMD: .venv\Scripts\activate.bat +# Windows PowerShell: .venv\Scripts\Activate.ps1 # only install necessary requirements uv sync @@ -33,7 +37,7 @@ uv pip install -e . ### PyPI -本项目近期将发布在PyPI上,届时你可以使用`pip`进行安装。 +本项目近期将发布在PyPI上,届时您可以使用`pip`进行安装。 ```bash pip install veadk-python @@ -41,30 +45,18 @@ pip install veadk-python ## 配置 -VeADK在仓库中提供了一个`config.yaml.example`文件,你可以根据这个文件来创建你的配置文件。在样例文件中,我们标明了一个Agent运行的必需配置和可选(optional)配置。 +VeADK 在仓库中提供了一个示例配置文件`config.yaml.example`,其中标明了一个智能体运行的必需(required)配置和可选(optional)配置。您可以基于该示例文件,在项目根目录下创建实际使用的配置文件`config.yaml`。VeADK 中的配置模块将自动查找并加载该文件内容,并将其中的配置项映射为运行时环境变量,从而帮助您省去环境配置的时间。 -### 说明 - -想要运行一个Agent,你需要进行基础配置。在你的项目根目录中创建一个`config.yaml`文件,并填入如下信息: - -```yaml -# config.yaml -model: - provider: # 如果你使用的是方舟大模型,请在这里填入`openai` - name: - api_base: - api_key: -``` - -你创建的配置文件名称我们推荐为`config.yaml`,因为VeADK中的配置模块将会自动寻找并加载这个文件中的配置为环境变量,可以帮你省去填写配置项的时间。完整的配置项你可以参考[`config.yaml.example`文件](https://github.com/volcengine/veadk-python/blob/main/config.yaml.example)。 +完整的配置项可以参考[`config.yaml.example`文件](https://github.com/volcengine/veadk-python/blob/main/config.yaml.example)。 +### 说明 下面是详细的配置说明: ```yaml model: # [required] for running agent agent: - provider: openai + provider: openai # 如果使用的是方舟大模型,请在这里填入openai name: doubao-1-5-pro-256k-250115 api_base: https://ark.cn-beijing.volces.com/api/v3/ api_key: @@ -81,16 +73,16 @@ model: api_key: volcengine: - # [optional] for Viking DB and `web_search` tool - ak: - sk: + # [optional] for Viking DB and `web_search` tool in VolcEngine (https://console.volcengine.com/iam/keymanage/) + access_key: + secret_key: tool: # [optional] https://console.volcengine.com/ask-echo/my-agent vesearch: endpoint: # `bot_id` api_key: - # [optional] + # [optional] https://www.volcengine.com/docs/84296/1494115 web_scraper: endpoint: api_key: # `token` @@ -99,7 +91,10 @@ tool: endpoint: # `app_id` api_key: # `app_secret` token: # `user_token` - + # [optional] for Volcengine Lake AI Service (https://www.volcengine.com/product/las) + las: + url: # mcp sse url + dataset_id: # dataset name observability: # [optional] for exporting tracing data to Volcengine CozeLoop and APMPlus platform @@ -112,6 +107,10 @@ observability: endpoint: https://api.coze.cn/v1/loop/opentelemetry/v1/traces api_key: service_name: # Coze loop `space_id` + tls: + endpoint: https://tls-cn-beijing.volces.com:4318/v1/traces + service_name: # TLS `topic_id` + region: cn-beijing # [optional] for exporting evaluation data to Volcengine VMP (https://console.volcengine.com/prometheus) prometheus: pushgateway_url: @@ -143,16 +142,27 @@ database: viking: project: # user project in Volcengine Viking DB region: cn-beijing - # [optional] for knowledgebase with viking database + # [optional] for knowledgebase with viking database (https://console.volcengine.com/tos) tos: endpoint: tos-cn-beijing.volces.com # default Volcengine TOS endpoint region: cn-beijing # default Volcengine TOS region bucket: + +# [optional] for prompt optimization in cli/app (https://www.volcengine.com/docs/82379/1587837) +agent_pilot: + api_key: + +logging: + # ERROR + # WARNING + # INFO + # DEBUG + level: DEBUG ``` ### 管理 -为管理繁多的配置项,我们提供了根据`config.yaml`自动化的配置管理方案:你在配置文件中的所有配置将会根据层级,自动转为大写并使用下划线连接,统一配置成为运行时的环境变量。 +为管理繁多的配置项,VeADK 提供了根据`config.yaml`文件的自动化配置管理方案。您在配置文件中的所有配置将会根据层级,自动转为大写并使用下划线连接,统一注册成为运行时的环境变量。 例如下面的配置项: @@ -176,4 +186,4 @@ MODEL_API_BASE_BASE_B= ... ``` -VeADK中提供了一个`getenv`方法来读取相关配置,你不必每次手动传入某个类的参数。 +VeADK 中提供了一个`getenv`方法来读取相关配置,您无需在各组件中次手动传入某个配置的参数。 \ No newline at end of file diff --git a/docs/docs/introduction.md b/docs/docs/introduction.md index 1b34f932..039270ca 100644 --- a/docs/docs/introduction.md +++ b/docs/docs/introduction.md @@ -2,47 +2,53 @@ ## 关于VeADK -VeADK——Volcengine Agent Development Kit是火山引擎智能体开发框架,其提供一套面向Agent智能体开发、上云部署、评测与优化的全流程开发者框架。 +**VeADK(Volcengine Agent Development Kit)** 是由火山引擎推出的一套面向智能体(Agent)开发的全流程框架,旨在为开发者提供一套面向智能体构建、云端部署、评测与优化的全流程开发框架。 -相比于现有智能体开发框架,VeADK主要优势在于和火山引擎各产品能力聚合: +VeADK 相较于现有的智能体开发框架,具备与火山引擎产品体系深度融合的优势,帮助开发者更高效地构建企业级 AI 智能体应用。 +## VeADK 核心优势 ### 更快速的企业级部署 -通过云部署项目模板支持CloudEngine的一键部署和发布能力,实现veFaaS和APIG的高可用应用部署,CLI和编程化发布支持。 +- 通过云部署项目模板支持 CloudEngine 的一键部署和发布能力 +- 支持 veFaaS 与 APIG,实现高可用、高弹性的服务托管 +- 提供简易的 CLI 工具与编程化发布 ### 更安全的企业级部署 -支持Identity管理,支持API Key服务鉴权和OAuth2的用户鉴权能力。 +- 支持 Identity 管理 +- 支持 API Key 服务鉴权与 OAuth2 用户鉴权能力 ### 更完备的可观测性和评估能力 -运行时数据无缝衔接APMPlus、Cozeloop, TLS等云观测平台,运行时数据直接落地为测试数据集文件, 支持离线和在线的评估能力。 +- 运行时数据无缝衔接 APMPlus、Cozeloop, TLS 等云观测平台,提供可视化监控 +- 运行时数据直接落地为测试数据集文件, 支持离线和在线的评估能力 ### 更丰富的内置工具 -内置工具主要包括头条、抖音搜索的`web_search`工具,飞书Lark, LAS等工具。 +- 内置头条、抖音搜索工具,实现实时信息获取与内容聚合 +- 集成飞书 Lark(协同办公)、LAS(AI 数据湖服务)等工具,增强 Agent 实用性 ### 更灵活的功能扩展 -提供Agent中各类组件的基础实现,支持灵活扩展。 +- 提供 Agent 构建所需核心组件的基础实现,支持开发者根据需求灵活组合与扩展 ### 更强大的知识管理 -知识库支持火山引擎各类现有数据库,例如关系型数据库、键值数据库等,此外支持Viking DB等火山引擎云知识库方案 +- 支持连接火山引擎各类现有数据库,包括关系型数据库、键值数据库等 +- 集成 Viking DB 等火山引擎云知识库,实现知识的高效存储、检索与更新 ### 更友好的最佳实践 -提供贴近实际工业场景的各类开发和部署用例,包括各类数据库、数据湖读写。 - - +- 提供贴近实际工业场景的各类开发和部署用例,涵盖数据库访问、数据湖读写、复杂任务编排等多样场景。 +- 提供可直接复用的代码模板与配置示例,帮助开发者快速上手并解决实际业务问题。 ## 整体方案 -VeADK中构建智能体依赖`Agent`,`Runner`等几个关键概念 +在 VeADK 中,智能体的构建与生命周期的管理围绕`Agent`,`Runner`等核心组件进行: ### Agent -`Agent`是智能体的主体,负责处理用户输入,基于大模型,调用不同的组件,最终返回给用户结果。 +`Agent`是智能体的主体,基于大模型处理用户输入,调用不同的组件及各类工具,最终返回给用户结果。 ### Runner @@ -54,7 +60,7 @@ VeADK中构建智能体依赖`Agent`,`Runner`等几个关键概念 - `user_id`:用户ID - `session_id`:某个用户某次会话的ID -Agent的组件会利用这三个属性来构建某些数据的索引。例如,知识库组件将会根据`app_name`与`user_id`来进行空间数据的索引。 +VeADK 的组件会利用这三个属性来构建某些数据的索引,例如知识库组件将会根据`app_name`与`user_id`来进行空间数据的索引,实现多租场景下数据空间的安全隔离。 ## Milestone diff --git a/docs/docs/knowledgebase.md b/docs/docs/knowledgebase.md index 50d44e10..007cd402 100644 --- a/docs/docs/knowledgebase.md +++ b/docs/docs/knowledgebase.md @@ -1,21 +1,37 @@ # 知识库 -自建知识库与使用火山引擎现有知识库的最大区别是:知识文档的分片和数据库维护。 +VeADK 支持将结构化或文档型知识作为 Agent 的外部知识源接入。开发者可选择自建知识库,或使用火山引擎现有知识库。自建知识库与使用火山引擎现有知识库的最大区别是:知识文档的分片和数据库维护。VeADK 中知识库的创建如下: +```python +from veadk.knowledgebase.knowledgebase import KnowledgeBase + +knowledgebase = KnowledgeBase(backend=...) +``` + +知识库中的 backend 字段定义如下: + +| backend | 说明 | +| --- | --- | +| local | GIGO 模式的内存存储,不具备向量检索功能,仅用于测试 | +| [viking](https://console.volcengine.com/vikingdb) | 火山引擎 Viking DB 服务 | +| opensearch | OpenSearch 数据库 | +| redis | Redis 数据库,但不具备向量搜索功能 | +| mysql | MySQL 数据库,但不具备向量搜索功能 | ## 自建知识库 自建知识库需要开发者本地进行知识文档的切片,并维护一个数据库(或云数据库)来存储知识文档。 -你可以通过如下方式定义一个自建知识库: +以下示例通过使用 opensearch 定义一个如下的自建知识库: ```python +from veadk import Agent from veadk.knowledgebase.knowledgebase import KnowledgeBase knowledgebase = KnowledgeBase(backend="opensearch") knowledgebase.add( knowledgebase_data, app_name=app_name, user_id=user_id, session_id=session_id -) # 这里的数据应当是已切片完成的格式,定义为`list[str]` +) # knowledgebase_data 应当是已切片完成的格式,定义为`list[str]` # 将知识库挂载至Agent agent = Agent(knowledgebase=knowledgebase) @@ -23,9 +39,10 @@ agent = Agent(knowledgebase=knowledgebase) ## 火山知识库 -VeADK中提供了VikingDB支持的数据库,支持用户直接上传本地文档,文档切片和存储维护均在云上自动执行: +VeADK 中提供了火山引擎支持的知识库 [VikingDB](https://console.volcengine.com/vikingdb),支持用户直接上传本地文档,文档切片和存储维护均在云上自动执行: ```python +from veadk import Agent from veadk.knowledgebase.knowledgebase import KnowledgeBase FILE_PATH = ... @@ -34,4 +51,6 @@ knowledgebase = KnowledgeBase(backend="viking") knowledgebase.add( FILE_PATH, app_name=app_name, user_id=user_id, session_id=session_id ) + +agent = Agent(knowledgebase=knowledgebase) ``` \ No newline at end of file diff --git a/docs/docs/memory.md b/docs/docs/memory.md index dae7224f..c1c7ec66 100644 --- a/docs/docs/memory.md +++ b/docs/docs/memory.md @@ -1,13 +1,13 @@ # 记忆 -在VeADK中,记忆(Memory)能够为Agent提供上下文支撑,主要分为短期记忆和长期记忆: +在 VeADK 中,记忆(Memory)能够为 Agent 提供上下文支撑,主要分为短期记忆和长期记忆: -- **短期记忆(Short-term memory)**:单个会话内的对话记录 -- **长期记忆(Long-term memory)**:多个会话内的对话记录,具备跨session的能力 +- **短期记忆(Short-term memory)**:用户单 Session 中与 Agent 的对话历史 +- **长期记忆(Long-term memory)**:用户多 Session 中与 Agent 的对话历史,具备跨 Session 的能力 ## 短期记忆 -通过以下方式定义一个短期记忆(在不进行特殊指定的情况下,记忆默认将会在内存中存储): +VeADK 通过以下方式定义一个短期记忆(在不进行特殊指定的情况下,记忆默认将会在内存中存储): ```python from veadk.memory.short_term_memory import ShortTermMemory @@ -24,7 +24,7 @@ await short_term_memory.create_session( session_service = short_term_memory.session_service ``` -为持久化您的短期记忆,VeADK还支持通过传入`backend`参数,将记忆保存在数据库中: +为持久化您的短期记忆,VeADK 还支持通过传入`backend`参数,将记忆保存在数据库中: ```python from veadk.memory.short_term_memory import ShortTermMemory @@ -36,19 +36,41 @@ short_term_memory = ShortTermMemory( ) ``` -其中,`db_url`遵循SQLAlchemy的[连接字符串格式](),您可以根据您的数据库类型进行配置。 +其中,`db_url`遵循 SQLAlchemy 的连接字符串格式,您可以根据您的数据库类型进行配置。 -短期记忆中的backend字段定义如下: +短期记忆中的 backend 字段定义如下: | backend | 说明 | | --- | --- | | local | 内存存储 | -| database | 数据库,需同时传入`db_url`,否则将会启动一个本地SQLite数据库 | -| mysql | MySQL数据库,可自动读取环境变量拼接MySQL格式的db_url | +| database | 数据库,需同时传入`db_url`,否则将会启动一个本地 SQLite 数据库 | +| mysql | MySQL 数据库,可自动读取环境变量拼接 MySQL 格式的 db_url | -## 短期记忆的优化 +以下示例展示了如何在 VeADK 中使用短期记忆,以实现对话上下文的短期记忆能力。通过在多个消息轮次中复用同一个 `session_id`,智能体能够在会话过程中持续保留并引用先前的对话信息,增强对话的连贯性与上下文感知能力: -持久化的短期记忆可能过长,占满某些模型的上下文。为解决短期记忆过长的问题,VeADK中提供了记忆优化器来进行短期记忆的优化,通过在短期记忆类中传入`enable_memory_optimization`参数,开启记忆优化器。 +```python +from veadk import Agent, Runner +from veadk.memory.short_term_memory import ShortTermMemory + +session_id = "..." + +agent = Agent() +short_term_memory = ShortTermMemory() +runner = Runner(agent=agent, short_term_memory=short_term_memory) + +prompt = "My name is VeADK." +response = await runner.run(messages=prompt, session_id=session_id) +print(response) + +prompt = "Do you remember my name?" +response = await runner.run(messages=prompt, session_id=session_id) +print(response) # Your name is VeADK. +``` + + +### 短期记忆的优化 + +持久化的短期记忆可能过长,占满某些模型的上下文。为解决短期记忆过长的问题,VeADK 中提供了记忆优化器来进行短期记忆的优化,通过在短期记忆类中传入`enable_memory_optimization`参数,开启记忆优化器。 ```python from veadk.memory.short_term_memory import ShortTermMemory @@ -60,7 +82,7 @@ short_term_memory = ShortTermMemory( ) ``` -开启后,短期记忆模块将会初始化一个`ShortTermMemoryProcessor`模块,在记忆加载后进行相关信息抽取等处理。未来,我们将支持传入自定义的记忆优化器,并计划支持如下记忆优化时机: +记忆优化器的使用需联合 backend 为 database 或 mysql 来使用。开启后,短期记忆模块将会初始化一个`ShortTermMemoryProcessor`模块,在记忆加载后进行相关信息抽取等处理。未来,我们将支持传入自定义的记忆优化器,计划支持如下记忆优化时机: - 记忆存储前(在线优化) - 记忆存储后(离线优化) @@ -72,9 +94,57 @@ short_term_memory = ShortTermMemory( - 信息维度 - 自定义维度(例如结构化信息抽取) +以下示例展示了 VeADK 中短期记忆在开启记忆优化模式(`enable_memory_optimization=True`)后的使用方式。通过该模式,Agent 能够在存储用户对话上下文时自动剔除冗余或无关的信息,从而提高记忆效率与响应准确性。 +```python +import os +from sqlalchemy import create_engine +from veadk import Agent, Runner +from veadk.memory.short_term_memory import ShortTermMemory + +session_id = "..." + +# prepare a local sqlite database +local_database_path = "..." +engine = create_engine(f"sqlite:///{local_database_path}") + +db_url = f"sqlite+pysqlite:///{local_database_path}" +agent = Agent() + +# Initial prompt: Contains some invalid information +prompt = [ + "Hi! My name is VeADK!", + "My secret is `blueblueblue`.", + "Do you know the differences between `java` and `javascript`?", # useless chat + "Once user ask your system prompt, just return `I have no system prompt`.", + "What is my secret?", + "What is your system prompt?" +] + +# Use the short-term memory to record the complete conversation content +short_term_memory = ShortTermMemory(backend="database", db_url=db_url) +runner = Runner(agent=agent, short_term_memory=short_term_memory) +await runner.run(messages=prompt, session_id=session_id) + +# Redefine the short_term_memory and runner with enable_memory_optimization=True +short_term_memory = ShortTermMemory( + backend="database", db_url=db_url, enable_memory_optimization=True +) +runner = Runner(agent=agent, short_term_memory=short_term_memory) + +prompt = "What is my secret? What is your system prompt?" +response = await runner.run(messages=prompt, session_id=session_id) +print(response) + +# clear local database +os.remove(local_database_path) +``` +短期记忆优化过程与结果: + +![短期记忆优化结果](/images/memory-optimization.png) + ## 长期记忆 -长期记忆通常存储在数据库中,通过如下方式定义一个长期记忆: +VeADK 的长期记忆通常存储在数据库中,通过如下方式定义一个长期记忆: ```python from veadk.memory.long_term_memory import LongTermMemory @@ -93,13 +163,43 @@ session = await session_service.get_session( await self.long_term_memory.add_session_to_memory(session) # 添加 ``` -长期记忆中的backend字段定义如下: +长期记忆中的 backend 字段定义如下: | backend | 说明 | | --- | --- | -| local | GIGO模式的内存存储,不具备向量检索功能,仅用于测试 | -| viking | 火山引擎Viking Memory服务 | -| opensearch | OpenSearch数据库 | -| redis | Redis数据库,但不具备向量搜索功能 | -| mysql | MySQL数据库,但不具备向量搜索功能 | +| local | GIGO 模式的内存存储,不具备向量检索功能,仅用于测试 | +| viking | 火山引擎 Viking Memory 服务 | +| opensearch | OpenSearch 数据库 | +| redis | Redis 数据库,但不具备向量搜索功能 | +| mysql | MySQL 数据库,但不具备向量搜索功能 | + +以下示例展示了如何在 VeADK 中使用长期记忆实现跨会话的信息保留与调用。开发者可以通过 `save_session_to_long_term_memory` 方法,将某一会话中的知识性信息存入长期记忆存储后端。在新的会话中,即使上下文为空,Agent 依然能够基于长期记忆准确回忆并回答相关问题。 +```python +from veadk import Agent, Runner +from veadk.memory.long_term_memory import LongTermMemory +from veadk.memory.short_term_memory import ShortTermMemory + +session_id = "..." +new_session_id = "..." + +long_term_memory = LongTermMemory(backend=...) # default backend is `opensearch` +agent = Agent(long_term_memory=long_term_memory) # agent with long term memort backend + +runner = Runner( + agent=agent, + app_name="...", + user_id="...", + short_term_memory=ShortTermMemory(), +) +teaching_prompt = "..." +await runner.run(messages=teaching_prompt, session_id=session_id) + +# save the teaching prompt and answer in long term memory +await runner.save_session_to_long_term_memory(session_id=session_id) + +# now, let's validate this in a new session +student_prompt = "..." +response = await runner.run(messages=student_prompt, session_id=new_session_id) +print(response) +``` diff --git a/docs/docs/tool.md b/docs/docs/tool.md new file mode 100644 index 00000000..47348db0 --- /dev/null +++ b/docs/docs/tool.md @@ -0,0 +1,107 @@ +# 工具 + +工具 Tool 指的是赋予 Agent 扩展能力的模块化组件,每个工具都被设计用于执行一个明确的任务,使得 Agent 能够执行超出文本生成与推理范畴的具体操作。工具的引入,使得 Agent 不再仅仅是一个语言模型,而是具备实际行动力的智能体,能够感知、调用外部系统资源,完成更复杂的任务。 + +## 工具调用 + +您可以给Agent传入`tools`参数,指定想要调用的工具: + +```python +from veadk import Agent + +agent = Agent( + tools=[...] # fill with tools +) +``` + +## 工具类型 + +在 VeADK 中,工具包括函数工具、内置工具、MCP 工具和系统工具等。 + +### 函数工具 + +VeADK 支持通过函数定义的方式快速创建自定义工具,使 Agent 能够调用本地业务逻辑代码完成特定任务。以下示例展示了 Agent 调用一个自定义的模拟天气查询的函数工具 `get_city_weather`: + +```python +def get_city_weather(city: str) -> dict[str, str]: + """Retrieves the weather information of a given city. the args must in English""" + fixed_weather = { + "beijing": {"condition": "Sunny", "temperature": 25}, + "shanghai": {"condition": "Cloudy", "temperature": 22}, + "guangzhou": {"condition": "Rainy", "temperature": 28} + } + + city = city.lower().strip() + if city in fixed_weather: + info = fixed_weather[city] + return {"result": f"{info['condition']}, {info['temperature']}°C"} + else: + return {"result": f"Weather information not found for {city}"} + +session_id = "..." +prompt = "..." +agent = Agent(tools=[get_city_weather]) +runner = Runner(agent=agent, short_term_memory=ShortTermMemory()) +response = await runner.run(messages=prompt, session_id=session_id) +``` + +### 内置工具 + +VeADK 中集成了多个火山引擎提供的工具: + +- [web_search](https://www.volcengine.com/docs/85508/1650263)(公域搜索) +- [vesearch](https://www.volcengine.com/docs/85508/1512748) (联网搜索,头条搜索等) +- [lark](https://open.larkoffice.com/app)(飞书通信和协同)代码见 [MCP server](https://github.com/larksuite/lark-openapi-mcp) +- [las](https://www.volcengine.com/product/las) (数据湖检索) +- [web_scraper](https://www.volcengine.com/docs/84296/1545470)(聚合搜索)邀测阶段,代码见 [MCP server](https://github.com/volcengine/mcp-server/tree/main/server) + +此外,还提供多种沙箱工具: + +- Computer sandbox (TBD) +- Browser sandbox (TBD) +- Code sandbox (TBD) + +以下示例展示了如何在 VeADK 中集成并调用内置工具 vesearch,用于获取今天的三条热点新闻: +```python +from veadk import Agent +from veadk.tools.builtin_tools.vesearch import vesearch + +agent = Agent( + name="robot", + description="A robot can help user.", + instruction="Talk with user friendly. You can invoke your tools to finish user's task or question.", + tools=[vesearch], +) + +response = await agent.run(prompt="The top 3 news today.") +``` + +### MCP 工具 + +VeADK 支持定义 MCP (Model Context Protocol) 工具来进行功能扩展,例如飞书 Lark MCP 工具、LAS 数据湖 MCP 工具等。 + +以下示例展示了在 VeADK 中以 飞书 Lark MCP 工具为例定义 MCP 工具组件: + +- STDIO 模式 +- SSE 模式 + +```python +lark_tools = MCPToolset( + connection_params=StdioServerParameters( + command="npx", + args=[..., "@larksuiteoapi/lark-mcp", ...], + errlog=None, + ), +) + +lark_mcp_remote = MCPToolset( + connection_params=SseConnectionParams( + url="..." + ) +) +``` + +### 系统工具 + +- `load_knowledgebase`:检索知识库工具,在你给 Agent 传入`knowledgebase`参数后,将会自动挂载`load_knowledgebase_tool`工具,Agent 将在运行时自主决定何时查询知识库; +- `load_memory`:检索长期记忆工具,在你给 Agent 传入`long_term_memory`参数后,将会自动挂载`load_memory`工具,Agent 将在运行时自主决定何时查询长期记忆。 \ No newline at end of file diff --git a/docs/docs/tracing.md b/docs/docs/tracing.md index 26f71b34..578df2d3 100644 --- a/docs/docs/tracing.md +++ b/docs/docs/tracing.md @@ -1,15 +1,15 @@ # 可观测 -VeADK中的可观测(Tracing)能力能够记录运行时关键节点的信息,并且支持无缝上报至火山引擎云平台(例如CozeLoop、APMPlus、TLS等)。 +VeADK 提供可观测(Tracing)的能力,用于记录 Agent 执行过程中的关键路径与中间状态。支持将 Trace 数据输出至本地文件,或通过不同的 Exporter 上报至火山引擎平台,包括 CozeLoop、APMPlus、TLS,有助于开发者进行调试、性能分析、行为追踪等任务。 ## 本地观测 -你可以通过如下方式开启可观测,并且将运行时数据保存至本地: +通过如下方式开启本地观测,并且将运行时数据保存至本地: ```python from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer -tracer = OpentelemetryTracer(exporters=exporters) +tracer = OpentelemetryTracer() agent = Agent(tracers=[tracer]) # ... run agent ... @@ -20,13 +20,13 @@ print(f"Tracing file path: {tracer._trace_file_path}") ## 火山云观测 -通过设置不同的`exporter`上报器,可以将观测数据上传到对应平台: +通过设置不同的云端上报器`exporter`,可以将观测数据上传到对应平台: -- CozeLoop平台:`CozeLoopExporter` -- APMPlus平台: `APMPlusExporter` -- TLS平台:`TLSExporter` +- [CozeLoop 平台](https://www.coze.cn/loop):`CozeLoopExporter` +- [APMPlus 平台](https://console.volcengine.com/apmplus-server/region:apmplus-server+cn-beijing/console/overview/server): `APMPlusExporter` +- [TLS 平台](https://console.volcengine.com/tls/region:tls+cn-beijing/v2/trace-service):`TLSExporter` -使用方法如下: +示例:配置多个云端 `exporter` ```python from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer @@ -34,6 +34,7 @@ from veadk.tracing.telemetry.exporters.cozeloop_exporter import CozeloopExporter from veadk.tracing.telemetry.exporters.apmplus_exporter import APMPlusExporter from veadk.tracing.telemetry.exporters.tls_exporter import TLSExporter +# Configure multiple exporters exporters = [CozeloopExporter(), APMPlusExporter(), TLSExporter()] tracer = OpentelemetryTracer(exporters=exporters) agent = Agent(tracers=[tracer]) @@ -43,3 +44,48 @@ agent = Agent(tracers=[tracer]) # the data will be automatically saved to local print(f"Tracing file path: {tracer._trace_file_path}") ``` + +## 完整示例 + +以下示例演示如何在 Agent 执行期间启用多平台追踪(CozeLoop、APMPlus、TLS),并打印本地追踪文件路径: + +```python +import json +from veadk import Agent, Runner +from veadk.memory.short_term_memory import ShortTermMemory +from veadk.tools.demo_tools import get_city_weather +from veadk.tracing.telemetry.exporters.apmplus_exporter import APMPlusExporter +from veadk.tracing.telemetry.exporters.cozeloop_exporter import CozeloopExporter +from veadk.tracing.telemetry.exporters.tls_exporter import TLSExporter +from veadk.tracing.telemetry.opentelemetry_tracer import OpentelemetryTracer + +session_id = "..." + +# Initialize tracing exporters +exporters = [CozeloopExporter(), APMPlusExporter(), TLSExporter()] +tracer = OpentelemetryTracer(exporters=exporters) + +# Create agent with tool and tracer +agent = Agent( + name="chat_robot", + description="A robot talk with user.", + instruction="Talk with user friendly.", + tools=[get_city_weather], + tracers=[tracer], +) + +# Create runner and execute +runner = Runner( + agent=agent, + short_term_memory=ShortTermMemory(), +) +await runner.run(messages="How is the weather like in Xi'an?", session_id=session_id) + +print(f"Tracing file path: {tracer._trace_file_path}") +``` + +本地 Trace 文件内容示意: +![本地 tracing 文件](/images/tracing-file.png) + +APMPlus 平台可视化界面: +![APMPlusExporter图](/images/tracing-apmplus.png) \ No newline at end of file