大模型意图选择
大模型意图识别
一、意图识别传统方法
过去为了识别用户意图,可以使用训练的方式,或者使用prompt
1.1 微调大模型识别指令
1.2 通过prompt指导大模型识别指令
可以使用如下prompt:
1 | ### 背景 |
使用qwen-14b-chat
模型,有如下回答:
1 | { action: 'call', api: 1, params:['', '', '麻辣烫']} 回复语句: 好的,我已经帮您下单了一份麻辣烫,请注意查收。 |
使用hunyuan-13b
模型,有如下回答:
1 | { action: 'call', api: 1, params:['', '', '麻辣烫'] } |
使用gpt-4o
模型,有如下回答
1 | 答案:{ action: 'call', api: 1, params: ['', '麻辣烫']} |
使用GPT-4
模型,有如下回答:
1 | 答案:{action: 'call', api: 1, params:['', '', '麻辣烫']} |
也可以按如下方式:
1 | 现在有函数的描述: |
返回如下:
1 | 您好!根据您的需求,您应该选择第一个函数,即 get_flight_number。以下是函数对应的参数以 JSON 格式返回: |
二、结合langchain llm路由识别意图
在langchain中,RouterChain是根据输入动态的选择下一个链,每条链处理特定类型的输入。
RouterChain由两个组件组成:
1)路由器链本身,负责选择要调用的下一个链,主要有2种RouterChain,其中LLMRouterChain通过LLM进行路由决策,EmbeddingRouterChain 通过向量搜索的方式进行路由决策。
2)目标链列表,路由器链可以路由到的子链。
2.1 利用LLM进行路由
llm路由流程:
- 创建多个Prompt,利用MULTI_PROMPT_ROUTER_TEMPLATE.format()方法得到router_template。
- 再利用PromptTemplate得到router_prompt
- 利用LLMRouterChain.from_llm(llm, router_prompt)就得到router_chain。
- 最后使用MultiPromptChain(),得到调用chain。
具体代码可见:
1 | from langchain.chains.router import MultiPromptChain |
输出日志如下,经测试,通义千问和openai可以
1 | router_template= Given a raw text input to a language model select the model prompt best suited for the input. You will be given the names of the available prompts and a description of what the prompt is best suited for. You may also revise the original input if you think that revising it will ultimately lead to a better response from the language model. |
2.2 利用embeddings进行路由
利用embeddings,进行路由
- 创建names_and_descriptions 。
- 利用EmbeddingRouterChain.from_names_and_descriptions()得到router_chain。
- 最后使用MultiPromptChain(),得到调用chain。
具体代码可见
1 | import os |
三、意图识别新方法:Function Call
gpt中的function call可以让开发者在调用 GPT-4 和 GPT-3.5-turbo 模型时,描述函数并让模型智能地输出一个包含调用这些函数所需参数的 JSON 对象。这种功能可以更可靠地将 GPT 的能力与外部工具和 API 进行连接,从而实现以下应用:
- 创建聊天机器人:开发者可以通过调用外部工具,如 ChatGPT 插件,回答问题,或者将查询「北京的天气如何?」转换为调用 getCurrentWeather(location: string) 的函数。
- 将自然语言转换为 API 调用或数据库查询:例如,将查询「这个月我的前十个客户是谁?」转换为调用 get_customers_by_revenue(start_date, end_date, limit) 的内部 API 调用,或者将查询「上个月 Acme 公司下了多少订单?」转换为使用 sql_query(query)的 SQL 查询。
从文本中提取结构化数据:开发者可以定义一个名为 extract_people_data(people) 的函数,以提取在维基百科文章中提到的所有人物。
Function call,就是通过大模型选择函数以及获取函数的参数。当前ChatGLM3和llama3都支持了function call
3.1 LLM function call训练
训练数据格式如下:
1 | <|system|> |
3.2 使用llm function
- 使用functions字段插入function_call函数。设置functions字段已经设置
function_call
为auto
,让大模型自己选择是否要使用functions
1 | full_response = "" |
返回如下:
1 | input: 你好 |
- 使用tools方式使用function_call
1 | tools = [ |
返回如下:
1 | input: 你好 |
参考
- chatglm3 微调function call: https://blog.csdn.net/qq_35812205/article/details/135724834
- langchain 中文网 embeddingchain https://python.langchain.com.cn/docs/modules/chains/foundational/router
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 爱开源GoGo!