之前将ChatGLM6B模型下载到本地运行起来了:ChatGLM3-6B上手体验;如果想要用在项目中,那么可以使用API调用的方式进行操作,尤其当你的项目还是不同语言的异构的场景下,其他服务需要调用的时候就可以直接通过请求服务来获取了。
1.运行API模式
ChatGLM3-6B的官方代码里有运行API的bat文件,可以直接点击运行即可,如果在Linux系统或者通过docker部署的方式运行,可以运行openai_api_demo目录下的 openai_api.py文件。
模型默认运行在8000端口
2.接口介绍
接口url :http://127.0.0.1:8000/v1/chat/completions
请求参数:
"functions": functions, # 函数定义"model": model, # 模型名称"messages": messages, # 会话历史"stream": use_stream, # 是否流式响应"max_tokens": 100, # 最多生成字数"temperature": 0.8, # 温度"top_p": 0.8, # 采样概率
请求的方式有流式和非流式请求,对应请求参数中stream的True和False,请求方式的处理可以参照官方给出的方法
import requests
import jsonbase_url = "http://127.0.0.1:8000"def create_chat_completion(model, messages, functions, use_stream=False):data = {"functions": functions, # 函数定义"model": model, # 模型名称"messages": messages, # 会话历史"stream": use_stream, # 是否流式响应"max_tokens": 100, # 最多生成字数"temperature": 0.8, # 温度"top_p": 0.8, # 采样概率}response = requests.post(f"{base_url}/v1/chat/completions", json=data, stream=use_stream)if response.status_code == 200:if use_stream:# 处理流式响应for line in response.iter_lines():if line:decoded_line = line.decode('utf-8')[6:]try:response_json = json.loads(decoded_line)content = response_json.get("choices", [{}])[0].get("delta", {}).get("content", "")print(content)except:print("Special Token:", decoded_line)else:# 处理非流式响应decoded_line = response.json()content = decoded_line.get("choices", [{}])[0].get("message", "").get("content", "")print(content)else:print("Error:", response.status_code)return None
3.不同的调用方式
ChatGLM3支持工具调用,api接口也支持了这一特性
- 简单对话
def simple_chat(use_stream=True):functions = Nonechat_messages = [{"role": "system","content": "You are ChatGLM3, a large language model trained by Zhipu.AI. Follow the user's instructions carefully. Respond using markdown.",},{"role": "user","content": "你好,给我讲一个故事,大概100字"}]create_chat_completion("chatglm3-6b", messages=chat_messages, functions=functions, use_stream=use_stream)
- 工具调用
def function_chat(use_stream=True):functions = [{"name": "get_current_weather","description": "Get the current weather in a given location.","parameters": {"type": "object","properties": {"location": {"type": "string","description": "The city and state, e.g. Beijing",},"unit": {"type": "string", "enum": ["celsius", "fahrenheit"]},},"required": ["location"],},}]chat_messages = [{"role": "user","content": "波士顿天气如何?",},{"role": "assistant","content": "get_current_weather\n ```python\ntool_call(location='Beijing', unit='celsius')\n```","function_call": {"name": "get_current_weather","arguments": '{"location": "Beijing", "unit": "celsius"}',},},{"role": "function","name": "get_current_weather","content": '{"temperature": "12", "unit": "celsius", "description": "Sunny"}',},# ... 接下来这段是 assistant 的回复和用户的回复。# {# "role": "assistant",# "content": "根据最新的天气预报,目前北京的天气情况是晴朗的,温度为12摄氏度。",# },# {# "role": "user",# "content": "谢谢",# }]create_chat_completion("chatglm3-6b", messages=chat_messages, functions=functions, use_stream=use_stream)
- 命令行调用测试
def chatincmd(use_stream=True):while True:functions = Nonecontent = input("Question:")chat_messages = [{"role": "user","content": content}]create_chat_completion("chatglm3-6b", messages=chat_messages, functions=functions, use_stream=use_stream)