要使用golang对接textgen webui本地大语言模型并实现api化,需按照以下步骤操作:1. 确保已安装golang环境并部署好textgen webui;2. 启动textgen webui的api模式(使用--api参数);3. 在go代码中构建包含prompt和生成参数的json请求体;4. 使用net/http或第三方库发送post请求至api端点;5. 解析返回的json响应并提取生成文本。此外,可通过连接池、并发控制、流式响应等手段优化性能,并通过检查http状态码、设置超时、记录日志等方式增强错误处理能力。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜

Golang对接TextGen WebUI本地大语言模型API化,简单来说,就是用Go语言写代码,让你的程序能调用本地部署的大语言模型,就像使用一个在线API一样方便。

环境准备:

--api
python server.py --api
安装必要的Go包:
立即学习“go语言免费学习笔记(深入)”;
我们需要使用
net/http
encoding/json
github.com/go-resty/resty/v2
构建请求体:
TextGen WebUI的API通常接受JSON格式的请求。你需要构建一个包含你的提示语(prompt)和其他参数的JSON对象。例如:
{
"prompt": "请用三句话介绍Golang。",
"max_new_tokens": 200,
"do_sample": true,
"temperature": 0.7,
"top_p": 0.9
}这些参数控制了生成文本的行为。
max_new_tokens
temperature
top_p
发送HTTP请求:
使用
net/http
http://127.0.0.1:5000/api/v1/generate
Content-Type
application/json
处理响应:
接收到API的响应后,你需要解析JSON数据,提取生成的文本。通常,API会返回一个包含
results
results
{
"results": [
{
"text": "Golang 是一种由 Google 开发的开源编程语言。它以其简洁的语法、高效的性能和强大的并发支持而闻名。Golang 非常适合构建网络服务、云计算和分布式系统。"
}
]
}完整代码示例:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"log"
)
type RequestBody struct {
Prompt string `json:"prompt"`
MaxNewTokens int `json:"max_new_tokens"`
DoSample bool `json:"do_sample"`
Temperature float64 `json:"temperature"`
TopP float64 `json:"top_p"`
}
type ResponseBody struct {
Results []struct {
Text string `json:"text"`
} `json:"results"`
}
func main() {
// 构建请求体
requestBody := RequestBody{
Prompt: "请用三句话介绍Golang。",
MaxNewTokens: 200,
DoSample: true,
Temperature: 0.7,
TopP: 0.9,
}
requestBodyJson, err := json.Marshal(requestBody)
if err != nil {
log.Fatalf("JSON 序列化错误: %v", err)
}
// 发送HTTP请求
resp, err := http.Post("http://127.0.0.1:5000/api/v1/generate", "application/json", bytes.NewBuffer(requestBodyJson))
if err != nil {
log.Fatalf("HTTP 请求错误: %v", err)
}
defer resp.Body.Close()
// 读取响应
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatalf("读取响应错误: %v", err)
}
// 解析JSON响应
var responseBody ResponseBody
err = json.Unmarshal(body, &responseBody)
if err != nil {
log.Fatalf("JSON 反序列化错误: %v", err)
}
// 提取生成的文本
if len(responseBody.Results) > 0 {
fmt.Println(responseBody.Results[0].Text)
} else {
fmt.Println("未生成任何文本。")
}
}这个例子展示了如何用Go语言向TextGen WebUI发送请求并获取生成的文本。请注意,你需要根据你的TextGen WebUI的配置调整API端点和请求参数。 同时,错误处理部分可以更加完善,例如加入重试机制。
连接池:
net/http
http.Client
Transport
client := &http.Client{
Transport: &http.Transport{
MaxIdleConns: 100,
MaxIdleConnsPerHost: 100,
IdleConnTimeout: 90 * time.Second,
},
}这样可以复用已经建立的TCP连接,减少连接建立和关闭的开销。
并发请求: 如果需要同时处理多个请求,可以使用goroutine和channel来实现并发。 例如,可以创建一个worker pool,将请求分发给worker goroutine处理。
流式响应: TextGen WebUI支持流式响应,可以一边生成文本一边返回,而不是等待所有文本生成完毕才返回。 这可以显著降低延迟。 需要在请求头中设置
"Accept": "text/event-stream"
bufio.NewReader
Gzip压缩: 启用Gzip压缩可以减少网络传输的数据量,提高传输速度。 可以在请求头中设置
"Accept-Encoding": "gzip"
缓存: 对于相同的prompt,可以缓存生成的文本,避免重复计算。 可以使用内存缓存或Redis等外部缓存。
GPU优化: 确保TextGen WebUI充分利用GPU资源。 检查CUDA Toolkit 和 cuDNN 是否正确安装和配置。 适当调整 TextGen WebUI 的启动参数,例如
--threads
--n_batch
prompt
max_new_tokens
temperature
top_p
top_k
typical_p
repetition_penalty
repetition_penalty_range
encoder_repetition_penalty
no_repeat_ngram_size
min_length
do_sample
seed
stop
stream
format
model
具体参数和默认值可能会因为TextGen WebUI的版本和使用的模型而有所不同。 最好参考TextGen WebUI的官方文档或API文档。
http.Client
Timeout
github.com/sony/gobreaker
一个更健壮的错误处理示例:
package main
import (
"bytes"
"encoding/json"
"fmt"
"io/ioutil"
"net/http"
"time"
"log"
)
// ... (RequestBody 和 ResponseBody 定义)
func callAPI(requestBody RequestBody) (string, error) {
requestBodyJson, err := json.Marshal(requestBody)
if err != nil {
return "", fmt.Errorf("JSON 序列化错误: %w", err)
}
client := &http.Client{
Timeout: 10 * time.Second, // 设置超时时间
}
resp, err := client.Post("http://127.0.0.1:5000/api/v1/generate", "application/json", bytes.NewBuffer(requestBodyJson))
if err != nil {
return "", fmt.Errorf("HTTP 请求错误: %w", err)
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return "", fmt.Errorf("读取响应错误: %w", err)
}
if resp.StatusCode != http.StatusOK {
return "", fmt.Errorf("API 返回错误状态码: %d, 响应体: %s", resp.StatusCode, string(body))
}
var responseBody ResponseBody
err = json.Unmarshal(body, &responseBody)
if err != nil {
return "", fmt.Errorf("JSON 反序列化错误: %w, 响应体: %s", err, string(body))
}
if len(responseBody.Results) > 0 {
return responseBody.Results[0].Text, nil
} else {
return "", fmt.Errorf("未生成任何文本")
}
}
func main() {
requestBody := RequestBody{
Prompt: "请用三句话介绍Golang。",
MaxNewTokens: 200,
DoSample: true,
Temperature: 0.7,
TopP: 0.9,
}
result, err := callAPI(requestBody)
if err != nil {
log.Printf("API 调用失败: %v", err)
return
}
fmt.Println(result)
}以上就是Golang对接TextGen WebUI 本地大语言模型API化教程的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号