Python实现本地大模型的调用与优化
参考:
https://zhuanlan.zhihu.com/p/13674221011
背景:
为了研究的方便和省钱,需要将模型本地化部署,部署模型以后需要研究如何调用的大模型,在实际的使用过程中会根据业务场景和使用方式,会采用不同的调用方式,这篇文章主要分析通过request 请求 去拿 大模型的结果 ,其他方式请参见 BerryHN:ollama(3) python调用本地部署的大模型(llama3.1)
这里主要是对 request 请求进行细化
环境
部署模型
大模型部署(使用ollama 部署)、至于ollama的安装这里就不解释了
ollama run llama3.1
本地模型的请求地址
base_url = http://localhost:11434/api
列出本地模型信息
api:/tags
列出本地已加载的所有模型
请求方法: GET
参数:无
实战代码
def list_models():
url = f"{base_url}/tags"
headers = {"Content-Type": "application/json"}
response = requests.get(url,headers=headers)
return response.json().get("models",[])
输出
实战
一、文本补全
接口说明
API:/generate
功能: 生成指定模型的文本补全。输入提示词后,模型根据提示生成文本结果
请求方法:POST
API参数:
model: 必填 如llama3.1
prompt:必填 生成文本所使用的提示词
suffix: 可选 生成的补全之后附加的文本
stream: 可选 是否流式传输响应,默认为true
system: 可选 覆盖模型系统信息的字段,影响生成文本的风格
temperature: 可选,控制文本生成的随机性 默认值为1
实战(非流式)
def generate_completion(prompt,model="llama3.1"):
base_url = "http://localhost:11434/api"
url = f"{base_url}/generate"
headers = {"Content-Type": "application/json"}
data = {"model":model,"prompt":prompt,"stream":False}
response= requests.post(url, json=data, headers=headers)
print(response)
return response.json().get("response","")
print(generate_completion("解释一下证券营销"))
实战(流式)
def generate_completion_stream(prompt,model="llama3.1",stream=True):
url = "{base_url}/generate".format(base_url=base_url)
headers = {"Content-Type": "application/json"}
data = {"model":model,"prompt":prompt,"stream":stream}
respose= requests.post(url,json=data,headers=headers,stream=stream)
result = ""
import json
for line in respose.iter_lines():
if line:
t = json.loads(line.decode("utf-8"))
if not t.get("done"):
result += t.get("response")
return result
print(generate_completion_stream("解释一下证券营销"))
二、会话补全
API:/chat
功能: 模拟对话补全,支持多轮交互,适用于聊天机器人等场景
请求方法:POST
API参数
model: 必填 模型名称
messages:必填 对话的消息列表,按顺序包含历史对话,每条消息包含role 和content
role: user(用户) assistant(助手) 或system(系统)
content:消息内容
stream: 可选 是否流式传输响应 默认true
实战(非流式)
def generate_chat_completion(messages,model="llama3.1"):
url = "{base_url}/chat".format(base_url=base_url)
headers = {"Content-Type": "application/json"}
data = {"model":model,"messages":messages,"stream":False}
response = requests.post(url, json=data,headers=headers)
return response.json().get("message",{}).get("content","")
messages =[
{"role":"user","content":"什么是证券营销"},
{"role":"assistant","content":"证券营销是证券行业的营销"}
]
chat_response = generate_chat_completion(messages,"llama3.1")
print(chat_response)
实战(流式)
def generate_chat_completion_stream(messages,model="llama3.1"):
url = "{base_url}/chat".format(base_url=base_url)
headers = {"Content-Type": "application/json"}
data = {"model":model,"messages":messages,"stream":True}
response = requests.post(url, json=data,headers=headers,stream=True)
result = ""
for line in response.iter_lines():
if line:
t = json.loads(line.decode("utf-8"))
print(t)
if not t.get("done"):
result += t.get("message").get("content")
return result
messages =[
{"role":"user","content":"什么是证券营销"},
{"role":"assistant","content":"证券营销是证券行业的营销"}
]
chat_response = generate_chat_completion_stream(messages,"llama3.1")
print(chat_response)
三、文本嵌入
接口说明
API:/embed
功能: 为输入的文本生成嵌入向量,常用于语义搜索或分类等任务。
请求方法: POST
API 参数:
model:必填 生成嵌入模型名称
input: 必填 文本或文本列表,用户生成嵌入
truncate: 可选 是否在文本超出上下文长度时进行截断,默认true
stream: 可选 是否流式传输响应,默认为true
实战
def generate_embedding(text,model="llama3.1"):
url = "{base_url}/embed".format(base_url=base_url)
headers = {"Content-Type": "application/json"}
data = {"model":model,"input": text}
response = requests.post(url, json=data,headers=headers)
return response.json()
embedding = generate_embedding("什么是证券营销")
print("生成文本嵌入",embedding)
总结
这篇文章主要是对BerryHN:ollama(3) python调用本地部署的大模型(llama3.1) 的补充,对request 请求ollama 本地模型的一个补充,方便后续的模型研究
作者:计算机辅助工程