
一文講透 AI Agent 與 AI Workflow 的區(qū)別和深度解析:從自動(dòng)化到智能化的演進(jìn)
而Goland的客戶端原理就更簡單了,就是在此基礎(chǔ)上增加一個(gè)對話循環(huán):
有了這些知識(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)。
工欲善其事,必先利其器。一個(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ā)。
先訪問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)。
在項(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ā)了!
代碼:https://github.com/bearslyricattack/mcpTerminal,下面我們挑一些關(guān)鍵的代碼為大家介紹一下位于:
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)用。
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ì)有更好的效果。
隨著大模型能力的不斷增強(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 的智能對話助手
一文講透 AI Agent 與 AI Workflow 的區(qū)別和深度解析:從自動(dòng)化到智能化的演進(jìn)
實(shí)測告訴你:DeepSeek-R1 7B、32B、671B差距有多大
6個(gè)大模型的核心技術(shù)介紹
太強(qiáng)了!各個(gè)行業(yè)的AI大模型!金融、教育、醫(yī)療、法律
在Sealos 平臺(tái)的幫助下一個(gè)人維護(hù)著 6000 個(gè)數(shù)據(jù)庫
通義萬相,開源!
使用Cursor 和 Devbox 一鍵搞定開發(fā)環(huán)境
DeepSeekMath:挑戰(zhàn)大語言模型的數(shù)學(xué)推理極限
新型脈沖神經(jīng)網(wǎng)絡(luò)+大模型研究進(jìn)展!