大模型实战教程 | Ollama+TS实现私有化代码助手(本地运行)
概述
基于大模型的能力可以理解文本或则代码的上下文,然后,根据代码上下文可以实现代码的注释,代码的补全等功能,从而实现一个代码助手。
本文实现了一个简单vs code的代码助手插件,通过该插件可以对代码进行补全。后台大模型服务是本地的CPU机器搭建的,通过Ollama实现通过过接口来访问大模型。
插件功能设计
插件实现的功能很简单:在vs code中选择一段代码,然后发起一个命令(这个后续可以优化,或则变成快捷键),根据代码上下文来对代码进行补全。
设计的考虑
设计其实分为两个层面的,一个前端,一个后端服务。这个插件是一个简单的可用的demo,其实就是两个端:一个前端,一个基于大模型的后端服务。
补一个图:前端->Ollama->大模型
前端开发
通过typescript来开发vscode的插件,目前前端实现的功能非常简单:选择一段代码,然后发起ask Ollama的命令,此时就会把代码片段放到提示词模板中发送给后台大模型服务。并等待后台大模型的返回,然后使用返回的代码覆盖现有代码。
前端要实现的步骤和逻辑如下:
获取当前选择的代码片段;
根据获取到的代码片段,构建提示词请求;
发送补全代码的提示词请求;
获取大模型的返回代码;
覆盖现有代码;
根据目前实现的功能,还可以对功能进行继续扩展,比如实现:可以撤销返回的代码,获取光标所在的代码片段补全光标所在代码,基于代码实现智能聊天功能,等等。
代码实现
import\*asvscodefrom'vscode';
importaxiosfrom'axios';
exportfunctionactivate(context:vscode.ExtensionContext) {
letdisposable\=vscode.commands.registerCommand('extension.askOllama',async ()\=> {
consteditor\=vscode.window.activeTextEditor;
if (!editor) {
vscode.window.showErrorMessage('请打开一个编辑器并选中代码');
return;
}
constselection\=editor.selection;
constselectedText\=editor.document.getText(selection);
if (!selectedText) {
vscode.window.showWarningMessage('未选中任何代码');
return;
}
try {
constresult\=awaitgetCompletionFromOllama(selectedText);
console.log("debug: complete result: ",result)
// 在 VS Code 中显示补全结果
vscode.window.showInformationMessage('代码补全结果已生成');
editor.edit(editBuilder\=> {
editBuilder.replace(selection,result);
});
}catch (error:any) {
vscode.window.showErrorMessage(\`请求 Ollama 出错: ${error.message}\`);
}
});
context.subscriptions.push(disposable);
}
exportfunctiondeactivate() {}
// 调用 Ollama API 获取补全
asyncfunctiongetCompletionFromOllama(code:string):Promise<string\> {
consturl\='http://172.16.1.54:11434/api/chat';// 替换为你的 Ollama 服务地址
constpayload\= {
model:'llama3.2',// 替换为实际模型名称
messages: \[
{
role:'user',
content:\`补全以下代码:\\n ${code}\`// 将用户输入的代码放入 content 字段
}
\],
stream:false
};
try {
// 发送 POST 请求到 Ollama API
constresponse\=awaitaxios.post(url,payload);
// 获取返回的 content 字段
constcompletion\=response.data.message.content;
// 如果返回的 content 为空,抛出错误
if (!completion) {
thrownewError('Ollama API 返回为空的补全结果');
}
returncompletion;
}catch (error) {
console.error('Error calling Ollama API:',error);
thrownewError('请求 Ollama API 出错');
}
}
说明:后台的url可以换成自己的Ollama本地访问的URL地址。
3.后端服务
后端使用Ollama提供的框架来实现通过接口请求大模型,该接口在Ollama的官方网站上有说明,如下:
curl http://localhost:11434/api/chat\-d'{
"model":"llama3.2",
"messages": \[
{
"role":"user",
"content":"why is the sky blue?"
}
\],
"stream":false
}'
返回值
{
"model":"llama3.2",
"created\_at":"2023-12-12T14:13:43.416799Z",
"message": {
"role":"assistant",
"content":"Hello! How are you today?"
},
"done":true,
"total\_duration":5191566416,
"load\_duration":2154458,
"prompt\_eval\_count":26,
"prompt\_eval\_duration":383809000,
"eval\_count":298,
"eval\_duration":4799921000
}
效果
(1)编写一个函数

(2)按下ctl+shift+p,输入Ask Ollama for Code Complete,得到如下结果:

后续改进
该插件只是一个demo,通过本地Ollama来搭建大模型服务,可以实现私有化部署的代码助手。
但这里要注意的是:这里是完全基于大模型的能力,而在实际的使用过程中,还需要结合外部知识库和本地代码库才能更好的完成代码补全,也就是要借助RAG框架的能力。通用大模型的能力是有限的,通过本地代码库来构建外部知识库,这也是代码助手的难点。
参考资料:
- https://github.com/ollama/ollama/blob/main/docs/api.md