核心内容摘要
羞羞答答网站官方版:解锁心动,遇见那个ta
场景: 在某些场景中需要大模型准确计算数学公式 而语言模型天生不适合进行复杂的逻辑计算。
因此把计算封装成函数。
使用agent解决逻辑计算问题.第一步: 起模型服务可以本地起服务llm_cfg { # Use your own model service compatible with OpenAI API by vLLM/SGLang: model: Qwen/Qwen
B, model_server: http://localhost:8000/v1, # api_base api_key: EMPTY, generate_cfg: { # When using vLLM/SGLang OAI API, pass the parameter of whether to enable thinking mode in this way extra_body: { chat_template_kwargs: {enable_thinking: False} }, # Add: When the content is thinkthis is the thought/thinkthis is the answer # Do not add: When the response has been separated by reasoning_content and content # This parameter will affect the parsing strategy of tool call # thought_in_content: True, }, }也可以调用部署好的云服务, 我使用的是阿里云百联的云服务.llm_cfg { # Use the model service provided by DashScope: model: qwen
b-a3b-instruct-2507, model_type: qwen_dashscope, api_key: sk-, # (Optional) LLM hyperparameters for generation: generate_cfg: { top_p:
8, } }第二步,构建智能体主函数register_tool(tuixiu
class MyTuixiu(BaseTool): # The description tells the agent the functionality of this tool. description 查询用户退休日期的工具, 提取用户的出生日期,格式是yyyy-MM, 返回用户的退休日期. # The parameters tell the agent what input parameters the tool has. parameters [{ name: prompt, type: string, description: 用户的出生日期,格式是yyyy-MM, required: True }]这个地方要注意:
register_tool(tuixiu
这个是你注册的函数, 要记下来
description 很重要, 大模型能不能关联到这个工具, 以及是否过度关联错误, 都需要这里描述. 主要描述这个工具的功能是什么, 什么查询意图下,调用这个工具, 以及工具需要提取的参数什么格式.
parameters这个是你提取的参数的格式, 重点要解释清楚提取什么格式的参数,传入到函数中.如果提取的不干净,函数里面就要写异常处理,这一步是函数的构建函数,也是核心的逻辑处理程序, 主要是接收parameters之后的处理过程,就是一个python函数,改写即可def call(self, params: str, **kwargs) - str: # params are the arguments generated by the LLM agent. prompt json
loads(params)[prompt] birth_date str(prompt) if isinstance(birth_date, str): try: # 支持 YYYY-MM 格式 parts birth_date.split(-) if len(parts) ! 2: raise ValueError(输入格式应为 YYYY-MM) y, m int(parts[0]), int(parts[1]) birth_date date(y, m,
# 日期设为1号 except Exception as e: raise ValueError(f无法解析出生日期 {birth_date}: {e}) elif not isinstance(birth_date, date): raise TypeError(birth_date 必须是 datetime.date 对象或可解析的日期字符串) # 判断出生年月属于哪个区间 birth_year birth_date.year birth_month birth_date.month # 1964年12月及之前出生的60周岁退休 if birth_year 1965 or (birth_year 1965 and birth_month
: retirement_date birth_date relativedelta(years
# 1965年1月至1976年8月出生的按规则延迟 elif (birth_year 1965 and birth_month
or \ (birth_year 1965 and birth_year
or \ (birth_year 1976 and birth_month
: # 计算从1965年1月开始的月份数 months_since_1965 (birth_year -
* 12 (birth_month -
# 每4个月为一个区间每个区间延迟月数递增1个月 delay_months months_since_1965 // 4 1 retirement_date birth_date relativedelta(years60, monthsdelay_months) # 1976年9月及之后出生的63周岁退休 else: retirement_date birth_date relativedelta(years
return f{retirement_date.year}-{retirement_date.month:02d}第三步, 系统配置system_instruction 你是一个客服助手,善于用精简的答案回复用户的问题。
你需要遵循以下指示 分析我的需求是否需要调用工具。
如果不需要工具你可以直接思考并提供答案。
我会给你很多工具其中一些功能相似。
请仔细分析当前需要调用哪个工具。
如果需要调用工具你必须在每一轮中至少调用一个工具直到任务完成。
如果你从工具调用中获得了有用的链接或图片请在回答中一并输出。
仔细检查工具返回的结果它包含什么内容是否包含你需要的信息 你没有内置的地理编码/坐标/链接。
不要输出任何伪造的地理编码、坐标或链接。
必须先通过工具查询这些信息 不要随意调用工具。
对于需要执行特定任务或检索信息的请求你必须使用以下格式使用用户语言 用户需要…… 我已经详细分析了该请求并将其分解为以下步骤…… 如果你有可用的工具来帮助解决问题请按以下格式回答 用户需要…… 我已经详细分析了该请求并将其分解为以下步骤…… 首先我应该使用[Tool Name]因为[explain relevance]。
所需的输入参数为…… …… 我已仔细审查了工具的输出结果。
该结果确实/未能完全满足我的预期。
接下来我需要…… tools [tuixiu2, code_interpreter] #tuixiu2 是上一步,你注册的,名字要一致 code_interpreter is a built-in tool for executing code. For configuration details, please refer to the FAQ. bot Assistant(llmllm_cfg, system_messagesystem_instruction, function_listtools,)这里我分享了一个不错的系统prompt, 用起来比较不错我在windows下面没跑通, 在linux下面跑通的, 需要提前安装:https://github.com/QwenLM/Qwen-Agent下面是完整的代码,用来计算男性的退休日期,import pprint import urllib.parse import json5 from qwen_agent.agents import Assistant from qwen_agent.tools.base import BaseTool, register_tool from qwen_agent.utils.output_beautify import typewriter_print import os from datetime import date from dateutil.relativedelta import relativedelta # Step 1 (Optional): Add a custom tool named my_image_gen. register_tool(tuixiu
class MyTuixiu(BaseTool): # The description tells the agent the functionality of this tool. description 查询用户退休日期的工具, 提取用户的出生日期,格式是yyyy-MM, 返回用户的退休日期. # The parameters tell the agent what input parameters the tool has. parameters [{ name: prompt, type: string, description: 用户的出生日期,格式是yyyy-MM, required: True }] def call(self, params: str, **kwargs) - str: # params are the arguments generated by the LLM agent. prompt json
loads(params)[prompt] birth_date str(prompt) if isinstance(birth_date, str): try: # 支持 YYYY-MM 格式 parts birth_date.split(-) if len(parts) ! 2: raise ValueError(输入格式应为 YYYY-MM) y, m int(parts[0]), int(parts[1]) birth_date date(y, m,
# 日期设为1号 except Exception as e: raise ValueError(f无法解析出生日期 {birth_date}: {e}) elif not isinstance(birth_date, date): raise TypeError(birth_date 必须是 datetime.date 对象或可解析的日期字符串) # 判断出生年月属于哪个区间 birth_year birth_date.year birth_month birth_date.month # 1964年12月及之前出生的60周岁退休 if birth_year 1965 or (birth_year 1965 and birth_month
: retirement_date birth_date relativedelta(years
# 1965年1月至1976年8月出生的按规则延迟 elif (birth_year 1965 and birth_month
or \ (birth_year 1965 and birth_year
or \ (birth_year 1976 and birth_month
: # 计算从1965年1月开始的月份数 months_since_1965 (birth_year -
* 12 (birth_month -
# 每4个月为一个区间每个区间延迟月数递增1个月 delay_months months_since_1965 // 4 1 retirement_date birth_date relativedelta(years60, monthsdelay_months) # 1976年9月及之后出生的63周岁退休 else: retirement_date birth_date relativedelta(years
return f{retirement_date.year}-{retirement_date.month:02d} # Step 2: Configure the LLM you are using. llm_cfg { # Use the model service provided by DashScope: model: qwen
b-a3b-instruct-2507, model_type: qwen_dashscope, api_key: sk-, # (Optional) LLM hyperparameters for generation: generate_cfg: { top_p:
8, } } # Step 3: Create an agent. Here we use the Assistant agent as an example, which is capable of using tools and reading files. system_instruction 你是一个客服助手,善于用精简的答案回复用户的问题。
你需要遵循以下指示 分析我的需求是否需要调用工具。
如果不需要工具你可以直接思考并提供答案。
我会给你很多工具其中一些功能相似。
请仔细分析当前需要调用哪个工具。
如果需要调用工具你必须在每一轮中至少调用一个工具直到任务完成。
如果你从工具调用中获得了有用的链接或图片请在回答中一并输出。
仔细检查工具返回的结果它包含什么内容是否包含你需要的信息 你没有内置的地理编码/坐标/链接。
不要输出任何伪造的地理编码、坐标或链接。
必须先通过工具查询这些信息 不要随意调用工具。
对于需要执行特定任务或检索信息的请求你必须使用以下格式使用用户语言 用户需要…… 我已经详细分析了该请求并将其分解为以下步骤…… 如果你有可用的工具来帮助解决问题请按以下格式回答 用户需要…… 我已经详细分析了该请求并将其分解为以下步骤…… 首先我应该使用[Tool Name]因为[explain relevance]。
所需的输入参数为…… …… 我已仔细审查了工具的输出结果。
该结果确实/未能完全满足我的预期。
接下来我需要…… tools [tuixiu2, code_interpreter] # code_interpreter is a built-in tool for executing code. For configuration details, please refer to the FAQ. bot Assistant(llmllm_cfg, system_messagesystem_instruction, function_listtools,) # Step 4: Run the agent as a chatbot. messages [] # This stores the chat history. while True: # For example, enter the query draw a dog and rotate it 90 degrees. query input(\nuser query: ) # Append the user query to the chat history. messages.append({role: user, content: query}) response [] response_plain_text print(bot response:) for response in bot.run(messagesmessages): # Streaming output. response_plain_text typewriter_print(response, response_plain_text) # Append the bot responses to the chat history. messages.extend(response)