Agent
AI Agent 被定义 3 个组成部分:规划(Planning) 记忆(Memory) 工具使用(Tool Use) 。
Planning
本人对于Agent的学习有所欠缺,目前以prompt的方式来引导LLM使用工具。
# 定义查询模版 prompt_template = '''你是一个可以回答任何问题的助手。 你可以使用下列工具: {tools}: 当你不确定答案时,你可以使用此工具。 {knowledge} 如果你认为工具与问题没什么相关度,你也可以直接用<final_answer></final_answer>标签来包裹答案。比如 <final_answer>XXX</final_answer> 请注意:你接收到的输入是语音识别的结果,有可能会有错字,但发音应该没错,你可能需要猜测输入的正确内容 开始任务: 问题: ''' knowledge的内容可以为: "为了使用这个工具,你必须用<tool></tool>和<tool_input></tool_input>标签。例如,如果您有一个名为“WeatherSearch" "”的工具,可以查询城市天气,为了搜索徐州是什么天气,你会返回:<tool>" "WeatherSearch</tool><tool_input>徐州</tool_input>使用工具后你会得到一个形式为<observation></observation" ">的响应,因此在第二轮你会得到输入为<tool>{" "tool1}</tool><tool_input>徐州</tool_input><observation>今日徐州的天气为XXX</observation>你需要判断<observation" "></observation>标签中的内容是不是你需要的答案。如果是最终答案final_answer,你需要返回答案:<final_answer>今日徐州的天气为XXX</final_answer>"
通过prompt来让LLM安装一定的格式回答问题,接下来通过对LLM回答的解析来调用相关的Agent完成任务
# run agent def run(self, request): prompt = self.prompt.format(tools=self.tool_prompt_desc, knowledge=rag(request)) + request while True: print(f"\033[32m正在分析内容...\033[0m") raw_response = sync_vivogpt(prompt) is_dict, response_dict = self.parsed_xml_response(raw_response) if not is_dict: try: response_dict = json.loads(raw_response) except json.JSONDecodeError: return response_dict if 'tool' not in response_dict or 'tool_input' not in response_dict: return "抱歉,语音助手无法解决你的任务" print(f"\033[32m使用工具:{response_dict['tool']}...\033[0m") print(f"\033[32m查询内容:{response_dict['tool_input']}...\033[0m") tool_name, search_input, search_result = self.run_tool(response_dict) prompt = self.prompt + f"<tool>{tool_name}</tool><tool_input>{search_input}</tool_input><observation>{search_result}</observation>" print(f"\033[32m查询到参考信息:{search_result[0:30]}...\033[0m")
在加了大量的逻辑判断保证LLM的回答符合规范后就可以安装LLM的回答调用相关工具(Agent)完成任务了。
Memory
RAG
RAG会受搜索引擎的上限影响,如果搜索引擎无法搜索到有效信息,LLM也无法准确回答问题。所以许多厂商开始卷长文本
RAG和微调都可以有效地改善LLM的表现。RAG的流程图如下:
RAGTool Use
语音
作为智能化的突出体现,AI Agent的最高水平应该是像iron man的贾维斯那样,让它做什么就可以做什么。有点像“言出法随”的感觉。其中语音模块就显得尤为重要,如何解放人的双手,值得研究。
语音转文字
如何识别用户已经说完一句话?
语音转文字需要完成的一个点:如何识别用户已经说完一句话。思想很简单,只要检测到在一定时间内不存在有效信息,就可以认为用户说完了。那么问题就转变为了如何判断语音中没有有效信息:
- 计算音频能量:检查音频数据的平均能量,如果低于某个阈值,则认为没有有意义的数据。
- 计算静音帧:计算连续静音帧的数量,如果超过一定数量,则认为不存在有意义的数据。
text2sql
当代互联网海量信息都存储在数据库中,如果能够让LLM读懂数据库,那么将极大扩充LLM的知识水平