intent.go 3.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. package compapi
  2. import (
  3. "wechat-api/internal/types"
  4. )
  5. type IntentClient struct {
  6. MismatchClient
  7. }
  8. func (me *IntentClient) ResponseFormatSetting(req *types.CompApiReq) ResponseFormatConfig {
  9. //Message重构的配置
  10. me.ResformatConfig.SysmesArgs = []any{} //以下SysmesTmpl内无替换占位符,所以这里为空
  11. me.ResformatConfig.SysmesTmpl = `# 任务
  12. 1. 首先,判断用户的第一句话是否说了:“你好,(任意内容)通话”,如果说了,则不用理会评级规则,直接强制分配为"语音助手"
  13. 2. 如果不属于“语音助手”,请根据评级规则,对聊天记录给出评级、置信度、评分依据(逐项分析不要遗漏)
  14. # 细节说明
  15. 置信度从0到1,0为置信度最低,1为置信度最高。`
  16. //来自请求的变量用来替换UsermesTmpl中的占位符
  17. me.ResformatConfig.UsermesArgs = []any{req.Variables["chat_history"]}
  18. me.ResformatConfig.UsermesTmpl = `# 评级规则:
  19. [
  20. {
  21. 'rule': "用户表现出对产品有积极回应,询问有关产品的问题,或愿意进行后续操作,如确认微信号、询问发货地址或表达接受产品(例:'行'、'好'、'可以'、'是的')。",
  22. 'score': '有意向'},
  23. {
  24. 'rule': "用户虽然未积极回应或表示不需要,但却有相关需求、或着符合某项购买条件、又或着询问了机器人问题,即便后期疲软或持否定态度,可移交销售顾问进行进一步的需求分析,以便改善产品或定制符合客户要求的产品",
  25. 'score': '待进一步分析'},
  26. {
  27. 'rule': "用户表示自己在忙、在开会等,现在不太方便沟通。又或者对电话的真实性存疑,怀疑是诈骗电话,可后续让专业客服继续跟进",
  28. 'score': '暂时无法沟通'},
  29. {
  30. 'rule': "除上述规则外的其他用户,包括:用户未回复直接挂机、用户拒绝后直接挂机的情况。请注意客户资源珍贵,请尽量归类为'有意向'或'待进一步分析',后续再由销售专家定性。",
  31. 'score': '其他'}
  32. ]
  33. # 聊天记录
  34. %s
  35. `
  36. //ResponseFormat设置的配置
  37. me.ResformatConfig.ResformatDesc = "为通话记录进行评级" //Resformat描述
  38. //非openai兼容大模型所使用的Resformat文本
  39. me.ResformatConfig.ResformatTxt = `{
  40. "score": str, #评分结果:有意向、待进一步分析、暂时无法沟通、其他
  41. "confidence_score": int, #置信度分数,范围从0.0到1.0
  42. "scoring_criteria": str, #请逐步介绍为何评为这个结果
  43. }`
  44. //openai兼容大模型所使用的Resformat结构或其他类型
  45. me.ResformatConfig.ResformatStruct = struct {
  46. Score string `json:"score" jsonschema_description:"评分结果:有意向、待进一步分析、暂时无法沟通、其他"`
  47. ConfidenceScore float32 `json:"confidence_score" jsonschema_description:"置信度分数,范围从0.0到1.0"`
  48. ScoringCriteria string `json:"scoring_criteria" jsonschema_description:"请逐步介绍为何评为这个结果"`
  49. }{}
  50. me.ResformatConfig.HaveSet = true //很关键,避免父类的参数再设置一遍
  51. return me.ResformatConfig
  52. }
  53. func (me *IntentClient) BuildRequest(req *types.CompApiReq) error {
  54. //设置相关个性化ResponseFormat配置信息
  55. if !me.ResformatConfig.HaveSet {
  56. me.ResponseFormatSetting(req)
  57. }
  58. return me.MismatchClient.BuildRequest(req)
  59. }
  60. // 向Client.getClientActFace工厂方法注册
  61. func init() {
  62. builder := func(c *Client) (clientActionFace, error) {
  63. return &IntentClient{MismatchClient{StdClient: StdClient{Client: c}}}, nil
  64. }
  65. err := RegisterClient("intent", builder)
  66. if err != nil {
  67. //panic(fmt.Sprintf("Failed to register client type 'mismatch': %v", err))
  68. }
  69. }