在Python中调用本地大模型中文版

1.安装本地大模型

打开cmd

输入:ollama run llamafamily/llama3-chinese-8b-instruct

这就在本地电脑安装了一个llama3大模型的中文版

2.在Python中安装ollama库

创建一个py文件,终端输入

pip install ollama

3.代码调用

1.调用generate函数

import ollama

if __name__ == '__main__':
    user_input = input('请输入问题:')

    stream = ollama.generate(
        stream=True,
        model='llamafamily/llama3-chinese-8b-instruct:latest',
        prompt=user_input
    )

    print('-----------------------------------------')
    response = ''
    for chunk in stream:
        if not chunk['done']:
            response += chunk['response']
            print(chunk['response'], end='', flush=True)
        else:
            print('\n')
            print('-----------------------------------------')
            print(f'总耗时:{chunk["total_duration"]}')
            print('-----------------------------------------')
            break

    print('\n完整回答:')
    print(response)

这行代码调用了 ollama 模块中的 generate 函数,用于生成文本响应。该函数接受几个参数:

stream:

(1)当 stream=True 时

  • 函数将生成的文本以流的形式返回。这意味着生成的文本不是一次性全部返回的,而是分批次地返回。每个批次(或“块”)可能包含一部分生成的文本和一个表示是否已完成生成的标志(如 done 字段)。
  • 调用者需要遍历这个流,并处理每个返回的批次,直到遇到表示生成完成的批次。
  • 这种方式适用于需要实时处理生成文本或处理大量文本时节省内存的场景。

(2)当 stream=False 时

  • 函数将一次性返回完整的生成文本,而不是以流的形式。
  • 调用者不需要遍历流或处理批次,而是可以直接获取整个生成的文本。
  • 这种方式更简单直接,但如果生成的文本非常大,可能会消耗更多的内存。

model='llamafamily/llama3-chinese-8b-instruct:latest':指定要使用的模型名称和版本。

 prompt=user_input:将用户输入的问题作为生成文本的提示或上下文。

然后遍历 stream 生成的每个块(chunk)。每个块可能包含一部分生成的文本和一个表示是否已完成生成的标志。

  • 如果 chunk['done'] 为 False,则将块中的 response 添加到 response 字符串中,并立即打印出来。end='' 和 flush=True 用于在打印时不在末尾添加换行符,并立即将输出刷新到控制台。
  • 如果 chunk['done'] 为 True,则表示所有文本都已生成并返回。此时打印出总耗时然后退出循环,由于 response 字符串在循环中逐渐构建,这里将包含所有生成的文本。

2.调用chat函数

import ollama

# 定义消息列表,包含对话内容
messages = [
    {'role': 'user', 'content': '在吗'},
    {'role': 'assistant', 'content': '你想做什么'},
{'role': 'user', 'content': '你翻译一下good的意思'}
]

# 调用 chat 函数
stream = ollama.chat(
    model='llamafamily/llama3-chinese-8b-instruct:latest',
    messages=messages,
    stream=True
)
#会根据user和assiatant的历史信息综合给出以后的回答
# 处理流式响应
for chunk in stream:
    if 'message' in chunk:
        print(chunk['message']['content'], end='')

这段代码的作用是通过 ollama 库与一个名为 llamafamily/llama3-chinese-8b-instruct:latest 的语言模型进行对话。

代码解析:

1.定义消息列表

messages = [ {'role': 'user', 'content': '在吗'}, {'role': 'assistant', 'content': '你想做什么'}, {'role': 'user', 'content': '你翻译一下good的意思'} ]

  • messages: 这是一个包含对话历史的列表。每个元素都是一个字典,表示一个消息。
    • 'role' 指定了消息的角色,可以是 'user'(用户)或 'assistant'(助手)。
    • 'content' 是消息的内容,即对话中的实际文本。

2.调用聊天函数

stream = ollama.chat( model='llamafamily/llama3-chinese-8b-instruct:latest', messages=messages, stream=True )

  • ollama.chat: 这是一个调用 ollama 库的函数,用于发送对话请求给指定的语言模型,并获取响应。
    • model 参数指定了要使用的语言模型。这里是 'llamafamily/llama3-chinese-8b-instruct:latest',表示使用了一个最新的中文指令型模型。
    • messages 参数传入之前定义的对话历史。
    • stream=True 参数表示请求以流式的方式返回结果,这意味着响应会分块返回,而不是一次性返回所有结果。

3.处理流式响应

for chunk in stream: if 'message' in chunk: print(chunk['message']['content'], end='')

  • for chunk in stream: 迭代从 stream 变量中获取的每一个数据块。stream 是一个生成器,提供了逐块返回的响应数据。
  • if 'message' in chunk: 检查当前数据块中是否包含 'message' 键。通常流式响应中的数据块包含消息内容。
  • print(chunk['message']['content'], end=''): 打印消息内容,不添加换行符(因为 end='')。这会将消息内容逐步输出,形成连续的响应文本。

 3.函数区别

`ollama.generate` 和 `ollama.chat` 的主要区别在于对话上下文和用途:

1. 对话上下文:
   ollama.generate: 处理单一提示,生成与提示相关的内容,不考虑之前的对话历史
   ollama.chat: 处理多个消息的对话上下文,生成基于整个对话历史的回应

2. 使用场景:
   ollama.generate: 适用于需要快速生成基于单一提示的回答的情况。
   ollama.chat: 适用于需要维护对话状态和上下文的情境,例如在持续对话中生成自然的回复。


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值