deepseek开启多轮对话---多次调用本地方法

了解如何开启一轮对话后,就需要了解如何开启多轮对话。根据deepseek官方文档指出,/chat/completionsAPI是一个无状态API,服务端并不会记录用户请求的上下文,为了实现多轮对话,用户只能在每次请求时,将所有对话历史拼接到本次请求后,一起传给API。

第一步还是先创建client

messages = [
    {"role": "system", "content": f'你只能使用{tools}中的函数,你要从中选择合适的函数来回答问题,如果提供的函数不能解决问题,告诉用户没有相应的函数就行,如果有的话,以标准json'
                                  f'的格式输出,例如:{{ '
                                  f'"func":"calculator","args":"{{ '
                                  f'参数键值对}}"}}'},
    {"role": "user", "content": "西安的天气怎么样?"}
]
completion = client.chat.completions.create(
    model="deepseek-r1:1.5b",
    messages=messages,
    max_tokens=1024,
    temperature=0.7,
    response_format={
        'type': 'json_object'
    }
)

client创建好之后,我们先打印第一次传入API的message值和API给我们的返回值

print(messages)
print(completion.choices[0].message.content)

可以看到第一条是我们传入的messages,第二条是AI给我们返回的。可以看到AI已经识别并且返回了需要调用的函数名和参数列表。

现在我们将传入的messages和AI给我们的返回数据拼接到一起(此时messages是第一轮对话的全部内容,包括问题和答案)

messages.append(completion.choices[0].message)

接下来我们将第二轮对话的messages拼接上去

messages.append({"role": "user", "content": "上海的呢?"})

接着创建第二个client

completion = client.chat.completions.create(
    model="deepseek-r1:1.5b",
    messages=messages,
    max_tokens=1024,
    temperature=0.7,
    response_format={
        'type': 'json_object'
    }
)

我们看一下两轮下来,messages变成了什么样?

此时的message已经将第二轮我们的问题拼接了上去,接下来我们看看AI的返回

可以看到第二轮虽然我只问了上海的呢,并没有问上海的天气,但是AI依旧返回了调用函数的名称和参数列表。

接下来我们只需要在每轮对话结束之后,调用处理AI返回值的函数,即可根据AI返回值来执行我们需要的函数。从而实现根据需求,多次调用本地方法。

### 使用 Java 和 DeepSeek 实现多轮对话 为了实现多轮对话功能,可以基于已有的 `OllamaChatModel` 类扩展其能力来支持上下文记忆。这通常涉及到保存之前的对话记录并将其作为新请求的一部分发送给模型。 #### 扩展 OllamaChatModel 支持会话历史 假设当前有一个简单的聊天接口如下: ```java @Service public class DeepSeekServiceImpl implements DeepSeekTestService { private final OllamaChatModel ollamaChatModel; public DeepSeekServiceImpl(OllamaChatModel ollamaChatModel) { this.ollamaChatModel = ollamaChatModel; } @Override public String getResponse(String message) { return ollamaChatModel.call(message); } } ``` 要增加多轮对话的支持,可以在服务层引入一个缓存机制用于存储用户的交互历史。这里展示一种可能的方式——通过维护一个静态映射表来跟踪不同用户之间的对话流[^2]。 ```java import java.util.Map; import java.util.concurrent.ConcurrentHashMap; @Service public class MultiTurnDeepSeekServiceImpl extends DeepSeekServiceImpl { // 存储每个用户的对话历史 private static Map<String, List<String>> conversationHistory = new ConcurrentHashMap<>(); protected MultiTurnDeepSeekServiceImpl(OllamaChatModel ollamaChatModel) { super(ollamaChatModel); } /** * 获取带有上下文的消息响应. */ @Override public synchronized String getResponse(String userId, String currentMessage) { StringBuilder contextBuilder = new StringBuilder(); // 添加之前所有的消息到context中 if (conversationHistory.containsKey(userId)) { for (String msg : conversationHistory.get(userId)) { contextBuilder.append(msg).append("\n"); } } // 将本次消息加入到上下文中 contextBuilder.append(currentMessage); // 调用 deepseek API 并获取回复 String response = ollamaChatModel.call(contextBuilder.toString()); // 更新该用户的对话列表 updateConversationHistory(userId, currentMessage, response); return response; } /** * 更新指定用户的对话历史. */ private void updateConversationHistory(String userId, String userMsg, String botResp) { conversationHistory.computeIfAbsent(userId, k -> new CopyOnWriteArrayList<>()) .add(userMsg + " | Bot: " + botResp); } } ``` 上述代码片段展示了如何修改现有的单次查询逻辑以适应连续性的交流模式。每当收到新的输入时,程序不仅考虑即时的信息还回顾过往的互动情况,从而构建更自然流畅的人机沟通体验[^1]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值