IDEA 接入 deepseek,太酷了。

7,959 阅读4分钟

大家好,我是二哥呀。

deepseek 官方并没有出 IntelliJ IDEA 的插件,但作为菜逼程序员的我,却很想体验一下在 IDEA 中装入 deepseek 的感觉。

一共有三种方式,一种是通过 IDEA 官方的 AI Assistant 来调用本地的 deepseek;另外两种是通过 Continue 和 CodeGPT 两款插件来曲线救国。

①、AI Assistant

AI Assistant 是新版 IDEA 自带的一个功能,属于 JetBrains 官方集成的 AI 编程助手,妥妥的嫡长子。

能提供代码补全、代码生成、优化建议、代码解释等功能。

官方已经集成了 openai 的 4o,Google 的gemini 等,开箱即用。

也支持本地 AI,比如说我们在本地已经通过 ollama 运行了 deepseek 7b 版本的大模型,就可以直接点击 connect 跳转到 enable 复选框这里。

测试通过后,我们就可以通过这里调用 deepseek 的大模型,比如说,我们让他对 DeepSeekIntegration 这个类进行解释。

他就能告诉我们:

  • 发现它依赖于okHttp库来处理网络请求。这说明该类主要负责与外部服务 DeepSeek 进行交互。
  • 类中有两个工厂方法:executeStreamChatexecuteStreamChat(List<ChatMsg> list, EventSourceListener listener)。这两个方法都用于创建 EventSource 并发送聊天请求到 DeepSeek。流式交互支持意味着该类可以处理分片传输的数据,逐部分地发送给服务器,然后逐步处理返回的数据。

我超,真的好用啊!

谁告诉我本地的 deepseek 没用的,脸伸过来,我保证不打肿!

这基本的代码学习,很香啊,免费,还特么很到位。

②、安装 Continue

Continue 是一款开源的 AI 代码助手插件,可以无缝安装在 IDEA 或者 VSCode 中。通过 Continue 可以加载任意大模型,从而实现代码的自动补全和聊天体验。

安装方式比较简单,直接在 IDEA 的插件中搜“Continue”关键字,然后选择下载量最高的那个就行了。

安装完成后,也有两种方式,一种是配置 deepseek 的 API Key,这个就需要充值了。

不过由于算力紧张,API 这块经常处于宕机状态。

另外一种,也是连接本地 ollama,然后去加载之前我们运行起来的 deepseek 模型。

最好拉取 coder 版本。

③、安装 CodeGPT

CodeGPT 也是一个由 AI 驱动的代码助手,官方直接说了,可以是 GitHub Copilot 的替代品。

安装完成后,同样需要在 settings 中配置 deepseek API 的 keys。

当然,也可以在这一步中切换到 ollama 的本地 deepseek。

CodeGPT 比较智能的一点是,当你在编辑器中打开了某一个类,它就会自动关联到聊天窗口。

并且能把 deepseek-R1 的整个思考过程展示出来,所以我是强烈大家按照我之前的教程在本地部署一个 7b 的本地版。

比 deepseek 官方稳定多了,毕竟本地没有上万人的同时在线给你竞争。

三分恶面渣逆袭

最近一直在修改面渣逆袭第二版,目前的进展是到并发编程的 25 题,也顺带同步给大家,刚好暑期实习和春招的小伙伴,可以日拱一卒。

25.volatile 怎么保证可见性的?

当线程对 volatile 变量进行写操作时,JVM 会在这个变量写入之后插入一个写屏障指令,这个指令会强制将本地内存中的变量值刷新到主内存中。

三分恶面渣逆袭:volatile写插入内存屏障后生成的指令序列示意图

StoreStore;   // 保证写入之前的操作不会重排
volatile_write(); // 写入 volatile 变量
StoreLoad;    // 保证写入后,其他线程立即可见

在 x86 架构下,通常会使用 lock 指令来实现写屏障,例如:

mov [a], 2          ; 将值 2 写入内存地址 a
lock add [a], 0     ; lock 指令充当写屏障,确保内存可见性

当线程对 volatile 变量进行读操作时,JVM 会插入一个读屏障指令,这个指令会强制让本地内存中的变量值失效,从而重新从主内存中读取最新的值。

三分恶面渣逆袭:volatile写插入内存屏障后生成的指令序列示意图

我们来声明一个 volatile 变量 x:

volatile int x = 0

线程 A 对 x 写入后会将其最新的值刷新到主内存中,线程 B 读取 x 时由于本地内存中的 x 失效了,就会从主内存中读取最新的值。

三分恶面渣逆袭:volatile内存可见性

最后,把二哥的座右铭送给大家:没有什么使我停留——除了目的,纵然岸旁有玫瑰、有绿荫、有宁静的港湾,我是不系之舟