
一文講透 AI Agent 與 AI Workflow 的區別和深度解析:從自動化到智能化的演進
而Goland的客戶端原理就更簡單了,就是在此基礎上增加一個對話循環:
有了這些知識我們就可以開始架構項目了。
這次要實現的是一個使用Go語言開發的對話助手,現在因為官方并沒有Go的我們的MCP SDK,而且他的客戶端服務器不支持遠程連接,所以這次不使用官方的架構進行開發,而是在MCP的基礎上,基于它的理念,用更簡單的定義實現。
工欲善其事,必先利其器。一個好的IDE可以很大程度上提高我們的開發效率。對于Go語言來說,我最推薦使用Jetbrains的Goland,它擁有強大的功能和漂亮的UI,尤其適合開發這種有點復雜的項目。
這很多同學可能要說:這種大型的IDE太卡了,我的電腦頂不住啊!
坦白說是有這個問題,首先是mbp,另外在大型項目建立索引的時候卡了一段時間。但還沒解開的,使用Sealos Devbox就可以解決的問題。他將Goland的服務端放在遠程云端,利用云端的算力實現構建索引等CPU密集的功能,只要你本地的電腦是什么型號和情況,就可以絲滑流暢的開發。
先訪問Sealos Cloud:https://hzh.sealos.run
點擊 Devbox 圖標,然后點擊“新建項目”按鈕。在“運行環境”配置中,選擇 Go 語言作為開發框架,并通過仔細調整項目所需的 CPU 核心數和內存大小。因為 Goland 需要一定的性能,建議采用 4c 8g 或者更高的配置。
滾動到配置頁面的“網絡配置”部分,配置容器端口:
配置外部訪問:
域名配置:
注意:請確保容器端口 (8080) 與 Go 應用的運行端口一致。如果在 Go 配置中了端口,這里也需要相應修改更新。
最后,點擊“創建”按鈕完成項目創建。
項目創建完成后,你可以在項目列表中看到新建的項目。每個項目的“操作”欄都提供了許多便捷的選項。
在項目列表中找到你的項目,在“操作”列中,點擊 VSCode 圖標旁邊的下拉箭頭,從下拉菜單中選擇 Jetbrains,就會自動跳出一個彈窗。
根據彈窗里的提示,下載好JetBrains Gateway應用,配置好SSH連接信息,選擇自己要使用的IDE(比如Go語言項目就選擇Goland),點擊彈窗底部的【開始連接】。
提示
首次連接時,DevBox 需要下載相關組件,可能需要 3-5 分鐘,等待等待即可。
組件下載完成后,自動打開Jetbrains Gateway。確認連接信息沒問題后,直接點擊“Check Connection and Continue”即可。
注
如果沒有自動打開Jetbrains Gateway,可能是您的瀏覽器自動阻止了彈窗,請自行開通網站的彈窗權限。
接下來Jetbrains還會跳出一個彈窗進行一系列準備工作:
準備完成后,將自動打開Goland IDE,并自動連接到Devbox開發環境。
搞定,現在你就可以在 Goland 中開始愉快的進行遠程開發了!
代碼:https://github.com/bearslyricattack/mcpTerminal,下面我們挑一些關鍵的代碼為大家介紹一下位于:
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
}
當前我們沒有使用官方 MCP 的格式,而是在本地配置了一個 json 文件,用于表征各個服務的鏈接地址,參數等信息。
// 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
根據用戶的問題選擇適當的工具。
如果不需要工具,請直接回復。
重要提示:當您需要使用工具時,您必須僅使用以下確切的 JSON 對象格式進行回復,不能使用其他任何內容:
{
"name": "name",
"arguments": {
"argument-name": "value"
}
}
收到工具的響應后:
1. 將原始數據轉換為自然的對話響應
2. 保持響應簡潔但信息豐富
3. 關注最相關的信息
4. 使用用戶問題中的適當上下文
5. 避免簡單重復原始數據
請僅使用上面明確定義的工具。`, tools)
return prompt
}
首先向大模型發起請求的時候,需要為其做一些介紹,并包含需要使用的所有工具。下面是一個提示詞的示例,大家也可以持續優化提示詞,以期達到更好的效果。
// 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)
}
讀取模型的輸出,由模型來判斷是否需要調用。
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 進行查找和工具調用。
我們以平臺上現有的“獲取應用程序的日志”HTTP 接口為例子,只需要在文件配置中配置這個接口,就可以自動的成為一個可以被大模型調用的服務器,不需要做任何額外的操作:
{
"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輸出格式的模型都支持。可以像與任何大模型一樣,與它以自然語言自由的對話,它會需要的時候調用我們提供的工具去執行并分析結果。
以下是幾張效果圖
可以看到效果還是非常優秀的,也有一定的穩定性,詳細優化下提示詞的話應該會有更好的效果。
隨著大模型能力的不斷增強,其工程化是必然的趨勢。而MCP的思想和設計,是其工程化的一條重要道路。雖然目前其各個社區的支持強度似乎相差甚遠,但隨著時間的發展,一定會越來越多的模型和工具都支持以MCP的格式進行調用。
使用Goland的開發體驗非常的絲滑流暢的,而且連接穩定,甚至你一晚上不開發都不會斷連接。大家也可以嘗試一下,開發出屬于自己的MCP對話助手。
文章轉載自: 使用 Goland 遠程開發基于 MCP 的智能對話助手