基于 AI 實(shí)現(xiàn)阿里云的智能財(cái)務(wù)管家
為了解決傳統(tǒng)賬單處理中人工查詢效率低下、響應(yīng)速度慢及易出錯(cuò)等問(wèn)題,同時(shí)順應(yīng)AI技術(shù)發(fā)展趨勢(shì),提升服務(wù)智能化水平。隨著業(yè)務(wù)規(guī)模擴(kuò)大和賬單數(shù)據(jù)復(fù)雜度增加,人工處理已難以滿足高效管理需求。我們想到通過(guò)AI技術(shù),制作一個(gè)賬單機(jī)器人,自動(dòng)化完成賬單查詢與分析,節(jié)省人力成本,讓用戶快速獲取準(zhǔn)確信息,提升滿意度。
流程圖
上圖為基于阿里云百煉實(shí)現(xiàn)賬單機(jī)器人的完整流程。具體步驟如下:
- 用戶通過(guò)私聊或者@飛書機(jī)器人的方式提出賬單相關(guān)的問(wèn)題。
- 計(jì)算巢AppFlow通過(guò)飛書接收消息事件觸發(fā)連接流,將問(wèn)題傳遞給大模型服務(wù)平臺(tái)百煉。
- 大模型服務(wù)平臺(tái)百煉利用其強(qiáng)大的AI能力生成相應(yīng)的查詢SQL語(yǔ)句。
- 生成的SQL語(yǔ)句被發(fā)送到函數(shù)計(jì)算(FC)服務(wù),由FC 執(zhí)行SQL查詢,從SLS中獲取所需的賬單數(shù)據(jù)。
- 百煉平臺(tái)根據(jù)返回的賬單數(shù)據(jù)生成最終的答案。
- 答案通過(guò)計(jì)算巢 AppFlow 返回給飛書機(jī)器人。
- 最后,飛書機(jī)器人將答案呈現(xiàn)給用戶。
注意:關(guān)于為什么從SLS里獲取賬單數(shù)據(jù),請(qǐng)見新版成本管家可視化賬單報(bào)表實(shí)踐、阿里云多賬號(hào)財(cái)務(wù)管理最佳實(shí)踐。
FC函數(shù)計(jì)算
點(diǎn)擊https://fcnext.console.aliyun.com/cn-shanghai/functions此鏈接,在右側(cè)菜單欄中選擇“函數(shù)”,在函數(shù)界面上點(diǎn)擊“創(chuàng)建函數(shù)”按鈕。
圖片
選擇“事件函數(shù)”,在基本設(shè)置里填寫“函數(shù)名稱”。在函數(shù)代碼中,選擇“內(nèi)置運(yùn)行時(shí)/Python/Python3.12”運(yùn)行環(huán)境,代碼上傳方式暫時(shí)選擇“使用示例代碼”中的“Hello,world!示例”。高級(jí)配置里的請(qǐng)求處理程序變更為“index.main”,“時(shí)區(qū)”選擇“Asia/Shanghai 北京時(shí)間”,“函數(shù)角色”選擇“AliyunFcDefaultRole”,“允許訪問(wèn) VPC”選擇“否”,“允許函數(shù)默認(rèn)網(wǎng)卡訪問(wèn)公網(wǎng)”選擇“是”,“日志功能”選擇啟用,其他配置保持默認(rèn)就行。完成上述配置后點(diǎn)擊“創(chuàng)建按鈕”。
1、百煉中只支持北京、杭州、上海、深圳地域的函數(shù)計(jì)算,故在創(chuàng)建函數(shù)時(shí)只能選擇這些地域。
2、賬單數(shù)據(jù)存儲(chǔ)在華北6(烏蘭察布)地域中,函數(shù)計(jì)算無(wú)法通過(guò)內(nèi)網(wǎng)查詢,所以函數(shù)計(jì)算必須要開公網(wǎng)。
3、開啟日志功能,便于排查報(bào)錯(cuò)。
圖片
點(diǎn)擊剛創(chuàng)建的函數(shù),進(jìn)行下一步配置。
圖片
菜單欄中選擇“代碼”,將下面的代碼填寫到index.py里(注意需要修改代碼里的配置!)。完成后點(diǎn)擊右上方的?按鈕。
from aliyun.log import LogClient
from aliyun.log import *
import logging,json,re
from datetime import datetime
logger = logging.getLogger()
def datetime_to_timestamp(date_string, date_format="%Y-%m-%d %H:%M:%S"):
dt = datetime.strptime(date_string, date_format)
return int(dt.timestamp())
def query_bill_logs(json_data):
accessKeyId = "" #填寫accessKeyId
accessKey = "" #填寫accessKey
endpoint = "cn-wulanchabu.log.aliyuncs.com" #填寫賬單數(shù)據(jù)所在的endpoint
project = "bill-analysis-xxxx" #填寫賬單數(shù)據(jù)所在的project
logstore = "aliyun_bill" #填寫賬單數(shù)據(jù)所在的logstore
client = LogClient(endpoint, accessKeyId, accessKey)
query = json_data["query"]
# from_time和to_time表示查詢?nèi)罩镜臅r(shí)間范圍,UNIX時(shí)間戳格式。
from_time = datetime_to_timestamp(json_data["from_time"])
to_time = datetime_to_timestamp(json_data["to_time"])
# query參數(shù)用于設(shè)置查詢語(yǔ)句;line參數(shù)用于控制返回日志條數(shù),line取值為3。
request = GetLogsRequest(project, logstore, from_time, to_time, '', query=query, line=3, offset=0, reverse=False)
response = client.get_logs(request)
# 查詢結(jié)果。
log_res_list=[]
for log in response.get_logs():
log_res = log.contents.items()
log_res_list.append(dict(log_res))
return log_res_list
def main(event,context):
data = event.decode('utf-8')
logger.info("收到的數(shù)據(jù):{}".format(data))
data=json.loads(data)["sql"]
match = re.search(r'\{.*?\}', data,re.DOTALL)
if match:
json_res = json.loads(match.group(0))
# 查詢?nèi)罩? log_res=str(query_bill_logs(json_res))
log_res = json.dumps(log_res, ensure_ascii=False, indent=4)
logger.info("查詢到的數(shù)據(jù):{}".format(log_res))
return log_res
else:
logger.info("未匹配到j(luò)son")
return "無(wú)法匹配到SQL"
圖片
在TERMINAL中執(zhí)行下面的語(yǔ)句,通過(guò)控制臺(tái)Web IDE終端安裝依賴。完成后點(diǎn)擊“部署代碼”按鈕,完成該函數(shù)的部署。
pip install -U aliyun-log-python-sdk -t .
圖片
部署完成后,需要測(cè)試一下,驗(yàn)證是否可以正常查詢。在菜單欄中點(diǎn)擊“測(cè)試”,填寫測(cè)試名稱和傳參(傳參可以參考下面的代碼),完成后點(diǎn)擊“測(cè)試”按鈕。
{
"sql": "{\"from_time\":\"2025-01-01 00:00:00\",\"to_time\":\"2025-02-01 00:00:00\",\"query\":\"*|select round(coalesce(sum(PretaxAmount),0),3) from splititem_bill_transform\"}"
}
圖片
如下圖所示,即為執(zhí)行成功。
圖片
大模型服務(wù)平臺(tái)百煉
知識(shí)庫(kù)
大模型缺乏私有知識(shí),根據(jù)用戶輸入從外部信息源檢索相關(guān)信息,然后將檢索到的內(nèi)容整合到用戶輸入中,從而幫助大模型生成更準(zhǔn)確的回答。將賬單相關(guān)數(shù)據(jù)引入專有知識(shí)庫(kù)后,大模型就能準(zhǔn)確回答賬單方面的問(wèn)題。
點(diǎn)擊https://bailian.console.aliyun.com/?tab=app#/data-center此鏈接,在左側(cè)菜單欄中選擇“應(yīng)用數(shù)據(jù)”,選擇“非結(jié)構(gòu)化數(shù)據(jù)”,點(diǎn)擊類目管理旁的“+”。
圖片
填寫“目錄名稱”,完成后點(diǎn)擊“確定”按鈕。
選擇剛創(chuàng)建的類目,點(diǎn)擊右上角的“導(dǎo)入數(shù)據(jù)”按鈕。
導(dǎo)入方式選擇“本地上傳”,將下面的文件《分賬賬單字段.xlsx》傳入到百煉中,完成后點(diǎn)擊確認(rèn)。
《分賬賬單字段.xlsx》為分賬賬單各個(gè)字段的名稱及解釋,便于百煉生成SQL語(yǔ)句。
字段名稱 | 字段類型 | 示例值 | 說(shuō)明 |
__time__ | INTEGER | 1739721600 | 賬單時(shí)間,Unix 時(shí)間戳,以秒為單位 |
instanceconfig | STRING | 地域:華東2(上海) | 實(shí)例詳細(xì)配置 |
internetip | STRING | 139.122.22.22 | 公網(wǎng)IP地址 |
pretaxamount | DOUBLE | 0.01 | 應(yīng)付金額,獲取賬單金額,一般就是指這個(gè)應(yīng)付金額,保留2位小數(shù) |
subscriptiontype | STRING | PayAsYouGo | 消費(fèi)類型:Subscription:預(yù)付費(fèi);PayAsYouGo:后付費(fèi)。 |
billingitem | STRING | ECS整機(jī)備份數(shù)量 | 計(jì)費(fèi)項(xiàng) |
pretaxgrossamount | DOUBLE | 0.033 | 原始金額 |
usage | DOUBLE | 1.0 | 使用量 |
splitbillingcycle | STRING | 2025-02 | 分賬月 |
producttype | STRING | hbrpost | 產(chǎn)品類型 |
paymentamount | DOUBLE | 0.0 | 現(xiàn)金支付(通過(guò)賬戶余額或線上支付渠道直接支付的金額,信控用戶包含使用退款賬本支付的金額) |
listprice | DOUBLE | 0.033333 | 單價(jià) |
splitbillingdate | STRING | 2025-02-17 | 賬期 |
zone | STRING | cn-shanghai-g | 可用區(qū) |
usageunit | STRING | 臺(tái) | 使用量單位 |
tag | STRING | key:environment value:prod; key:costcenter value:11111 | 標(biāo)簽 |
splitaccountname | STRING | 12@test.com | 分拆項(xiàng)所屬賬號(hào)名稱 |
splititemid | STRING | xxx-oss | 分拆項(xiàng)ID |
item | STRING | SubscriptionOrder | 賬單類型。包括: |
__source__ | STRING | splititem_bill | 分賬賬單 |
deductedbyprepaidcard | DOUBLE | 0.0 | 儲(chǔ)值卡抵扣 |
commoditycode | STRING | rds | 商品 Code |
ownerid | STRING | 1888888883 | 子賬號(hào) AccountID(多賬號(hào)代付場(chǎng)景) |
adjustamount | DOUBLE | 0.0 | 信用額度退款抵扣。 |
billingdate | STRING | 2025-02-23 | 賬單日期,格式 YYYY-MM-DD |
deductedbycoupons | DOUBLE | 0.0 | 優(yōu)惠券優(yōu)惠金額 |
instanceid | STRING | rm-xxxxxxxx | 實(shí)例 ID |
serviceperiod | DOUBLE | 1.0 | 服務(wù)時(shí)長(zhǎng),單位:秒 |
splitaccountid | STRING | 122 | 分拆項(xiàng)所屬賬號(hào) AccountID |
billingtype | STRING | 其它 | 計(jì)費(fèi)方式 |
region | STRING | 華東2(上海) | 地域 |
intranetip | STRING | 172.168.0.200 | 內(nèi)網(wǎng) IP |
productcode | STRING | rds | 產(chǎn)品代碼 |
outstandingamount | DOUBLE | 302.5 | 未結(jié)清金額 |
instancespec | STRING | mysql.x2.medium.2c | 實(shí)例規(guī)格 |
splitcommoditycode | STRING | snapshot | 分拆項(xiàng)商品 Code |
serviceperiodunit | STRING | 月 | 服務(wù)時(shí)長(zhǎng)單位 |
splititemname | STRING | test | 分拆項(xiàng)名稱 |
nickname | STRING | test | 實(shí)例昵稱、實(shí)例名稱 |
productname | STRING | 云數(shù)據(jù)庫(kù) RDS | 產(chǎn)品名稱 |
currency | STRING | CNY | 幣種:CNY、 USD、 JPY |
invoicediscount | DOUBLE | 247.5 | 優(yōu)惠金額 |
productdetail | STRING | 關(guān)系型數(shù)據(jù)庫(kù)RDS(包月) | 產(chǎn)品明細(xì) |
resourcegroup | STRING | xxx Group | 資源組 |
deductedbycashcoupons | DOUBLE | 0.0 | 代金券抵扣 |
splitproductdetail | STRING | 云服務(wù)器ECS-快照 | 分拆項(xiàng)產(chǎn)品明細(xì)名稱 |
listpriceunit | STRING | 元/臺(tái) | 單價(jià)單位 |
costunit | STRING | 未分配 | 財(cái)務(wù)單元 |
biztype | STRING | trusteeship | 業(yè)務(wù)類型 |
cashamount | DOUBLE | 0.0 | 現(xiàn)金支付(不包含信用額度退款抵扣) |
deductedbyresourcepackage | DOUBLE | 0.0 | 資源包抵扣 |
圖片
數(shù)據(jù)導(dǎo)入完成后,如下圖所示:
在左側(cè)菜單欄中選擇“知識(shí)庫(kù)”,點(diǎn)擊右上角的“+ 創(chuàng)建知識(shí)庫(kù)”。
填寫“知識(shí)庫(kù)名稱”,數(shù)據(jù)類型選擇“非結(jié)構(gòu)化數(shù)據(jù)”,其他配置保持默認(rèn),完成后點(diǎn)擊“下一步”按鈕。
圖片
選擇數(shù)據(jù)選擇“選擇類目”,類目選擇剛創(chuàng)建的類目“阿里云賬單機(jī)器人”,完成后點(diǎn)擊“下一步”按鈕。
圖片
其他配置保持默認(rèn),完成后點(diǎn)擊“導(dǎo)入完成”按鈕。
知識(shí)庫(kù)創(chuàng)建完成后,如下圖所示:
圖片
樣例庫(kù)
樣例庫(kù)功能作為百煉的FewShot能力,通過(guò)錄入用戶輸入(Query)和期望的模型回復(fù)(Answer)作為樣例信息源,在模型調(diào)用時(shí)根據(jù)用戶輸入,檢索召回相關(guān)樣例信息,以此作為輸出參考,從而提高大模型的回答準(zhǔn)確性,適用于問(wèn)答等場(chǎng)景。
在左側(cè)菜單欄中選擇“組件管理”,在組件管理界面的頂部菜單中選擇“樣例庫(kù)”,點(diǎn)擊“樣例庫(kù)管理”旁的“+”。
圖片
填寫“樣例庫(kù)名稱”,導(dǎo)入方式選擇“手動(dòng)輸入”,將下表數(shù)據(jù)填入到“樣例示例”,完成后點(diǎn)擊“確定”按鈕。
圖片
樣例庫(kù)配置完成后,如下圖所示:
圖片
應(yīng)用
大模型具備強(qiáng)大的語(yǔ)言能力,但仍有一定的局限性,例如難以處理私有領(lǐng)域問(wèn)題、獲取最新信息、遵循固定流程,以及自動(dòng)規(guī)劃復(fù)雜項(xiàng)目。為此,阿里云百煉推出了三種大模型應(yīng)用:智能體、工作流與智能體編排,增加了知識(shí)庫(kù)檢索、互聯(lián)網(wǎng)搜索、工作流設(shè)計(jì)及智能體協(xié)作等功能,顯著擴(kuò)展了大模型的應(yīng)用范圍。下表說(shuō)明三種大模型應(yīng)用的簡(jiǎn)介及示例場(chǎng)景。
生成SQL
點(diǎn)擊https://bailian.console.aliyun.com/?tab=app#/app-center此鏈接,在左側(cè)菜單欄中選擇“應(yīng)用管理”,在應(yīng)用管理界面的右上角點(diǎn)擊“+ 新增應(yīng)用”按鈕。
圖片
選擇“智能體應(yīng)用”,點(diǎn)擊“立即創(chuàng)建 ↗”按鈕。
圖片
選擇“通義千問(wèn)-Max”,提示詞填“需要從用戶的問(wèn)題中梳理出要查詢哪些信息,輸出要查詢數(shù)據(jù)的SQL。如果無(wú)法生成要查詢的SQL則回復(fù)“抱歉,您的問(wèn)題暫時(shí)無(wú)法回復(fù),請(qǐng)聯(lián)系工程師””,選擇剛創(chuàng)建的知識(shí)庫(kù)和樣例庫(kù)。完成后在右側(cè)輸入問(wèn)題“查詢2月阿里云花費(fèi)金額”,點(diǎn)擊發(fā)送按鈕,查看回答是否如下圖所示。若與下圖答復(fù)一致,則點(diǎn)擊右上角的“發(fā)布”按鈕。
圖片
發(fā)布完成后,會(huì)在剛創(chuàng)建的智能體應(yīng)右上角顯示“已發(fā)布”。注意:未發(fā)布會(huì)導(dǎo)致下面的流程出現(xiàn)問(wèn)題!
圖片
查詢賬單
在應(yīng)用管理界面的右上角點(diǎn)擊“+ 新增應(yīng)用”。
圖片
選擇“工作流應(yīng)用”,點(diǎn)擊“創(chuàng)建任務(wù)型工作流 ↗”按鈕。
圖片
按下圖所示進(jìn)行配置,引用上文創(chuàng)建的FC函數(shù)查詢賬單數(shù)據(jù),結(jié)合用戶的問(wèn)題和查到的賬單數(shù)據(jù),通過(guò)大模型組織答案。
圖片
完成配置后,點(diǎn)擊“測(cè)試”按鈕,輸入query:“查詢1月阿里云花費(fèi)金額”,sql:“{"from_time":"2025-01-01 00:00:00","to_time":"2025-02-01 00:00:00","query":"*|select round(coalesce(sum(PretaxAmount),0),3) from splititem_bill_transform"}”。完成后點(diǎn)擊“執(zhí)行”按鈕。
圖片
若結(jié)果如下圖所示,則說(shuō)明配置成功。
圖片
更改應(yīng)用名稱,點(diǎn)擊右上角的“發(fā)布”按鈕。
圖片
發(fā)布完成后,如下圖所示:
圖片
賬單機(jī)器人
在應(yīng)用管理界面的右上角點(diǎn)擊“+ 新增應(yīng)用”。
選擇“智能體編排應(yīng)用”,點(diǎn)擊“創(chuàng)建智能體編排應(yīng)用↗”按鈕。
圖片
按下圖所示進(jìn)行配置,將剛創(chuàng)建的兩個(gè)應(yīng)用串聯(lián)起來(lái),先根據(jù)用戶的問(wèn)題生成查詢SQL,再執(zhí)行SQL獲取賬單數(shù)據(jù),最終根據(jù)用戶的問(wèn)題組織答案。
圖片
注意:查詢賬單工作流配置,要輸入兩個(gè)變量,一個(gè)是用戶的問(wèn)題,一個(gè)是智能體應(yīng)用輸出的SQL。
圖片
完成后點(diǎn)擊“測(cè)試”按鈕,輸入query:“查詢2月阿里云花費(fèi)金額”,點(diǎn)擊“執(zhí)行”按鈕。
圖片
若運(yùn)行結(jié)果如下圖所示,則說(shuō)明執(zhí)行成功。成功后點(diǎn)擊“發(fā)布”按鈕。
圖片
發(fā)布完成后,如下圖所示:
圖片
KPI-Key
點(diǎn)擊https://bailian.console.aliyun.com/?tab=app#/api-key此鏈接,在左側(cè)菜單欄中選擇“API-Key”,點(diǎn)擊API Key管理界面右上角的“創(chuàng)建我的API-KEY”按鈕。
圖片
選擇應(yīng)用所在的歸屬業(yè)務(wù)空間,完成后點(diǎn)擊“確定”按鈕。
圖片
API-Key創(chuàng)建完成后,如下圖所示:
圖片
飛書應(yīng)用
點(diǎn)擊https://open.feishu.cn/app此鏈接,在企業(yè)自建應(yīng)用界面,點(diǎn)擊“創(chuàng)建企業(yè)自建應(yīng)用”按鈕。
圖片
填寫應(yīng)用名稱和應(yīng)用描述,完成后點(diǎn)擊“創(chuàng)建”按鈕。
圖片
在左側(cè)菜單欄中選擇“添加應(yīng)用能力”,找到機(jī)器人,點(diǎn)擊“+添加”按鈕。
圖片
在左側(cè)菜單欄中選擇“事件與回調(diào)”,選擇“加密策略”,復(fù)制Encrypt Key和Verification Token,用于下文配置計(jì)算巢AppFlow。
圖片
在左側(cè)菜單欄中選擇“事件與回調(diào)”,在事件配置界面,訂閱方式選擇“將事件發(fā)送至 開發(fā)者服務(wù)器”,填寫請(qǐng)求地址(這個(gè)請(qǐng)求地址在下文計(jì)算巢AppFlow配置中),完成后點(diǎn)擊“保存”按鈕。點(diǎn)擊“添加事件”按鈕,添加“用戶進(jìn)入與機(jī)器人的會(huì)話”、“接收消息”、“機(jī)器人自定義菜單事件”這三個(gè)事件。
圖片
在回調(diào)配置界面,像事件配置一樣,配置訂閱方式,并添加“卡片回傳交互”回調(diào)。
圖片
計(jì)算巢AppFlow配置完成后會(huì)得到IP白名單,將這些IP配置到飛書應(yīng)用的IP白名單中。
圖片
計(jì)算巢AppFlow
計(jì)算巢AppFlow通過(guò)界面化快速編排的方式,組合多個(gè)連接器的觸發(fā)事件和執(zhí)行動(dòng)作,從而連接多個(gè)應(yīng)用系統(tǒng),實(shí)現(xiàn)業(yè)務(wù)流程自動(dòng)化。使用計(jì)算巢AppFlow對(duì)接飛書和百煉,無(wú)需用戶寫代碼實(shí)現(xiàn),而且計(jì)算巢AppFlow是免費(fèi)的。
點(diǎn)擊
https://appflow.console.aliyun.com/vendor/cnhangzhou/flowTemplate/manage
此鏈接,在左側(cè)菜單欄中選擇“模板中心”,找到“飛書自建應(yīng)用 X 阿里云百煉”。
圖片
點(diǎn)擊“立即使用”按鈕。
圖片
點(diǎn)擊“添加新憑證”創(chuàng)建飛書自建應(yīng)用機(jī)器人憑證。
圖片
填寫“憑證名稱”、“App ID”、“App Secret”、“AES Key”、“token”,這些在飛書應(yīng)用中可以找到。底下的“IP白名單”添加到飛書應(yīng)用白名單中。完成后點(diǎn)擊“確定”按鈕。
圖片
點(diǎn)擊“添加新憑證”創(chuàng)建阿里云百煉憑證。
圖片
填寫“憑證名稱”和“API-KEY”(請(qǐng)見上文創(chuàng)建API-Key)。完成后點(diǎn)擊“確定”按鈕,再點(diǎn)擊“下一步”按鈕。
圖片
填寫“應(yīng)用Id”(名為“賬單機(jī)器人”的百煉智能體編排應(yīng)用Id ),完成后點(diǎn)擊“下一步”按鈕。
圖片
填寫“連接流名稱”和“連接流描述”,完成后點(diǎn)擊“下一步”按鈕。
圖片
這個(gè)WebhookUrl地址,即為上文飛書應(yīng)用配置事件與回調(diào)的請(qǐng)求地址。點(diǎn)擊“發(fā)布”按鈕。
圖片
飛書
在飛書App左側(cè)菜單欄中選擇“工作臺(tái)”,點(diǎn)擊右上角“?設(shè)置”。
圖片
在我的工作臺(tái)中,點(diǎn)擊右上角的“添加應(yīng)用”按鈕,將剛創(chuàng)建的“阿里云賬單機(jī)器人”添加進(jìn)來(lái)。
圖片
點(diǎn)擊進(jìn)入阿里云賬單機(jī)器人。
圖片
發(fā)送“查詢1月阿里云花費(fèi)金額”,若機(jī)器人回答如下圖所示,說(shuō)明配置成功了。
圖片
小結(jié)
至此,阿里云賬單機(jī)器人配置完成。此外,借助AI技術(shù)的智能分析能力,機(jī)器人可進(jìn)一步挖掘賬單數(shù)據(jù)價(jià)值,優(yōu)化資源配置,助力企業(yè)降本增效,適應(yīng)數(shù)字化轉(zhuǎn)型需求。