大模型Rag-指令調度

本文主要記錄根據用戶問題指令,基于大模型做Rag,匹配最相關描述集進行指令調度,可用于匹配后端接口以及展示答案及圖表等。

1.指令查詢處理邏輯

1.實現思路

  • 指令識別:主要根據用戶的問題q計算與指令描述集is = [i0, ... , im]和指令關鍵詞集ks = [k0, ... , km]之間的匹配距離sim,選取最匹配的指令,top1/top5

  • 用戶指令與指令描述集embedding向量匹配相似度

  • 關鍵詞處理:提取指令中的關鍵參數據,用戶的問題q計算與指令提示詞集ps = [p0, ... , pm],從用戶問題中抽取指令執行需要的參數集

2.指令查詢實現參數介紹

參數示例

{ attribute_ids: "[{"paramName":"項目名稱","paramCode":"prejectname","paramPrompt":"請提取出項目名稱","paramWeight":"0.4"}]", uni_key: "001", candidate_value: "科技園工人數量", name: "查詢科技園工人數量", description: "查詢科技園工人數量", tip_word: "", id: 2, keyword: "科技園,工人,數量", instruction_id: 2 }

參數代表含義

"attribute_ids": 屬性值

"uni_key": 參數編碼 示例:projectname

"candidate_value": 候選值

"name": "查詢科技園工人數量"

"description": "查詢科技園工人數量"

"tip_word": "",參數不全提示詞

"id": 2,

"keyword": 關鍵詞,

"instruction_id": 2?

3.指令查詢實現細節

這一部分主要對指令描述集和指令關鍵詞集的處理,針對參數為id,description,keyword

指令識別,主要根據用戶的問題q計算與指令描述集is = [i0, ... , im]和指令關鍵詞集ks = [k0, ... , km]之間的匹配距離sim

存儲在在self.INSTTS中,記錄id,指令描述集description,指令關鍵詞集keyword,示例如下

# 提取內容
ists = jsonobj["data"]
for ist in ists:cid = ist["id"]cdes = ist["description"]ckws = ist["keyword"]self.INSTTS.append((cid, cdes, ckws))# self.INSTTS值
self.INSTTS = [(2, '查詢科技園工人數量', '科技園,工人,數量'), (4, '查詢3月份營業額', 營業額'), (5, '打開百度首頁', '打開,百度'), (6, '查詢某項目某地區某段時間的營業額', '查詢,項目,地區,營業額'),  (7, '請幫我打開智慧工地指揮中心', '打開,智慧工地,指揮中心'), (8, '打開數據標注', '打開,數據標注'), (9, '測試表格指令', '輸出,測試表格'), (10, '查詢七日氣溫', '查詢,氣溫'), (12, '測試折線圖', '測試折線圖'), (13, '測試餅圖', '測試餅圖'), (14, '測試柱狀圖', '測試柱狀圖')]

指令描述集向量化,記錄id2des,id2kws

self.id2key:記錄編號和id,用于后續查詢

self.id2des: 記錄id和des指令描述,用于向量化

self.id2kws: 記錄id和kws關鍵詞,用于計算用戶query和關鍵詞相似度

num0 = 0
for record in self.INSTTS:_id = record[0]_des = record[1]_kws = record[2]d_embeddings = self.model.encode([self.instruction + _des], normalize_embeddings=True)self.index.add(d_embeddings)self.i2key[num0] = _idself.id2des[_id] = _desself.id2kws[_id] = _kwsnum0 += 1

4.屬性查詢實現細節

這一部分主要針對指令,對應參數為tip_word:參數不全提示詞,attribute_ids:屬性值的處理,其中attribute_ids的參數示例如下

attribute_ids: "[{"paramName":"項目名稱","paramCode":"prejectname","paramPrompt":"請提取出項目名稱","paramWeight":"0.4"}]",

參數代表意思解析

attribute_ids: "[{ "paramName":"項目名稱", "paramCode":"prejectname", "paramPrompt":"請提取出項目名稱", # 需要提取的內容 "paramWeight":"0.4"}]" # 參數權重

參數的存儲,記錄TIPSINFOS,cvalue,PARAMINFOS

self.TIPSINFOS:記錄id和tip_word,后續用于根據id提取對應參數

cvalue: 記錄paramName, paramCode, paramPrompt, paramWeight

self.PARAMINFOS:記錄id和cvalue

jsonobj = json.loads(response.text)
params = jsonobj["data"]
for param in params:print(param)cid = param["id"]if "tip_word" in param:tip_word = param["tip_word"]self.TIPSINFOS[cid] = tip_wordcvalue = []if "attribute_ids" in param and len(param["attribute_ids"])>0:attrs = json.loads(param["attribute_ids"])for attr in attrs:paramName = attr["paramName"]paramCode = attr["paramCode"]paramPrompt = attr["paramPrompt"]paramWeight = attr["paramWeight"]if len(paramName)>0 and len(paramCode)>0 and len(paramPrompt)>0 and len(paramWeight)>0 :cvalue.append((paramName, paramCode, paramPrompt, paramWeight))print(cid, paramName, paramCode, paramPrompt, paramWeight)self.PARAMINFOS[cid] = cvalue

2.用戶指令與指令描述集處理

1.計算用戶指令與指令描述集相似度,選取topk

  • 整體代碼

question:用戶指令問題

k:topk選取

theata:相似度閾值

def find_vec2(self, question, k, theata):print(question)q_embeddings = self.model.encode([self.instruction + question], normalize_embeddings=True)# print(q_embeddings)D, I = self.index.search(q_embeddings, k)  # v為待檢索向量,返回的I為每個待檢索query最相似TopK的索引list,D為其對應的距離result = []for i in range(k):sort_k = i + 1sim_i = I[0][i]uuid = self.i2key.get(sim_i, "none")sim_v = D[0][i]midkws = self.id2kws.get(uuid, "none")score = self.calculate_score(sim_v, question, midkws)  # 計算得分if score < theata:doc = {}doc["score"] = scoredoc["action_id"] = uuidresult.append(doc)return result

uuid = self.i2key.get(sim_i, "none"): 根據編號查詢id

midkws = self.id2kws.get(uuid, "none"): 根據id查詢kws關鍵詞

  • 進一步計算相似度

score = self.calculate_score(sim_v, question, midkws) :根據sim_v向量得分,question用戶指令問題,midkws,kws關鍵詞進一步計算匹配度得分

def calculate_score(self, score, question, kws):if kws == "none" or kws == "":return int(score * 1000)else:ckws = kws.split(",")chit = 0for kw in ckws:if question.find(kw) > -1:      # 檢測問題中是否包含關鍵詞chit += 1# print(score, chit, question, kws)return int(score * 1000) - 100 * chit

2.加載指令候選參數

如果命中指令,提取指令候選參數

self.TIPSINFOS: 參數不全提示詞

self.PARAMINFOS:參數屬性信息

optstr = self.TIPSINFOS.get(action_id, "指令參數不全。")   # 通過action_id獲取參數不全提示詞
cur_parms = self.PARAMINFOS.get(action_id, [])  # 通過action_id獲取屬性信息

3.依據大模型判斷是否參數不全

沒有參數不全提取任務

如果cur_parms的長度為0,證明沒有判斷參數不全的任務,直接返回結果

self.SUCCESS_SIGN:參數提前標志,默認為1,代表成功(沒有參數提取任務也設置為1)

self.EMPTY_PARMS: 缺失參數字符,默認為空字符串

self.MISS_VALUE:缺失字符,默認為空字符串

if len(cur_parms) == 0:return self.SUCCESS_SIGN, self.EMPTY_PARMS, self.MISS_VALUE

有參數不全提取任務

  • datestr = time.strftime("%Y%m%d", time.localtime())
    parmnames = []
    for cp in cur_parms:parmnames.append(cp[0])
    parmnames_str = "、".join(parmnames)
    newquestion1 = "問題:'" + "我想查看" + question + "'\n" + \"假設今天是" + datestr + ",請根據以上問題,提取"+parmnames_str+",要求:\n"
    for n1 in range(len(cur_parms)):record = str(n1+1) + "、" + cur_parms[n1][2] + ";\n"newquestion1 = newquestion1 + recordnewquestion1 = newquestion1 + "請以JSON格式輸出,要求:\n"
    for n1 in range(len(cur_parms)):record = str(n1+1) + "、" + cur_parms[n1][0] + "用" + cur_parms[n1][1] + "表示;\n"newquestion1 = newquestion1 + recordprint(newquestion1)rststr = self.excute_prompt(str(newquestion1)) # 訪問星火大模型

    封裝提示詞給大模型

示例 newquestion1值

這個示例中,問題為我想查看打開百度,經過屬性信息將要提取的參數封裝到prompt提示詞中

"問題:'我想查看打開百度' 假設今天是20250417,請根據以上問題,提取項目名稱,要求: 1、請提取出項目名稱; 請以JSON格式輸出,要求: 1、項目名稱用projectname表示; "

訪問大模型之后的rststr值

'```json

{

"projectname": "查看打開百度"

}

```'

參數不全處理邏輯

默認設置參數缺失

這里cur_parms=[('項目名稱', 'projectname', '請提取出項目名稱', '0.4')],

默認設置miss_value中每一個參數都是缺失的

keywords_value = []
for cp in cur_parms:keywords_value.append(cp[1])
miss_value = {key: '1' for key in keywords_value}

4.參數不全處理

這里使用的星火大模型,模型返回的結果中,如果參數不全,會出現"由于問題中"的提示字符,這里通過它進行判斷,如果要提取的參數key在大模型返回的結果中,則設置miss_value[key] = '0',表示該參數key不缺失,例如miss_value={'projectname': '0'}代表projectname不缺失。

if "由于問題中" in rststr:# rst = {key: '' for key in keywords_value}rststr = self.excute_prompt(str(newquestion1))if "由于問題中" in rststr:rststr = self.excute_prompt(str(newquestion1))if "由于問題中" in rststr:return self.PARAMTER_PARTIAL, optstr, miss_valueelse:for key in keywords_value:if key in rststr:miss_value[key] = '0'else:for key in keywords_value:if key in rststr:miss_value[key] = '0'
else:for key in keywords_value:if key in rststr:miss_value[key] = '0'
# 打印結果
print(miss_value)

5.解析大模型返回的參數

sindex = rststr.find("{")
eindex = rststr.find("}")
print(sindex, eindex)
if sindex == -1 and eindex == -1:return self.PARAMTER_PARTIAL, optstr, miss_valuerststrjson = rststr[sindex:eindex + 1]
print(rststrjson)
rststrjson = rststrjson.replace("'", "\"")
print(rststrjson)rst = {}
rstjson = json.loads(rststrjson)
n = len(cur_parms)
# rst = json.dumps(rst)

6.計算相似度

  • 根據大模型返回參數和配置的參數計算相似度

    for n1 in range(len(cur_parms)):midcode = cur_parms[n1][1]midtheta = 0.4try:midtheta = float(cur_parms[n1][3])except:passprint(midcode, midtheta)if midcode in rstjson:midvalue = rstjson[midcode]if midtheta > 0.0:msim, mval = self.search.match_parameter(action_id, midcode, midvalue, theata=midtheta)if msim > 0:rst[midcode] = mvalelse:  # 查詢的項目名稱與參數完全不同print("msim is 0.0.")rst[midcode] = ''miss_value[midcode] = '1'n-=1continue# return self.FAILED_SIGN, json.dumps(rst), miss_valueelse:print("midtheta is 0.0.")rst[midcode] = midvalueelse:print(midcode, " not in ", rstjson)rst["optstr"] = optstrreturn self.FAILED_SIGN, json.dumps(rst), miss_value
    print(rst)
    if n != len(cur_parms):rst["optstr"] = optstrreturn self.FAILED_SIGN, json.dumps(rst), miss_value
    return self.SUCCESS_SIGN, json.dumps(rst), miss_value
  • 參數相似度計算,找到最相似的參數

    def match_parameter(self, action_id, uni_key, parm, theata=0.4):midkey = str(action_id) + "_" + uni_key# 存儲參數parm中的元素cwds = {}for i in range(len(parm)):cwds[parm[i]] = ""rstsim = 0.0    # 初始化相似度結果為0.0rstsss = ""     # 初始化最匹配的候選值為空字符串"""# 遍歷 self.PARAMS 字典中以 midkey 為鍵的所有候選值及其拆分后的字典表示# sss 表示候選值,wds 表示候選值拆分后的字典"""for sss, wds in self.PARAMS[midkey].items():# print(sss, wds)csim = self.sim_parameter(cwds, wds)    # 計算輸入的cwds 與 庫里的 wds相似度# 如果相似度csim大于預先設定的theata閾值,并且相似度csim大于之前設定的最大相似度rstsimif csim >= theata and csim > rstsim:# 更新最大相似度為當前相似度rstsim = csim# 更新最匹配的候選值為當前候選值rstsss = sss# 打印匹配結果,包括輸入參數、相似度(保留三位小數)、最匹配的候選值和閾值print("match_parameter --- ", parm, round(rstsim, 3), rstsss, theata)# 返回最大相似度和最匹配的候選值return rstsim, rstsss
  • 計算交并比

def sim_parameter(self, parm1, parm2):union_ws = {}join_ws = {}for w1 in parm1.keys():union_ws[w1] = ""if w1 in parm2:join_ws[w1] = ""for w2 in parm2.keys():union_ws[w2] = ""return 1.0 * len(join_ws.keys()) / len(union_ws.keys())

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/79413.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/79413.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/79413.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

音視頻學習 - ffmpeg 編譯與調試

編譯 環境 macOS Ventrua 13.4 ffmpeg 7.7.1 Visual Studio Code Version: 1.99.0 (Universal) 操作 FFmpeg 下載源碼 $ cd ffmpeg-x.y.z $ ./configure nasm/yasm not found or too old. Use --disable-x86asm for a crippled build.If you think configure made a mistake…

golang-常見的語法錯誤

https://juejin.cn/post/6923477800041054221 看這篇文章 Golang 基礎面試高頻題詳細解析【第一版】來啦&#xff5e; 大叔說碼 for-range的坑 func main() { slice : []int{0, 1, 2, 3} m : make(map[int]*int) for key, val : range slice {m[key] &val }for k, v : …

音視頻之H.265/HEVC預測編碼

H.265/HEVC系列文章&#xff1a; 1、音視頻之H.265/HEVC編碼框架及編碼視頻格式 2、音視頻之H.265碼流分析及解析 3、音視頻之H.265/HEVC預測編碼 預測編碼是視頻編碼中的核心技術之一。對于視頻信號來說&#xff0c;一幅圖像內鄰近像素之間有著較強的空間相關性,相鄰圖像之…

基于政務問答的dify接口請求測試

Dify 的智能體后端服務 API 為開發者提供便捷方式&#xff0c;能讓前端應用直接調用大語言模型能力。在請求時&#xff0c;需先前往應用左側導航的 “API Access” 部分&#xff0c;在此可查看文檔和管理訪問憑據。為保障安全&#xff0c;API 密鑰應通過后端調用&#xff0c;避…

VMware Workstation 保姆級 Linux(CentOS) 創建教程(附 iso)

文章目錄 一、下載二、創建 一、下載 CentOS-7.9-x86_64-DVD-2009.iso 二、創建 VMware Workstation 保姆級安裝教程(附安裝包) VMware Workstation 保姆級安裝教程(附安裝包) VMware Workstation 保姆級安裝教程(附安裝包)

擴增子分析|基于R語言microeco包進行微生物群落網絡分析(network網絡、Zi-Pi關鍵物種和subnet子網絡圖)

一、引言 microeco包是福建農林大學姚敏杰教授團隊開發的擴增子測序集成分析。該包綜合了擴增子測序下游分析的多種功能包括群落組成、多樣性、網絡分析、零模型等等。通過簡單的幾行代碼可實現復雜的分析。因此&#xff0c;microeco包發表以來被學界廣泛關注&#xff0c;截止2…

GO語言-數據類型

文章目錄 變量定義1. 整數類型2. 浮點類型3. 字符類型4. 布爾類型5. 字符串類型5.1 字符串的本質5.2 常用字符串處理函數(strings包)5.3 修改字符串的方式 6. 數據默認值7. 類型轉換 變量定義 代碼如下&#xff1a; package mainimport "fmt"var i1 1000 var i2 i…

線性代數 | 知識點整理 Ref 2

注&#xff1a;本文為 “線性代數 | 知識點整理” 相關文章合輯。 因 csdn 篇幅合并超限分篇連載&#xff0c;本篇為 Ref 2。 略作重排&#xff0c;未整理去重。 圖片清晰度限于引文原狀。 如有內容異常&#xff0c;請看原文。 【數學】線性代數知識點總結 阿巴 Jun 于 2024-…

JavaSE學習(前端初體驗)

文章目錄 前言一、準備環境二、創建站點&#xff08;創建一個文件夾&#xff09;三、將站點部署到編寫器中四、VScode實用小設置五、案例展示 前言 首先了解前端三件套&#xff1a;HTML、CSS、JS HTML&#xff1a;超文本標記語言、框架層、描述數據的&#xff1b; CSS&#xf…

java + spring boot + mybatis 通過時間段進行查詢

前端傳來的只有日期內容&#xff0c;如&#xff1a;2025-04-17 需要在日期內容的基礎上補充時間部分&#xff0c;代碼示例&#xff1a; /*** 日志查詢&#xff08;分頁查詢&#xff09;* param recordLogQueryDTO 查詢參數對象* return 日志列表*/Overridepublic PageBean<…

解決ubuntu自帶火狐瀏覽器無法播放視頻問題

TIPS:一般執行完1 就可以了 首先安裝必要的媒體編解碼器和插件&#xff1a; # 安裝常用媒體編解碼器和插件 sudo apt update sudo apt install -y ubuntu-restricted-extras# 安裝額外的編解碼器 sudo apt install -y ffmpeg# 安裝其他視頻相關包 sudo apt install -y libavc…

計算機網絡:流量控制與可靠傳輸機制

目錄 基本概念 流量控制&#xff1a;別噎著啦&#xff01; 可靠傳輸&#xff1a;快遞必達服務 傳輸差錯&#xff1a;現實中的意外 滑動窗口 基本概念 換句話說&#xff1a;批量發貨排隊驗收 停止-等待協議 SW&#xff08;發1份等1份&#xff09; 超時重傳&#xff1a;…

Android組件刷新

Android中刷新View的方法有以下幾種&#xff1a; 調用invalidate()方法&#xff0c;該方法會使View樹中的所有視圖無效或臟&#xff0c;等待下一次繪制時重新繪制。例如&#xff1a; mCustomView.invalidate(); 調用postInvalidate()方法&#xff0c;該方法類似于invalidate()…

Pycharm(十四)函數

一、函數概述 函數也叫方法,可以用function(函數,功能),method(方法)來表示。函數是把具有獨立功能的代碼封裝到一起,使其成為具有獨立功能的代碼集。 它的好處:1.提高代碼的復用性;2.模塊化編程。 1.1 定義格式 def 函數名(形式參數1,形式參數2...): 函數體,就是邏…

Oracle測試題目及筆記(多選)

所有題目來自于互聯網搜索 在以下概要文件的陳述中&#xff0c;哪兩個是正確的&#xff1f; &#xff08;D 和 E&#xff09; A&#xff0e; 概要文件不能被用來為賬戶加鎖 B&#xff0e; 概要文件不能被用來控制資源使用 C&#xff0e; 數據庫管理員可以使用概要文件更改用戶密…

DDoS攻防實戰指南——解析企業級防護五大解決方案

一、流量清洗中心的智能化演進 云清洗服務已從被動響應轉向主動防御。基于全球Anycast網絡的分布式清洗節點&#xff0c;可在攻擊發生時將流量牽引至專用清洗集群。阿里云2023年實測數據顯示&#xff0c;其新一代清洗設備對SYN Flood的識別準確率達99.97%&#xff0c;誤殺率控…

Ubuntu多用戶VNC遠程桌面環境搭建:從零開始的完整指南

引言: 在當今遠程工作盛行的時代,搭建一個安全、高效的多用戶遠程桌面環境變得越來越重要。本文將為您提供一個從零開始的完整指南,教您如何在Ubuntu系統上搭建多用戶VNC遠程桌面環境。無論您是系統管理員、開發團隊負責人,還是想要為家庭成員提供遠程訪問的技術愛好者,這…

數據結構專題 - 線性表

線性表是數據結構中最基礎、最常用的數據結構之一&#xff0c;它在實際應用中非常廣泛。無論是操作系統中的內存管理&#xff0c;還是數據庫中的索引結構&#xff0c;線性表都扮演著重要角色。 一、線性表的概念與抽象數據類型 1.1 線性表的邏輯結構 線性表是由n&#xff08…

使用wpa_cli和wpa_supplicant配置Liunx開發板的wlan0無線網

目錄 1 簡單介紹下wpa_cli和wpa_supplicant 1.1 wpa_supplicant 簡介 1.2 wpa_cli 簡介 1.3 它們之間的關系 2 啟動wpa_supplicant 3 使用rz工具把wpa_cli命令上傳到開發板 4 用wpa_cli配置網絡 參考文獻&#xff1a; 1 簡單介紹下wpa_cli和wpa_supplicant 1.1 wpa_su…

篩選條件在on和where中的區別(基于hivesql)

理解篩選條件在on和where中的區別&#xff0c;最好先理解sql的執行順序&#xff0c;盡管實際執行時不同的物理執行引擎可能會有特定的優化&#xff0c;但是邏輯執行順序必須遵循&#xff1a; 1&#xff09;from&#xff1a;確定數據源是什么&#xff0c;from后可以是單表&#…