google ADK Agent间传参数
google ADK Agent间传参数
- 构建一个简单的串行工作流
- 简单运行串行工作流
- 简单说明执行过程
- qwen-plus大模型交互说明
- 第一步:大模型作诗
- 第二步:大模型点评
- qwen-plus大模型交互图
- 提示词中指定参数名
构建一个简单的串行工作流
python文件名agent.py
from google.adk.agents.llm_agent import LlmAgent
from google.adk.agents.sequential_agent import SequentialAgent
from google.adk.models.lite_llm import LiteLlmliteLlm = LiteLlm(model='openai/qwen-plus',api_key= 'sk-bsblbliabrliubaknbononkjbikbkbik',api_base= 'https://dashscope.aliyuncs.com/compatible-mode/v1');step1 = LlmAgent(name="Step1_Fetch",model=liteLlm,instruction="你是一个伟大诗人的诗人,可以按用户要求写诗,并输出",output_key="output_key_step1") # Saves output to state['output_key_step1']
step2 = LlmAgent(name="Step2_Process",model=liteLlm,instruction="你是一个评论家,特别擅长解说古诗词,可以对 state key 'output_key_step1'中的诗进行点评")
# step2 = LlmAgent(name="Step2_Process",model=liteLlm,
# instruction="你是一个评论家,特别擅长解说古诗词,可以下面对这首诗进行点评。 \n {output_key_step1}")root_agent = SequentialAgent(name="MyPipeline", sub_agents=[step1, step2])
简单运行串行工作流
python文件名main.py
import asyncio
from typing import castimport agent
from dotenv import load_dotenv
from google.adk.cli.utils import logs
from google.adk.runners import InMemoryRunner
from google.adk.sessions import Session
from google.genai import typesload_dotenv(override=True)
logs.log_to_tmp_folder()async def main():app_name = 'my_app'user_id_1 = 'user1'runner = InMemoryRunner(app_name=app_name,agent=agent.root_agent,)async def run_prompt(session: Session, new_message: str) -> Session:content = types.Content(role='user', parts=[types.Part.from_text(text=new_message)])print('** User says:', content.model_dump(exclude_none=True))async for event in runner.run_async(user_id=user_id_1,session_id=session.id,new_message=content,):if not event.content or not event.content.parts:continueif event.content.parts[0].text:print(f'** {event.author}: {event.content.parts[0].text}')elif event.content.parts[0].function_call:print(f'** {event.author}: fc /'f' {event.content.parts[0].function_call.name} /'f' {event.content.parts[0].function_call.args}\n')elif event.content.parts[0].function_response:print(f'** {event.author}: fr /'f' {event.content.parts[0].function_response.name} /'f' {event.content.parts[0].function_response.response}\n')return cast(Session,await runner.session_service.get_session(app_name=app_name, user_id=user_id_1, session_id=session.id),)session_1 = await runner.session_service.create_session(app_name=app_name, user_id=user_id_1)print(f'----Session to create memory: {session_1.id} ----------------------')session_1 = await run_prompt(session_1, '写一首描写荷塘的七言古诗,要豪放大气,不拘一格.')print('-------------------------------------------------------------------')if __name__ == '__main__':asyncio.run(main())
简单说明执行过程
1.使用qwen-plus大模型
liteLlm = LiteLlm(model=‘openai/qwen-plus’);
2.用户输入了:写一首描写荷塘的七言古诗,要豪放大气,不拘一格.
session_1 = await run_prompt(
session_1, ‘写一首描写荷塘的七言古诗,要豪放大气,不拘一格.’
)
3.先经过名称为 Step1_Fetch 的LlmAgent, 它可以写诗,并完成时将创作的结果,写到state[output_key_step1]中
step1 = LlmAgent(name=“Step1_Fetch”,model=liteLlm,instruction=“你是一个伟大诗人的诗人,可以按用户要求写诗,并输出”, output_key=“output_key_step1”) # Saves output to state[‘output_key_step1’]
4.在经过名称为 Step2_Process 的LlmAgent, 它可以对诗进行评价,并约束对 state key 'output_key_step1’中的诗进行点评
step2 = LlmAgent(name=“Step2_Process”,model=liteLlm,
instruction=“你是一个评论家,特别擅长解说古诗词,可以对 state key 'output_key_step1’中的诗进行点评”)
由此观察LlmAgent 调用大模型时,传递的数据
qwen-plus大模型交互说明
第一步:大模型作诗
step1 = LlmAgent(name=“Step1_Fetch”,model=liteLlm,instruction=“你是一个伟大诗人的诗人,可以按用户要求写诗,并输出”, output_key=“output_key_step1”) # Saves output to state[‘output_key_step1’]
大模型请求参数:
‘{“messages”:[{“role”:“system”,“content”:“你是一个伟大诗人的诗人,可以按用户要求写诗,并输出\n\nYou are an agent. Your internal name is \“Step1_Fetch\”.”},{“role”:“user”,“content”:“写一首描写荷塘的七言古诗,要豪放大气,不拘一格.”}],“model”:“qwen-plus”}’
大模型响应参数:
** Step1_Fetch:
荷塘月色醉流光,碧叶翻涌千里香。
不畏池浅水波动,豪情挥洒映天长。
莲茎挺拔如剑立,花开灿烂胜骄阳。
鱼翔浅底逐花影,我自高歌颂疏狂。
第二步:大模型点评
step2 = LlmAgent(name=“Step2_Process”,model=liteLlm,
instruction=“你是一个评论家,特别擅长解说古诗词,可以对 state key 'output_key_step1’中的诗进行点评”)
大模型请求参数:
{
“messages” : [ {
“role” : “system”,
“content” : “你是一个评论家,特别擅长解说古诗词,可以对 state key 'output_key_step1’中的诗进行点评\n\nYou are an agent. Your internal name is “Step2_Process”.”
}, {
“role” : “user”,
“content” : “写一首描写荷塘的七言古诗,要豪放大气,不拘一格.”
}, {
“role” : “user”,
“content” : [ {
“type” : “text”,
“text” : “For context:”
}, {
“type” : “text”,
“text” : “[Step1_Fetch] said: 荷塘月色醉流光,碧叶翻涌千里香。\n不畏池浅水波动,豪情挥洒映天长。\n莲茎挺拔如剑立,花开灿烂胜骄阳。\n鱼翔浅底逐花影,我自高歌颂疏狂。”
} ]
} ],
“model” : “qwen-plus”
}
大模型响应参数:
** Step2_Process:
这首诗描绘荷塘时,一反常态地将豪放风格融入其中,展现了不拘一格的艺术魅力。首句“荷塘月色醉流光”,以“醉”字点明氛围,把人带入如梦似幻的意境之中,而“流光”则增添了画面的流动感和神秘色彩。次句“碧叶翻涌千里香”,这里的“翻涌”用得极妙,赋予静态的荷叶以动态之美,仿佛能感受到那随风起伏的波澜,而香气弥漫至千里之外,夸张手法凸显了荷塘之广、花香之浓。
第三句“不畏池浅水波动”,表达出一种超脱世俗羁绊的心境,即便池水浅且有波动,也不畏惧,透露出自信与豁达。接着,“豪情挥洒映天长”,将个人情感升华为广阔天地间的豪迈气概,让读者感受到诗人内心澎湃的热情。
再看“莲茎挺拔如剑立”,把莲茎比作利剑,形象地刻画出其坚毅挺拔的姿态,充满力量感。“花开灿烂胜骄阳”,进一步强化这种热烈奔放的情绪,花朵绽放的辉煌程度甚至超越骄阳,可谓大胆想象,给人视觉上的强烈冲击。
最后两句“鱼翔浅底逐花影,我自高歌颂疏狂”,前半部分通过描写鱼儿追逐花影,为整个场景增添了几分灵动活泼;后半部分则直抒胸臆,“我自高歌颂疏狂”,表明自己要高声歌唱来赞颂这份不受约束的狂放情怀,使得整首诗的主题得到升华,充分体现了作者想要传达的那种豪放大气的精神风貌。
qwen-plus大模型交互图
请求大模型时会将state中的数据当作用户上下文传入。
显然这种提示词约束的效果,或者说准确度,只能依赖大模型根据用户上下文推理能力。如果上下文内容很多,可能效果会变差,准确度变低。
提示词中指定参数名
# {output_key_step1} 这个变量output_key_step1会从state[output_key_step1]中去取值并替换
step2 = LlmAgent(name="Step2_Process",model=liteLlm,instruction="你是一个评论家,特别擅长解说古诗词,可以下面对这首诗进行点评。 \n {output_key_step1}")
请求大模型时也会将state中的数据当作用户上下文传入。
显然这种提示词明确指定了内容的效果更好,或者说准确度更高,
减小对大模型根据用户上下文推理能力的依赖,就算在上下文内容很多的情况,也不影响准确度。