AI-Ollama使用llama模型vue2中流式响应,模仿AI提问逐字渲染,呈现打印机效果

1.前言

        在vue2中非流式响应数据,请求响应完成后,将返回文本数据渲染。在Ollama API模型交互中,通过设置stream的状态为true开启流式响应。

{
  "model": "<model-name>",  // 模型名称
  "prompt": "<input-text>", // 输入的提示词
  "stream": false,          // 是否启用流式响应(默认 false)
  "options": {              // 可选参数
    "temperature": 0.7,     // 温度参数
    "max_tokens": 100       // 最大 token 数
  }
}

 参考文档Ollama API 交互 | 菜鸟教程https://www.runoob.com/ollama/ollama-api.html

2.流式响应-API.js

const API_URL = 'http://localhost:11434'; // Ollama默认的API端口是11434

export const generateText = async function*(prompt){
    try {
        // fetch发送请求
        const response = await fetch(`${API_URL}/api/generate`, {
            method: 'POST',
            body: JSON.stringify({
                model: 'llama3.2', // 指定模型
                prompt: prompt,   // 输入的提示文本
                stream: true,     // 启用流式传输
            }),
        });
        // 检测校验是否成功
        if (!response.ok) {
            throw new Error('Network response was not ok');
        }
        // 获取响应体的ReadableStream的读取器
        const reader = response.body.getReader();
        while (true) {
            // 读取下一个二进制数据块
            const { done, value } = await reader.read();

            //数据传输完成
            if (done) break;

            // 二进制数据块解码为字符串
            const chunk = new TextDecoder().decode(value);

            // 转换为json格式的文本流 yield返回
            yield JSON.parse(chunk);
        }
    } 
    catch (error) {
        // 记录生成文本过程中的错误
        console.error('Error generating text:', error);
        throw error;
    }
};
  • fetch API: 使用 fetch 发送 POST 请求,并启用流式传输 (stream: true)。

  • response.body.getReader(): 获取响应体的 ReadableStream 的读取器,用于逐步读取流式数据。

  • await reader.read(): 读取下一个二进制数据块,返回一个包含 done 和 value 的对象。done 表示是否读取完毕,value 是读取到的二进制数据。

  • new TextDecoder().decode(value): 将二进制数据解码为字符串。

  • yield JSON.parse(chunk): 将字符串解析为 JSON 对象,并通过 yield 返回,使得调用方可以逐步处理流式数据

  • 在 fetch 中处理流式数据的关键在于使用 response.body.getReader() 来逐步读取数据块,并通过 yield 返回解析后的 JSON 对象。 

3. 组件调用

<template>
	<div>
		<div class="textContainer">{{ generatedText }}</div>
		<textarea v-model="prompt" placeholder="输入你的问题" style="width: 600px;"></textarea>
		<button @click="generateText">发送</button>
	</div>
</template>
<script>
import { generateText } from '../api/api.js'; // 引入你的API服务文件

export default {
	data() {
		return {
			prompt: '',
			generatedText: ''
		};
	},
	methods: {
		// 调用函数 传入输入提示文本 获取数据流
		async generateText() {
			try {
				const dataStream = generateText(this.prompt);
				// for await循环逐步处理数据流中的每个分块
				for await (const chunk of dataStream) {
					// 是否包含响应数据
					if (chunk.response) {
						// 分块数据流响应数据逐步添加到渲染文本
						this.generatedText += chunk.response; // 逐步渲染返回的数据
					}
				}
			}
			catch (error) {
				console.error('Error generating text:', error);
			}
		},
	}
};
</script>
<style scoped>
	.textContainer {
		height: 400px;
		color: violet;
		border: 2px solid red;
		border-radius: 10px;
		margin: 100px;
	}
</style>

4.为什么要使用fetch请求而不是axios? 

        首先fetch是现代浏览器支持的API,无需额外引入库。fetch支持对流式数据的处理,通过ReadableStream,可以逐块读取响应数据,处理大型文件或实时的数据流。

        不使用axios的原因,axios本身不支持对流式数据的处理,即使可以实现对流式数据的处理,但是会更加的复杂,而fetch内置可以对于流式数据的处理。

5.对于请求函数使用生成器函数的原因?

         主要的原因是处理异步的操作,遇到yield关键字的时候暂停执行并返回中间结果的函数,下次调用时会从上次暂停的地方继续执行,直到数据处理完成。异步生成器使用for await ... of来遍历。

js-生成器函数(yield关键字,流式数据处理,暂停执行并返回中间结果)_js 流式数据 停止-优快云博客

6.提示

Ollama(LLM)。模型引入,vue中的引入依赖,以及在请求时,请开启对应模型。具体请参考博主上一篇文章。

AI-Ollama本地大语言模型运行框架与Ollama javascript接入-优快云博客

### Spring AIOllama使用教程 #### 1. 创建基础的 Spring Boot 项目 为了构建基于 Spring AIOllama 的生成人工智能应用,首先需要创建一个基本的 Spring Boot 项目。如果尚未熟悉 Spring Boot 的开发流程,可以通过官方文档中的快速入门指南来掌握基础知识[^1]。 在 IDE 中初始化一个新的 Spring Boot 项目,并确保引入必要的依赖项。对于 Spring AI 支持的功能,可能需要额外添加 `spring-ai` 相关的 Starter 依赖到项目的 `pom.xml` 文件中(如果是 Maven 工程),或者将其加入到 Gradle 构建文件中。 以下是 Maven 配置的一个示例: ```xml <dependency> <groupId>org.springframework.ai</groupId> <artifactId>spring-ai-starter</artifactId> <version>0.0.1-SNAPSHOT</version> </dependency> ``` #### 2. 安装并启动 Ollama 服务 Ollama 是一种轻量级的大规模语言模型推理引擎,支持多种预训练模型。要使 Spring AI 能够调用这些模型,需先安装并运行 Ollama 本地服务器。推荐通过 Docker 来部署 Ollama: 执行以下命令以拉取最新的 Open Web UI 镜像并启动容器: ```bash docker run -d --name open-webui -p 7860:7860 ghcr.io/open-webui/open-webui:main ``` 此操作会下载指定镜像并将端口映射至主机环境以便访问[^3]。 注意:实际生产环境中应考虑安全性设置以及资源隔离策略。 #### 3. 配置 application.yml 文件 完成以上准备工作之后,在应用程序根目录下的 `application.yml` 文件里定义好连接参数,如下所示: ```yaml spring: ai: ollama: base-url: http://localhost:11434 embedding: model: llama2 ``` 这里指定了默认使用的嵌入向量计算模型Llama2[^2]。 #### 4. 编写业务逻辑代码 最后一步就是实现具体的交互功能模块了。比如发送请求给远程 API 获取预测结果等操作都可以封装成独立的服务类供控制器层调用。 假设我们有一个简单的 RESTful 接口用于接收输入文本并通过大模型生成回复,则对应的 Java 实现可能是这样的形: ```java @RestController @RequestMapping("/api/generate") public class GenerateController { @Autowired private OllamaClient client; @PostMapping public String generate(@RequestBody Map<String, Object> payload){ var response = this.client.generate(payload.get("prompt").toString()); return (String)response.getBody().get("content"); } } ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值