而Goland的客戶端原理就更簡單了,就是在此基礎(chǔ)上增加一個(gè)對話循環(huán):

  1. 初始化:客戶端訪問服務(wù)端的接口,獲取工具,提示,資源等資源。
  2. 開始對話,客戶端接收用戶輸入,并把上述資源的上下文一起發(fā)送給大模型。
  3. 客戶端判斷通過大模型輸出判斷是否需要調(diào)用資源,如果需要就去調(diào)用,并將調(diào)用的結(jié)果返回給大模型。
  4. 大模型分析,整合結(jié)果后返回給客戶端。

有了這些知識(shí)我們就可以開始架構(gòu)項(xiàng)目了。

這次要實(shí)現(xiàn)的是一個(gè)使用Go語言開發(fā)的對話助手,現(xiàn)在因?yàn)楣俜讲]有Go的我們的MCP SDK,而且他的客戶端服務(wù)器不支持遠(yuǎn)程連接,所以這次不使用官方的架構(gòu)進(jìn)行開發(fā),而是在MCP的基礎(chǔ)上,基于它的理念,用更簡單的定義實(shí)現(xiàn)。

創(chuàng)建 IDE

工欲善其事,必先利其器。一個(gè)好的IDE可以很大程度上提高我們的開發(fā)效率。對于Go語言來說,我最推薦使用Jetbrains的Goland,它擁有強(qiáng)大的功能和漂亮的UI,尤其適合開發(fā)這種有點(diǎn)復(fù)雜的項(xiàng)目。

這很多同學(xué)可能要說:這種大型的IDE太卡了,我的電腦頂不住啊!

坦白說是有這個(gè)問題,首先是mbp,另外在大型項(xiàng)目建立索引的時(shí)候卡了一段時(shí)間。但還沒解開的,使用Sealos Devbox就可以解決的問題。他將Goland的服務(wù)端放在遠(yuǎn)程云端,利用云端的算力實(shí)現(xiàn)構(gòu)建索引等CPU密集的功能,只要你本地的電腦是什么型號和情況,就可以絲滑流暢的開發(fā)。

創(chuàng)建開發(fā)環(huán)境

先訪問Sealos Cloud:https://hzh.sealos.run

點(diǎn)擊 Devbox 圖標(biāo),然后點(diǎn)擊“新建項(xiàng)目”按鈕。在“運(yùn)行環(huán)境”配置中,選擇 Go 語言作為開發(fā)框架,并通過仔細(xì)調(diào)整項(xiàng)目所需的 CPU 核心數(shù)和內(nèi)存大小。因?yàn)?Goland 需要一定的性能,建議采用 4c 8g 或者更高的配置。

滾動(dòng)到配置頁面的“網(wǎng)絡(luò)配置”部分,配置容器端口:

配置外部訪問:

域名配置:

注意:請確保容器端口 (8080) 與 Go 應(yīng)用的運(yùn)行端口一致。如果在 Go 配置中了端口,這里也需要相應(yīng)修改更新。

最后,點(diǎn)擊“創(chuàng)建”按鈕完成項(xiàng)目創(chuàng)建。

項(xiàng)目創(chuàng)建完成后,你可以在項(xiàng)目列表中看到新建的項(xiàng)目。每個(gè)項(xiàng)目的“操作”欄都提供了許多便捷的選項(xiàng)。

使用 Goland 連接

在項(xiàng)目列表中找到你的項(xiàng)目,在“操作”列中,點(diǎn)擊 VSCode 圖標(biāo)旁邊的下拉箭頭,從下拉菜單中選擇 Jetbrains,就會(huì)自動(dòng)跳出一個(gè)彈窗。

根據(jù)彈窗里的提示,下載好JetBrains Gateway應(yīng)用,配置好SSH連接信息,選擇自己要使用的IDE(比如Go語言項(xiàng)目就選擇Goland),點(diǎn)擊彈窗底部的【開始連接】。

提示

首次連接時(shí),DevBox 需要下載相關(guān)組件,可能需要 3-5 分鐘,等待等待即可。

組件下載完成后,自動(dòng)打開Jetbrains Gateway。確認(rèn)連接信息沒問題后,直接點(diǎn)擊“Check Connection and Continue”即可。

如果沒有自動(dòng)打開Jetbrains Gateway,可能是您的瀏覽器自動(dòng)阻止了彈窗,請自行開通網(wǎng)站的彈窗權(quán)限。

接下來Jetbrains還會(huì)跳出一個(gè)彈窗進(jìn)行一系列準(zhǔn)備工作:

準(zhǔn)備完成后,將自動(dòng)打開Goland IDE,并自動(dòng)連接到Devbox開發(fā)環(huán)境。

搞定,現(xiàn)在你就可以在 Goland 中開始愉快的進(jìn)行遠(yuǎn)程開發(fā)了!

核心預(yù)測

代碼:https://github.com/bearslyricattack/mcpTerminal,下面我們挑一些關(guān)鍵的代碼為大家介紹一下位于:

加載MCP 服務(wù)

func NewTool() (*Tool, error) {
// Open the local server.json file
file, err := os.Open("server.json")
if err != nil {
return nil, fmt.Errorf("failed to open server.json file: %v", err)
}
defer file.Close()

// Create an instance of the Tool type
var tool Tool

// Decode the JSON file into the server struct
decoder := json.NewDecoder(file)
err = decoder.Decode(&tool)
if err != nil {
return nil, fmt.Errorf("failed to decode JSON: %v", err)
}

// Return the decoded Tool object
return &tool, nil
}

當(dāng)前我們沒有使用官方 MCP 的格式,而是在本地配置了一個(gè) json 文件,用于表征各個(gè)服務(wù)的鏈接地址,參數(shù)等信息。

迅速的

// GetPrompts generates a prompt message suitable for the assistant
func GetPrompts(tools string) string {
// Use a multi-line string for better readability
prompt := fmt.Sprintf(`
您是一位有用的助手,可以使用這些工具:%s
根據(jù)用戶的問題選擇適當(dāng)?shù)墓ぞ摺?br /> 如果不需要工具,請直接回復(fù)。
重要提示:當(dāng)您需要使用工具時(shí),您必須僅使用以下確切的 JSON 對象格式進(jìn)行回復(fù),不能使用其他任何內(nèi)容:
{
"name": "name",
"arguments": {
"argument-name": "value"
}
}
收到工具的響應(yīng)后:
1. 將原始數(shù)據(jù)轉(zhuǎn)換為自然的對話響應(yīng)
2. 保持響應(yīng)簡潔但信息豐富
3. 關(guān)注最相關(guān)的信息
4. 使用用戶問題中的適當(dāng)上下文
5. 避免簡單重復(fù)原始數(shù)據(jù)
請僅使用上面明確定義的工具。`, tools)
return prompt
}

首先向大模型發(fā)起請求的時(shí)候,需要為其做一些介紹,并包含需要使用的所有工具。下面是一個(gè)提示詞的示例,大家也可以持續(xù)優(yōu)化提示詞,以期達(dá)到更好的效果。

對話

// Start the conversation loop
scanner := bufio.NewScanner(os.Stdin)
for {
userInput := getUserInput(scanner)
response, err := chatClient.SendMessage(userInput)
if err != nil {
log.Fatalf("Error sending message: %v", err)
}
// Process the response to check if it contains a ToolRequest
if tool.HandleToolRequest(response, mcpServers, chatClient) {
continue // If a ToolRequest is handled, continue to the next iteration
}
fmt.Println("Assistant:", response)
}

讀取模型的輸出,由模型來判斷是否需要調(diào)用。

工具調(diào)用

var request ToolRequest
// Try to unmarshal the response into a ToolRequest struct
err := json.Unmarshal([]byte(response), &request)
if err != nil {
return false // If it's not a ToolRequest, return false to continue normal processing
}

// Search for the corresponding mcpServer and send a request to it
for _, mcpServer := range mcpServers.Server {
if request.Name == mcpServer.Name {
request, _ := req.BuildRequest(mcpServer.Host, request.Arguments)
response, err := chatClient.SendMessage(request)
if err != nil {
log.Fatalf("Error sending message: %v", err)
}
fmt.Println("Assistant:", response)
return true
}
}

可能到大型模型修剪的 JSON 的輸出之后,檢索所有的 MCP Server 進(jìn)行查找和工具調(diào)用。

效果

我們以平臺(tái)上現(xiàn)有的“獲取應(yīng)用程序的日志”HTTP 接口為例子,只需要在文件配置中配置這個(gè)接口,就可以自動(dòng)的成為一個(gè)可以被大模型調(diào)用的服務(wù)器,不需要做任何額外的操作:

{
"server": [
{
"name": "vlogs-server",
"version": "1.0.0",
"type": "remote",
"host": "http://ip:port/queryLogsByParams",
"description": "Get logs from the API by passing parameters.",
"args": [
{
"key": "time",
"value": "10h",
"description": "The time filter for logs (e.g., \"10h\")."
},
{
"key": "namespace",
"value": "gpu-operator",
"description": "The namespace of the application (e.g., \"gpu-operator\")."
},
{
"key": "app",
"value": "gpu-operator",
"description": "The name of the application (e.g., \"gpu-operator\")."
},
{
"key": "limit",
"value": "100",
"description": "The limit for the number of logs to retrieve. (e.g., \"20\"). if use this key, please use string type."
},
{
"key": "pod",
"value": "pod-123",
"description": "The list of pods to query."
},
{
"key": "container",
"value": "container-456",
"description": "The list of containers to query."
},
{
"key": "keyword",
"value": "error",
"description": "The keyword to filter logs by."
}
]
}
]
}

然后只需在我們的主要方法中配置大模型的uri apikey等信息我們就可以開始使用了,任何符合OpenAPI輸出格式的模型都支持。可以像與任何大模型一樣,與它以自然語言自由的對話,它會(huì)需要的時(shí)候調(diào)用我們提供的工具去執(zhí)行并分析結(jié)果。

以下是幾張效果圖

可以看到效果還是非常優(yōu)秀的,也有一定的穩(wěn)定性,詳細(xì)優(yōu)化下提示詞的話應(yīng)該會(huì)有更好的效果。

總結(jié)

隨著大模型能力的不斷增強(qiáng),其工程化是必然的趨勢。而MCP的思想和設(shè)計(jì),是其工程化的一條重要道路。雖然目前其各個(gè)社區(qū)的支持強(qiáng)度似乎相差甚遠(yuǎn),但隨著時(shí)間的發(fā)展,一定會(huì)越來越多的模型和工具都支持以MCP的格式進(jìn)行調(diào)用。

使用Goland的開發(fā)體驗(yàn)非常的絲滑流暢的,而且連接穩(wěn)定,甚至你一晚上不開發(fā)都不會(huì)斷連接。大家也可以嘗試一下,開發(fā)出屬于自己的MCP對話助手。

文章轉(zhuǎn)載自: 使用 Goland 遠(yuǎn)程開發(fā)基于 MCP 的智能對話助手

上一篇:

使用Cursor 和 Devbox 一鍵搞定開發(fā)環(huán)境

下一篇:

3分鐘教你接入超低價(jià) DeepSeek-V3
#你可能也喜歡這些API文章!

我們有何不同?

API服務(wù)商零注冊

多API并行試用

數(shù)據(jù)驅(qū)動(dòng)選型,提升決策效率

查看全部API→
??

熱門場景實(shí)測,選對API

#AI文本生成大模型API

對比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力

25個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)

#AI深度推理大模型API

對比大模型API的邏輯推理準(zhǔn)確性、分析深度、可視化建議合理性

10個(gè)渠道
一鍵對比試用API 限時(shí)免費(fèi)