让AI给你写代码(10.4)更贴近自然语言构建代码——尝试分步骤匹配本地接口库执行完整任务

之前的一系列内容,我们逐步拓展了AI根据中文提示自动编程的能力,但正如 让AI给你写代码(10.1): 按接口编程的思想,统一利用内部和外部的接口,逐步扩展和提升AI编程能力 中所述, 目前中文提示更偏向于使用中文编程,即类似于详细设计中描述程序过程以及所希望使用的接口方法(函数),完成该接口方法的代码构建后,再生成该接口方法的功能描述,结合调用该接口方法的方式,储存于ES的接口索引,然后可以用通过自然语言匹配接口索引中相关接口方法描述,并驱动执行相应接口方法。

自然而然,当我们积累了一部分可用接口方法资产后,就需要向前迈一步,能否按更贴近自然语言的方式自动有序的匹配多个接口方法,完成预设的任务?

1、需求

ps://blog.youkuaiyun.com/zhyuli/article/details/143321863)中计算了沪深300所有成份股的动态市盈率、TTM市盈率和市净率,现在准备按下列输入计算 沪深300平均动态市盈率、TTM市盈率和市净率

1 计算沪深300平均动态市盈率,按以下步骤
步骤1: 计算沪深300的动态市盈率
步骤2: 计算指定指标的平均值

希望按

  1. 自动匹配 “步骤1 计算沪深300的动态市盈率” 2) 根据1)计算结果,匹配“步骤2,计算指定指标的平均值” 完成计算给出最后值

2、难点


根据设想,步骤1的输出结果应该是步骤2的输入,那么存在2个问题
1 自然语言表达上步骤2如何引用步骤1的输出结果
2 具体在python程序内,依次执行步骤1和步骤2对应的方法,如何保存步骤1的输出,并在调用步骤2匹配的方法时作为输入一起执行。

解决问题1:
由前述博文所知,计算完成的指标是保存在本地文件中,并且希望能通用计算动态市盈率、TTM市盈率和市净率等指标,所以输入自然语言提示(prompt)修改为:

1 计算沪深300平均动态市盈率,按以下步骤
步骤1: 计算沪深300的动态市盈率
步骤2: 计算指定指标的平均值,按本地文件{local_file}以及指标为动态市盈率

并且按步骤2的表述,并参照前文的方法由AI自动生成代码和接口方法描述,需求描述如下:

请生成从本地文件获得列表计算平均值的python函数calc_avg_from_localFile,输入值为本地文件名localFile和指标名i_name,按localFile获得本地文件后转成dataframe,并按指标名计算平均值,打印并返回值,如果发生异常则打印异常并反回失败。
并按本地文件名/home/cfets/myquant/fundamentalData/HS300_PE.csv指标名为“动态市盈率”计算案例。

代码略过

储存在接口方法索引es_repository-interface_new的描述如下:

计算指定指标的平均值,可以使用pythonRepository库的calc_avg_from_localFile接口,入参按为本地文件名localFile和指标名i_name,打印并返回指标的平均值,使用python编码,代码格式为python...

解决问题2:
主要的麻烦是AI小助手主程序执行代码用的是exec(代码,global)方法没有返回值,好在执行代码的所有变量,包括返回值都存在global变量里。

global:: {
   
   '__name__': 'assistant.aiAssistant_old', '__doc__': None, '__package__': 'assistant', '__loader__': ...... , 'quit': Use quit() or Ctrl-D (i.e. EOF) to exit, 'exit': Use exit() or Ctrl-D (i.e. EOF) to exit, 'copyright': Copyright (c) 2001-2022 Python Software Foundation.
All Rights Reserved.

Copyright (c) 2000 BeOpen.com.
All Rights Reserved.

All Rights Reserved., 'credits':     Thanks to CWI, CNRI, BeOpen.com, Zope Corporation and a cast of thousands
   ..., 'Assistant': <class 'assistant.aiAssistant_old.Assistant'>, 'calc_HS300_pe': <function calc_HS300_pe at 0x7f04a8a3acb0>, 'file_name': '/home/cfets/myquant/fundamentalData/HS300_PE.csv'} 

其中calc_HS300_pe是计算沪深300动态市盈率的方法,而file_name则是调用calc_HS300_pe方法代码获得其返回值的变量,也就是按步骤1生成的代码中的变量

# 导入所需库
from pythonRepository import calc_HS300_pe

# 调用函数计算沪深300指数成分股的动态市盈率
file_name = calc_HS300_pe()

# 打印文件名
print(f"动态市盈率数据已保存至: {
     
     file_name}")

以上两个问题有基本解决思路后,我们看一下整体解决方案

3、代码


按分步骤匹配的总体步骤,我们分为主程序aiTestChain.py、小助手生成、执行、分析代码aiAssistant_chain.py两部分

主程序aiTestChain.py:

import... 

def ai_calc_fun(step_prompt:str,re_value,llm: BaseLLM):
    # 在prompt中提取变量,如果有变量则将re_value赋值给变量
    pattern =  r'\{(.*?)\}'  # 正则表达式模式匹配大括号内的内容
    if len(re.findall(pattern, step_prompt)) > 0:  # 判断是否匹配到变量
        v_name = "{"+re.findall(pattern, step_prompt)[0]+"}"
        v1 = {
   
   v_name: re_value}
        step_prompt = step_prompt.replace(v_name, str(v1[v_name]))  # 替换prompt中的变量

    step_prompt = step_prompt.split(" ")[1]

    # print(f"prompt:: %s " % step_prompt)
    similarDocs = assistant.local_interface_db.searchKnowledge(step_prompt)

    # print('similarDocs:: ', similarDocs)
    summary_prompt = "".join([doc.page_content for doc in similarDocs
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

zhyuli

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

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

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

打赏作者

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

抵扣说明:

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

余额充值