当前位置:   article > 正文

开源模型应用落地-chatglm3-6b-function call-入门篇(六)_chatglm3 function call

chatglm3 function call

一、前言

    每个模型都有自己的限制,有些情况下它们无法满足复杂的业务需求。但是,可以通过一个外置函数的方式,例如:"Function Call",让开发者能够更加灵活地利用大型语言模型,帮助开发者在特定场景下解决问题。


二、术语

2.1、Function Call

     Function Call 是一项强大的功能,它允许开发者向模型提供不同的函数来执行特定的任务,根据用户的输入和要求。这些函数可以接受输入参数,并根据当前的任务提供相关的输出。


三、前置条件

3.1. windows or linux操作系统均可

3.2. 下载chatglm3-6b模型

从huggingface下载:https://huggingface.co/THUDM/chatglm3-6b/tree/main

从魔搭下载:魔搭社区汇聚各领域最先进的机器学习模型,提供模型探索体验、推理、训练、部署和应用的一站式服务。https://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/fileshttps://www.modelscope.cn/models/ZhipuAI/chatglm3-6b/files

 3.3. 创建虚拟环境&安装依赖

  1. conda create --name chatglm3 python=3.10
  2. conda activate chatglm3
  3. pip install protobuf transformers==4.39.3 cpm_kernels torch>=2.0 sentencepiece accelerate

四、技术实现

  1. # -*- coding = utf-8 -*-
  2. import traceback
  3. from transformers import AutoTokenizer, AutoModelForCausalLM
  4. modelPath = "/model/chatglm3-6b"
  5. def get_weather(region):
  6. low_region = region.lower()
  7. if 'guangzhou' == low_region:
  8. return '21 ~ 28℃ 多云 无持续风向<3级'
  9. elif 'shenzhen' == low_region:
  10. return '22 ~ 28℃ 晴 西南风3级'
  11. else:
  12. return '6 ~ 18℃ 晴 北风4级'
  13. funcList = {
  14. "weather": get_weather
  15. }
  16. def chat(model, tokenizer, message, history, system):
  17. messages = []
  18. if system is not None:
  19. messages.append(system)
  20. if history is not None:
  21. for his in history:
  22. user, assistant = his
  23. messages.append({"role": "user", "content": user})
  24. messages.append({"role": "assistant", 'metadata': '', "content": assistant})
  25. print(messages)
  26. try:
  27. response = model.chat(tokenizer, message, messages, max_length=2048, top_p=0.9, temperature=0.45, repetition_penalty=1.1, do_sample=True)
  28. return response
  29. except Exception:
  30. traceback.print_exc()
  31. def loadTokenizer():
  32. tokenizer = AutoTokenizer.from_pretrained(modelPath, use_fast=False, trust_remote_code=True)
  33. return tokenizer
  34. def loadModel():
  35. model = AutoModelForCausalLM.from_pretrained(modelPath, device_map="auto", trust_remote_code=True).cuda()
  36. model = model.eval()
  37. # print(model)
  38. return model
  39. def main():
  40. model = loadModel()
  41. tokenizer = loadTokenizer()
  42. message = "广州今天的天气如何?"
  43. history = []
  44. tools = [
  45. {'name': 'weather', 'description': '获取指定地区实时天气',
  46. 'parameters':
  47. {
  48. 'type': 'object',
  49. 'properties':
  50. {'region':
  51. {
  52. 'description': '待查询天气的区域'
  53. }
  54. },
  55. 'required': []
  56. }
  57. }
  58. ]
  59. system = {
  60. "role": "system",
  61. "content": "Answer the following questions as best as you can. You have access to the following tools:",
  62. "tools": tools
  63. }
  64. response,_ = chat(model, tokenizer, message, history, system)
  65. print(response)
  66. if 'name' not in response:
  67. print('本地方法名称没返回!')
  68. if 'parameters' not in response:
  69. print('本地方法参数没返回!')
  70. func_name = response['name']
  71. parameters = response['parameters']
  72. if 'region' not in parameters:
  73. print('地区参数没返回!')
  74. region = parameters['region']
  75. print(fun, region)
  76. if func_name in funcList:
  77. func = funcList[func_name]
  78. result = func(region)
  79. print(result)
  80. else:
  81. print(f'{func_name}方法不存在!')
  82. if __name__ == "__main__":
  83. main()

调用结果:


五、附带说明

5.1. 流程说明

1. 设置本地函数(实际业务可以是调第三方的API、查询数据库、查询缓存等逻辑)

  1. def get_weather(region):
  2. low_region = region.lower()
  3. if 'guangzhou' == low_region:
  4. return '21 ~ 28℃ 多云 无持续风向<3级'
  5. elif 'shenzhen' == low_region:
  6. return '22 ~ 28℃ 晴 西南风3级'
  7. else:
  8. return '6 ~ 18℃ 晴 北风4级'

2. 设置本地函数列表

  1. funcList = {
  2. "weather": get_weather
  3. }

示例只有一个本地函数,实际可以有N个

3. 设置本地函数的描述

  1. tools = [
  2. {'name': 'weather', 'description': '获取指定地区实时天气',
  3. 'parameters':
  4. {
  5. 'type': 'object',
  6. 'properties':
  7. {'region':
  8. {
  9. 'description': '待查询天气的区域'
  10. }
  11. },
  12. 'required': []
  13. }
  14. }
  15. ]

4. 在System Prompt中,指定可使用的本地函数库

  1. system = {
  2. "role": "system",
  3. "content": "Answer the following questions as best as you can. You have access to the following tools:",
  4. "tools": tools
  5. }

5. 模型调用,获取本地函数的方法名和参数列表

  1. response,_ = chat(model, tokenizer, message, history, system)
  2. print(response)
  3. if 'name' not in response:
  4. print('本地方法名称没返回!')
  5. if 'parameters' not in response:
  6. print('本地方法参数没返回!')
  7. func_name = response['name']
  8. parameters = response['parameters']
  9. if 'region' not in parameters:
  10. print('地区参数没返回!')
  11. region = parameters['region']

6. 本地函数调用

  1. if func_name in funcList:
  2. func = funcList[func_name]
  3. result = func(region)
  4. print(result)
  5. else:
  6. print(f'{func_name}方法不存在!')

7. 再次调用模型,对本地调用结果进行汇总加工处理(此处代码省略)

5.2. 优化地方

1. ChatGLM3推理返回的本地函数参数是“Guangzhou”,而Prompt提示语是:“广州今天的天气如何?”。两者之间是存在信息差,为此,可以优化的地方是:

    # 修改模型参数和System Prompt,让模型更准确返回我们所需要的格式

    # 在本地函数中,去判断输入的语种,当输入是中文的时候,可以转化成拼音或英文

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/951545
推荐阅读
相关标签
  

闽ICP备14008679号