ollama+springboot,怎么连续问答
时间: 2025-06-10 16:00:05 浏览: 18
### 集成Ollama实现连续问答功能
为了在Spring Boot项目中集成Ollama并实现连续问答功能,开发者可以通过配置`application.yml`文件指定Ollama服务地址以及所使用的模型[^3]。具体来说,在`application.yml`中的设置如下:
```yaml
spring:
ai:
ollama:
base-url: http://localhost:11434
embedding:
model: llama2
```
接着,创建一个用于管理对话上下文的服务类,该类负责存储会话历史记录,并调用Ollama接口获取响应。
#### 创建对话管理器
定义名为`ConversationManager`的Java Bean来维护当前用户的聊天状态:
```java
@Service
public class ConversationManager {
private final Map<String, List<String>> conversationHistory;
@Autowired
public ConversationManager() {
this.conversationHistory = new ConcurrentHashMap<>();
}
/**
* 添加新消息到特定用户的对话历史中.
*/
public void addMessage(String userId, String message) {
conversationHistory.computeIfAbsent(userId, k -> new ArrayList<>()).add(message);
}
/**
* 获取某个用户的全部对话历史.
*/
public List<String> getMessagesForUser(String userId) {
return conversationHistory.getOrDefault(userId, Collections.emptyList());
}
}
```
此代码片段展示了如何利用并发哈希映射表保存不同用户之间的交互数据结构[^1]。
#### 构建RESTful API端点
为了让前端应用程序能够发送请求并与后端通信,需设计相应的控制器接收HTTP POST请求并将输入转发给Ollama进行处理。
```java
@RestController
@RequestMapping("/api/conversations")
public class ChatController {
private static final Logger logger = LoggerFactory.getLogger(ChatController.class);
@Autowired
private RestTemplate restTemplate;
@Autowired
private ConversationManager conversationManager;
@PostMapping("/{userId}")
public ResponseEntity<Map<String,Object>> handleChatRequest(@PathVariable String userId,
@RequestBody(required=false) String userInput){
try{
// 将收到的消息加入对应用户的对话列表里
conversationManager.addMessage(userId,userInput);
// 准备向Ollama发起POST请求的数据体
MultiValueMap<String,String> body=new LinkedMultiValueMap<>();
body.set("prompt",String.join("\n",conversationManager.getMessagesForUser(userId)));
HttpHeaders headers=new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_FORM_URLENCODED);
HttpEntity<MultiValueMap<String,String>> request=
new HttpEntity<>(body,headers);
// 调用外部API获得回复内容
ResponseEntity<String> response=restTemplate.postForEntity(
"http://localhost:11434/v1/chat/completions",
request,
String.class
);
ObjectMapper mapper = new ObjectMapper();
JsonNode rootNode=mapper.readTree(response.getBody());
String reply=rootNode.path("choices").get(0).path("message").path("content").asText();
// 更新对话记录后再返回最终结果
conversationManager.addMessage(userId,reply.trim());
return ResponseEntity.ok(Map.of("response",reply));
}catch(Exception e){
logger.error(e.getMessage(),e);
throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR,"Error processing chat request");
}
}
}
```
上述代码实现了基于路径参数`{userId}`区分不同用户的多轮次交流逻辑;每当接收到新的提问时,都会将其追加至相应用户的对话序列末端,并连同之前所有的发言一并向Ollama提交查询以求得最合适的应答。
阅读全文
相关推荐















