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 本地模型的一个补充,方便后续的模型研究

作者:计算机辅助工程

物联沃分享整理
物联沃-IOTWORD物联网 » Python实现本地大模型的调用与优化

发表回复