streamlit+ollama调用大模型接口实现流式输出

本文主要介绍使用python:3.12实现网页人机对话流式输出,类似page assist的效果,使用的页面组件是streamlit:1.37,大模型是使用ollama 跑起来的deepseek-R1

代码如下:
utils.py 工具类,主要是负责和ollama通信,获取deepseek-R1版本,调用ollama对话接口、获取响应流,注意这里不是获取完整的响应的内容,而是响应的一个个片段

import os
# 调用私有化的ollama
os.environ['OLLAMA_HOST'] = 'http://192.168.4.201:11434'
import ollama

def get_chat_response(messages, model):
	# 调用ollama对话接口,以流的方式交互并直接返回
    stream = ollama.chat(model= model, messages=messages, stream=True)
    return stream

def get_model():
	# 获取deepseek 模型版本
    model_name = []
    result = ollama.list().models
    for a in result:
        model_name.append(a.model)
    return tuple(model_name)

streamlit_ollama.py 是streamlit run 执行的文件

import streamlit as st

from utils import get_chat_response, get_model

content = ''
# 这个方法是接收ollama的流,是一个generator,然后遍历这个generator,提取其中的content字段,
# 通过yield关键字重新生成一个generator,交给 write_stream()方法流式输出
def getContent(stream):
    global content
    for chunk in stream:
        c = chunk['message']['content']
        content += c
        yield c

st.title("聊天机器人")

# 从导航栏选择要交互的模型版本
with st.sidebar:
    model = st.selectbox('请选择你的对话模型:',get_model())
# 记录对话历史
if "messages" not in st.session_state:
    st.session_state['messages'] = [{'role':'assistant', 'content':'你好,请问有什么可以帮助你?'}]

for message in st.session_state['messages']:
    st.chat_message(message['role']).write(message['content'])

# 等待用户输入
prompt = st.chat_input()

if prompt:
    st.session_state['messages'].append({'role':'user','content':prompt})
    st.chat_message('user').write(prompt)
    with st.spinner("思考中"):
        stream = get_chat_response(st.session_state['messages'], model)
        st.chat_message('assistant').write_stream(getContent(stream))
        st.session_state['messages'].append({'role':'assistant','content':content})
        content=''

效果如下:

在这里插入图片描述

很明显,这个页面相对于page asisst 还是有很多优化点的,比如怎么把think标签的收起等等。

### Java 实现OLLAMA 大模型流式调用 为了实现OLLAMA 大模型流式调用,在Java中可以通过`Flux<ChatResponse>`来处理异步数据流。下面是一个具体的例子,展示了如何配置并发起一个流式的聊天请求: ```java import reactor.core.publisher.Flux; // 导入其他必要的包... var ollamaApi = new OllamaApi(); var chatClient = new OllamaChatClient(ollamaApi) .withModel("指定使用的模型名称") // 替换成实际要使用的模型名 .withDefaultOptions(OllamaOptions.create() .withModel(OllamaOptions.DEFAULT_MODEL) .withTemperature(0.7f)); // 使用 stream 方法获取 Flux<ChatResponse> 类型的结果集 Flux<ChatResponse> responses = chatClient.stream( new Prompt("生成5个著名海盗的名字。")); responses.subscribe(response -> { System.out.println("接收到的部分回复:" + response.getContent()); }, error -> { System.err.println("发生错误:" + error.getMessage()); }); ``` 上述代码片段通过订阅 `Flux<ChatResponse>` 来接收来自大模型逐步产生的输出[^2]。 当采用这种方式时,程序不会等待整个消息体全部准备好再做处理;相反,每当有新的部分可用时就会立即触发回调函数中的逻辑进行相应操作。这有助于提高交互效率以及用户体验,尤其是在面对较长的回答或者实时性要求较高的场景下尤为适用。 对于更复杂的业务需求来说,还可以进一步定制化设置诸如温度参数(temperature)、最大长度限制等选项以优化最终效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值