1.意图识别
2. 构建路由模块
简单的意图识别
from chatbot import llm
from config.load_key import load_key
load_key()
prompt = '''
【角色背景】
你是一个问题分类路由器,需要识别问题的类型。
---
【任务要求】
问题的类型目前有:公司内部文档查询、内容翻译、文档审查
你只能选择一类意图作为你的判断,并不要说任何无关内容。
---
【用户输入】
以下是用户输入,请判断:
'''
def get_question_type(question):
"""
获取问题的类型
参数:
- question (str): 需要判断的问题文本
返回值:
- str: 问题类型,可能是 "文档审查" 、 "内容翻译"或“公司内部文档查询”
"""
return llm.invoke(prompt + question)
print(get_question_type('https://www.promptingguide.ai/zh/techniques/fewshot'))
print('\n')
print(get_question_type('That is a big one I dont know why'))
print('\n')
print(get_question_type('作为技术内容工程师有什么需要注意的吗?'))
运行后发现,其实第一个问题是想问“文档审查”,但结果却是“内容翻译”。
2.1 优化策略:
我们可以利用提示词工程优化意图识别效果
路径:应用组件 - Prompt 工程
提示词自动优化工具
通用技巧: 提示词工程指南
少量样本提示((Few-Shot Prompting)
链式思考(Chain-of-Thought Prompting)
ReACT框架(Reason-Act)
明确输出格式:指定输出格式,使分类结果规范且易于解析。
Few-shot 示例:提供示例,帮助大模型理解每个类别的特征和分类规则。
from chatbot import llm
from config.load_key import load_key
load_key()
prompt = '''
【角色背景】
你是一个问题分类路由器,负责判断用户问题的类型,并将其归入下列三类之一:
1. 公司内部文档查询
2. 内容翻译
3. 文档审查
【任务要求】
你的任务是根据用户的输入内容,判断其意图并仅选择一个最贴切的分类。请仅输出分类名称,不需要多余的解释。判断依据如下:
- 如果问题涉及公司政策、流程、内部工具或职位描述与职责等内容,选择“公司内部文档查询”。
- 如果问题涉及任意一门非中文的语言,且输入中没有任何出现任何外语或出现“翻译”等字眼,选择“内容翻译”。
- 如果问题涉及检查或总结外部文档或链接内容,选择“文档审查”。
- 用户的前后输入与问题分类并没有任何关系,请单独为每次对话考虑分类类别。
【Few-shot 示例】
示例1:用户输入:“公司内部有哪些常用的项目管理工具?”
分类:公司内部文档查询
示例2:用户输入:“How can we finish the assignment on time?”
分类:内容翻译
示例3:用户输入:“https://help.aliyun.com/zh/model-studio/user-guide/long-context-qwen-long”
分类:文档审查
示例4:用户输入:“技术内容工程师需要设计和开发⾼质量的教育教材和课程吗?”
分类:文档审查
示例5:用户输入:“技术内容工程师核心职责是什么?”
分类:公司内部文档查询
【用户输入】
以下是用户的输入,请判断分类:
'''
def get_question_type(question):
"""
获取问题的类型
参数:
- question (str): 需要判断的问题文本
返回值:
- str: 问题类型,可能是 "文档审查" 、 "内容翻译"或“公司内部文档查询”
"""
return llm.invoke(prompt + question)
print(get_question_type('https://www.promptingguide.ai/zh/techniques/fewshot'))
print('\n')
print(get_question_type('That is a big one I dont know why'))
print('\n')
print(get_question_type('作为技术内容工程师有什么需要注意的吗?'))
优化后可以看出第一个问题的意图识别出来,是“文档审查”。
3. 文档自动审阅和修改
结合上面的意图识别,我们可以扩展对应的功能。
1.对内容进行文档审查。利用大语言模型可以进行网页审查。
2.利用RAG,查询企业内部信息。
3.翻译,大语言模型自带翻译功能。
from chatbot import rag
from chatbot import llm
from config.load_key import load_key
load_key()
# 加载索引并设置query engine
query_engine = rag.create_query_engine(index=rag.load_index())
prompt = '''
【角色背景】
你是一个问题分类路由器,负责判断用户问题的类型,并将其归入下列三类之一:
1. 公司内部文档查询
2. 内容翻译
3. 文档审查
【任务要求】
你的任务是根据用户的输入内容,判断其意图并仅选择一个最贴切的分类。请仅输出分类名称,不需要多余的解释。判断依据如下:
- 如果问题涉及公司政策、流程、内部工具或职位描述与职责等内容,选择“公司内部文档查询”。
- 如果问题涉及任意一门非中文的语言,且输入中没有任何出现任何外语或出现“翻译”等字眼,选择“内容翻译”。
- 如果问题涉及检查或总结外部文档或链接内容,选择“文档审查”。
- 用户的前后输入与问题分类并没有任何关系,请单独为每次对话考虑分类类别。
【Few-shot 示例】
示例1:用户输入:“公司内部有哪些常用的项目管理工具?”
分类:公司内部文档查询
示例2:用户输入:“How can we finish the assignment on time?”
分类:内容翻译
示例3:用户输入:“https://help.aliyun.com/zh/model-studio/user-guide/long-context-qwen-long”
分类:文档审查
示例4:用户输入:“技术内容工程师需要设计和开发⾼质量的教育教材和课程吗?”
分类:文档审查
示例5:用户输入:“技术内容工程师核心职责是什么?”
分类:公司内部文档查询
【用户输入】
以下是用户的输入,请判断分类:
'''
def get_question_type(question):
"""
获取问题的类型
参数:
- question (str): 需要判断的问题文本
返回值:
- str: 问题类型,可能是 "文档审查" 、 "内容翻译"或“公司内部文档查询”
"""
return llm.invoke(prompt + question)
def ask_v4(question):
question_type = get_question_type(question)
print(f'问题:{question}\n类型:{question_type}')
if question_type == '文档审查':
return llm.invoke('你是文档纠错专家,负责找出文档中或网页内容的明显错误,并且言简意赅的回复。如果没有明显问题,请直接回复没有问题\n' + question)
elif question_type == '公司内部文档查询':
return rag.ask(question, query_engine=query_engine)
elif question_type == '内容翻译':
return llm.invoke(f'你是一名翻译专家,你要识别不同语言的文本,并翻译为中文。\n{question}')
else:
return "未能识别问题类型,请重新输入。"
if __name__ == "__main__":
print(ask_v4('https://www.promptingguide.ai/zh/techniques/fewshot'))
print('')
print(ask_v4('请帮我检查下这段文档:技术内容工程师有需要进行内容优化与更新与跨部门合作吗?'))
print('')
print(ask_v4('技术内容工程师有需要进行内容优化与更新与跨部门合作吗?'))
print('')
print(ask_v4('A true master always carries the heart of a student.'))
上面代码已经完成了大部分工作,但第一个问题识别成“文档审查”,如何优化,其实也是老套路。
在提示词多加一个实例
示例6:用户输入:“请帮我检查下这段文档:技术内容工程师核心职责是什么?”
分类:公司内部文档查询
再运行一下代码
发现这次结果就正确了。
总结
在这文章了,我们实现了一个小小的大语言agent功能,相对于Assistants一些工具类,我更喜欢重新用大语言去进行意图识别,因为还能进行多意图识别,并按顺序返回并按顺序执行任务。 当然,也可以借助类似Dify这些智能体流程编排。