让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 更进一步,如何利用现有代码资产实现需求,如果现有代码不能满足需求,再生成新的代码 …

  • 21
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhyuli

您的鼓励是对我付出努力一种赞赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值