让AI给你写代码(五)—— 应用Agent,理解Agent,走进现实世界

本文想解决一个问题,理解Agent有啥具体的作用? 所谓读书千遍,不如动手一试,我们还是借助于上一篇,让AI给你写代码(四)—— 初步利用LangChain Agent根据输入生成,保存,执行,可以根据提示(prompt)生成代码的Agent,来解决本系列一开始的问题,提取股票信息的一些信息,例如当前股价。

一. 代码说明

我们对代码稍作修改,一个是支持多次人工输入,而不是一次性的预先输入,另一个是重点修改descrription描述,以指导agent以更快的方式生成代码,代码如下

import dashscope
import os
from langchain_community.llms import tongyi
from langchain.agents import initialize_agent
from langchain.tools import tool
from langchain.utilities.python import PythonREPL
import textwrap

from langchain.agents import (
    Tool,
    AgentExecutor,
    agent,
    
)

import time
import random


dashscope.api_key="sk-bb1e64ed39b64aa49195280a8a52cfae"

#新增解析返回数据
def output_response(response: str) -> None:
    if not response:
        exit(0)
    for line in textwrap.wrap(response, width=60):
        for word in line.split():
            for char in word:
                print(char, end="", flush=True)
                time.sleep(0.1)  # Add a delay of 0.1 seconds between each character
            print(" ", end="", flush=True)  # Add a space between each word
        print()  # Move to the next line after each line is printed
    print("----------------------------------------------------------------")


def saveFile(replyMessages: str):
    print('... to save the file ...')
    
    python_path="/home/cfets/eclipse-workspace/TestAI/testchain/"
    
    now_time = time.strftime('%Y-%m-%d_%H:%M:%S', time.localtime())
    i = random.randint(1, 100)
    code_file = python_path + "pyAITest_" + now_time + '_' + str(i) + ".py"
    
    # 保存至文件
    res_content=False
    
    try:
        with open(code_file, 'w') as f:
            f.write(replyMessages)
            res_content =True
    except Exception as e:
        print('Error: %s' % e)
        
    return res_content
            
@tool
def py_repl_tool(code: str):
    """Returns the result of execution."""

    _, after = code.split("```python")  
    realcode = after.split("```")[0]
    
    py_repl=PythonREPL()
    
    #print('realcode:  %s' % realcode)
    
    #保存文件
    if saveFile(realcode):
        print('file is saved ... ')
    
    return py_repl.run(realcode)
    

if __name__ == '__main__':
    os.environ["DASHSCOPE_API_KEY"] = dashscope.api_key
    
    tools = [
    Tool(
        name = "python_1",
        func=py_repl_tool.run,
        description="""请使用python,通过akshare接口获取市场行情,然后按指定的股票代码过滤该股票的行情,
        要求:
           1,请使用以em结尾的方法接口,不要使用新浪接口
           2,返回字段使用中文“代码” 筛选,再按“最新价”
           3,最后用print方法打印行情
        代码格式为
        e.g.:
        ```python
           ....
        ```"""
        ),    #修改描述
    ]
    
    agent = initialize_agent(
    llm=tongyi.Tongyi(model_name="qwen-max",temperature=0), 
    tools=tools,
    verbose=True,
    max_iterations=5,
)
    #agent.run("What is the 10th fibonacci number?")
    #agent.run("股票300001现在的市场价格是多少?")
    
    # 支持多次人工输入
    while True:
        try:
            user_input = input("请输入6位股票代码 :")
            response = agent.run(user_input)
            output_response(response)
        except KeyboardInterrupt:
            break 

我们重点看一下agent的description,根据之前踩坑的经验,告诉AI几条
1 用什么工具(python)什么库(akshare库),按什么规则解决什么问题(获取市场行情,然后按指定的股票代码过滤该股票的行情)
2 几条要求,实际上是避免踩坑
1) 要求其使用stock_zh_a_spot_em()接口(注意,如果直接写,可能更稳定一些)
2) 避免AI使用英语列名导致错误
3) 要打印结果

这更像是技术设计的描述,越接近于代码生成的代码越是准确,当然如果过度的话,那么自动生成代码的意义就不大了…

另外需要说明的是max_iterations=5 这个参数表示迭代次数(5次),从实际运用的角度看,就是如果一次生成后,py_repl.run(realcode)执行报异常,会再次生成代码并执行,直到不报异常; 每一轮执行都会生成一个代码并保存

二 执行验证

我们可以看一下执行结果
在这里插入图片描述
执行了两次,分别差了300015和002389

再执行生成保存的代码验证一下(002389)

在这里插入图片描述
这个应用看上去非常简单,那有没有实际意义呢?
我们通过直接执行通义千问试试,要求他按股票代码给出现在的股价,结果是不支持的… 原因也写了
在这里插入图片描述

通过这个案例,我们可以理解,直接应用大模型对话,大模型提供的回答实际上是基于数据空间,不一定是真实世界。 但如果应用Agent,则可以驱动大模型通过一定的工具在现实世界里找到答案…

是这样吗? 我再尝试一下文心一言,同样是找现实股票当下的股价
在这里插入图片描述
文心一言给出了答案… 那Agent能不能做到文心一言对话也做不到的任务呢?

继续,我们进一步要求,按股票代码按最近5天的K线数据,结果是… 做不到
在这里插入图片描述
我们看看Agent能否做到

description="""请使用python,通过akshare接口获取指定股票最近5天的行情
        包括:
           1,如果股票代码包含“300”,请转换为“sz300***”,如果股票包含“600”,请转换为“sh600***”
           2,请先用最新历史行情接口,按个股获取最近5天的开盘价、收盘价,最高价,最低价,返回列表,并用print方法打印数据
        代码格式为
        e.g.:
        ```python
           ....
        ```"""

稍作说明,

  1. py_repl.run暂时不支持作图,所以仅要求提供5天的K线数据,包括开盘价、收盘价,最高价,最低价,
  2. 第一条要求主要是对应akshare相关历史行情接口,比较变态的入参要求 ak.stock_zh_a_daily(symbol=“sz000001”, start_date=“19910403”, end_date=“20231027”, adjust=“qfq”)
    print(stock_zh_a_daily_qfq_df)

我们看执行效果和生成代码
AI折腾了几轮,终于折腾出结果…
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
说明: 仅有三组是因为最近5天包含了周末两天…

我们看一下最后自动生成的代码执行结果,完全一致

在这里插入图片描述
终于,大模型通过Agent,向我们张开双臂,欢迎走进现实世界,您现在可以用对话驱动现实世界干活了…

下一步的改进,应该是要解决几个问题,1 能否实现,先测试后存盘,即依据测试正确结果保存代码 2 进一步,输入现有的代码,在此基础上按新的需求进行修改,再测试,再存盘 3 更进一步,如何利用现有代码资产实现需求,如果现有代码不能满足需求,再生成新的代码 …

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/472552.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于springboot的药房进销存管理系统

光明医院药品库房信息管理系统的设计与实现医院管理员 1.医院管理员信息管理—增加删除修改人员信息(人员信息包括年龄性别学历) 2医院管理员账号密码修改 3发布公告—医院管理者发布医院公告对药库管理者可见 4查看药品入库出库信息 (药品厂商,生产日期&#xff0c…

【接口测试】神器JMeter

‍1 JMeter是什么 Apache JMeter是Apache组织开发的一款开源软件,是一款非常好用的接口测试工具。它的特点是开源免费,简单好用。 我们在测试过程需要做接口测试的话就可以使用它,也可以用来批量造数据,接下来我们就来看看JMete…

统计学第1天

描述性统计 统计数据类型分类 按计量尺度划分 分类数据 能归于某一类别的非数字数据,数据是对事进行分类的结果,结果表现为类别,用文字来描述。 例如:人口按照性别(男、女),企业按照所处行业…

进程(2)——进程优先级

1、基本概念 cpu资源分配的先后顺序,就是指进程的优先权(priority)。 优先权高的进程有优先执行权利。配置进程优先权对多任务环境的linux很有用,可以改善系统性能。 还可以把进程运行到指定的CPU上,这样一来&a…

【Unity】捕捉PC桌面的插件

【背景】 之前介绍了如何用一款名为uWindowCapture的Unity免费插件在Unity的Canvas上展示PC桌面。经过一段时间的使用,本篇继续分享此插件的一些功能和限制。 在此感谢作者Hecomi。 【特征和限制】 一般局域网络环境只能最多达到15帧的帧率,所以别幻想用来窜流游戏或者看电…

Linux环境开发工具之vim

前言 上一期我们已经介绍了软件包管理器yum, 已经可以在linux上查找、安装、卸载软件了,本期我们来介绍一下文本编辑器vim。 本期内容介绍 什么是vim vim的常见的模式以及切换 vim命令模式常见的操作 vim底行模式常见的操作 解决普通用户无法执行sudo问…

【机器学习300问】40、如何评估一个异常检测系统?

上一篇文章是我学习异常检测系统如何实现的学习笔记,这篇文章接着上文记录几个评价异常检测系统的关键步骤和指标。如果友友们没有看过之前的文章可以点击下面的链接去看看哦! 【机器学习300问】39、高斯分布模型如何实现异常检测?http://t.…

【鸿蒙HarmonyOS开发笔记】通知模块之发布基础类型通知,内含如何将图片变成PixelMap对象

通知简介 应用可以通过通知接口发送通知消息,终端用户可以通过通知栏查看通知内容,也可以点击通知来打开应用。 通知常见的使用场景: 显示接收到的短消息、即时消息等。 显示应用的推送消息,如广告、版本更新等。 显示当前正…

数据库系统概论-第3章 关系数据库标准语言SQL

3.1 SQL概述 3.2 学生-课程数据库 3.3 数据定义 3.4 数据查询 3.5 数据更新 3.6 空值的处理 3.7 视图 3.8 小结

Wav2Lip+facefusion通过云GPU实现自定义数字人

1 通过Wav2Lip同步嘴型 这里我是用的云GPU,选择的恒通云,下面是我的套餐信息 比较注意的是选择的镜像必须选择拥有python3.6的镜像,因为Wav2Lip需要的环境就是python3.6 开始进入系统执行下面操作 克隆源码: git clone https:…

【四六级最强四六级通关秘籍】十万字经验贴,浅谈 大学生与大学英语四六级的“爱恨情仇“

大学生与大学英语四六级的"爱恨情仇" 一、、创文初衷 1.1创作目的 亲爱的网友们, 大家好!我最近意识到,尽管英语六级考试对许多大学生来说是一个重要的挑战,但并不是每个人都能找到合适的学习方法和技巧来顺利通过这…

计算机设计大赛 题目: 基于深度学习的疲劳驾驶检测 深度学习

文章目录 0 前言1 课题背景2 实现目标3 当前市面上疲劳驾驶检测的方法4 相关数据集5 基于头部姿态的驾驶疲劳检测5.1 如何确定疲劳状态5.2 算法步骤5.3 打瞌睡判断 6 基于CNN与SVM的疲劳检测方法6.1 网络结构6.2 疲劳图像分类训练6.3 训练结果 7 最后 0 前言 🔥 优…

内核移植——开发板的软件抽象(struct machine_desc)

以下内容源于朱有鹏嵌入式课程的学习与整理,如有侵权请告知删除。 内核支持什么架构、支持哪款cpu,这是如何确定的?主要是通过机器码来确定的。 内核中定义了一份机器码,uboot也会给内核传递一个机器码。 在内核启动的汇编阶段&…

【呼市经开区建设服务项目水、电能耗监测 数采案例】

实施方案 针对能耗采集中的水、电能源数据采集,因客观因素条件,数据采集方面存在较大难度。大多数国网电表485接口由于封签限制,不能实施采集,不让拆机接线,采集实施存在困难。水量能耗采集,存在类似问题&a…

网络原理(3)——TCP协议

目录 一、连接管理 二、三次握手 1、何为三次握手? 2、三次握手有何意义? 三、四次挥手 三次握手和四次挥手的相似之处和不同之处 (1)相似之处 (2)不同之处 四、TCP的状态 建立连接: 断开…

Fabric.js在vue2中使用

Fabric.js安装 这里我是基于vue来使用的,先安装上Fabric.js npm install fabric 在main.js中 import fabric from fabric Vue.use(fabric);Fabric 提供了 7 种基础形状: fabric.Circle (圆)fabric.Ellipse (椭圆)fabric.Line (线)fabric.Polyline (多条…

GIS学习

匹配查询,先连接两个表,然后在一个表里面查询 合并两个形状 比较好的colormap http://soliton.vm.bytemark.co.uk/pub/cpt-city/views/totp-cpt.html https://docs.gmt-china.org/latest/cpt/builtin-cpt/ 计算坡度时就要捕捉栅格 重分类时也要捕捉栅…

protobuf原理解析-基于protobuf-c实现序列化,反向序列化

1.一个实例 前面介绍了使用protobuf的流程. (1). 定义proto文件来描述需要序列化和反向序列化传输的消息. (2). 借助proto-c,为proto文件生成对应的代码控制文件. (3). 程序借助生成的代码控制文件和protobuf-c动态库的支持实现类…

HarmonyOS如何创建及调用三方库

介绍 本篇主要向开发者展示了在Stage模型中,如何调用已经上架到三方库中心的社区库和项目内创建的本地库。效果图如下: 相关概念 Navigation:一般作为Page页面的根容器,通过属性设置来展示页面的标题、工具栏、菜单。Tabs&#…