如何在GO中使用OpenAI API创建Web搜索工具

高分请问一下,如何在GO中使用OpenAI API创建Web搜索工具
最新回答
逗妇恼

2026-10-23 19:29:51

在Go中使用OpenAI API创建Web搜索工具,需结合搜索引擎(如Google Custom Search)与OpenAI的文本处理能力。以下是分步实现方案:

1. 前提条件准备
  • Go环境:安装Go 1.19或更高版本。
  • API密钥:

    OpenAI API密钥(用于文本摘要生成)。

    Google Custom Search JSON API密钥及搜索引擎ID(或替代搜索API)。

  • 基础能力:熟悉Go语言基础语法及HTTP请求处理。
2. 项目结构搭建

创建以下目录结构:

websearch-go/|-- main.go # 主程序入口|-- search/| |-- search.go # 封装搜索逻辑|-- openai/ |-- openai.go # 封装OpenAI API调用3. 项目初始化与依赖安装
  • 初始化Go模块:mkdir websearch-go && cd websearch-gogo mod init websearch-go
  • 安装依赖库:go get github.com/joho/godotenv # 用于加载环境变量其他依赖(如net/http、encoding/json)为Go标准库,无需额外安装。
4. 环境变量配置

在项目根目录创建.env文件,填写以下内容:

OPENAI_API_KEY=your_openai_api_keyGOOGLE_API_KEY=your_google_api_keyGOOGLE_SEARCH_ENGINE_ID=your_search_engine_id5. 搜索逻辑实现5.1 Google搜索封装(search/search.go)package searchimport ( "encoding/json" "fmt" "net/http" "os")type SearchResult struct { Title string `json:"title"` Link string `json:"link"` Snippet string `json:"snippet"`}func GoogleSearch(query string) ([]SearchResult, error) { apiKey := os.Getenv("GOOGLE_API_KEY") engineID := os.Getenv("GOOGLE_SEARCH_ENGINE_ID") url := fmt.Sprintf("
https://www.googleapis.com/customsearch/v1?q=%s&key=%s&cx=%s"
, query, apiKey, engineID) resp, err := http.Get(url) if err != nil { return nil, err } defer resp.Body.Close() var data map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&data); err != nil { return nil, err } items, ok := data["items"].([]interface{}) if !ok { return nil, fmt.Errorf("no search results found") } var results []SearchResult for _, item := range items { itemMap, ok := item.(map[string]interface{}) if !ok { continue } results = append(results, SearchResult{ Title: itemMap["title"].(string), Link: itemMap["link"].(string), Snippet: itemMap["snippet"].(string), }) } return results, nil}5.2 OpenAI API集成(openai/openai.go)package openaiimport ( "bytes" "encoding/json" "fmt" "net/http" "os")func GenerateSummary(text string) (string, error) { apiKey := os.Getenv("OPENAI_API_KEY") url := "
https://api.openai.com/v1/completions"
requestBody := map[string]interface{}{ "model": "text-davinci-003", "prompt": fmt.Sprintf("Summarize the following text in 2-3 sentences: %s", text), "max_tokens": 100, } jsonBody, err := json.Marshal(requestBody) if err != nil { return "", err } req, err := http.NewRequest("POST", url, bytes.NewBuffer(jsonBody)) if err != nil { return "", err } req.Header.Set("Content-Type", "application/json") req.Header.Set("Authorization", fmt.Sprintf("Bearer %s", apiKey)) client := &http.Client{} resp, err := client.Do(req) if err != nil { return "", err } defer resp.Body.Close() var data map[string]interface{} if err := json.NewDecoder(resp.Body).Decode(&data); err != nil { return "", err } choices, ok := data["choices"].([]interface{}) if !ok || len(choices) == 0 { return "", fmt.Errorf("no response from OpenAI") } summary := choices[0].(map[string]interface{})["text"].(string) return summary, nil}6. 主程序整合(main.go)package mainimport ( "fmt" "log" "os" "websearch-go/openai" "websearch-go/search" "github.com/joho/godotenv")func main() { if err := godotenv.Load(); err != nil { log.Fatal("Error loading .env file") } query := "Go语言编程" results, err := search.GoogleSearch(query) if err != nil { log.Fatal(err) } for _, result := range results { summary, err := openai.GenerateSummary(result.Snippet) if err != nil { log.Printf("Error generating summary: %v", err) continue } fmt.Printf("Title: %snLink: %snSummary: %snn", result.Title, result.Link, summary) }}7. 运行与测试
  • 启动程序:go run main.go
  • 预期输出:

    打印搜索结果的标题、链接及OpenAI生成的摘要。

8. 扩展建议
  • 添加用户界面:使用HTML/CSS或框架(如Gin)构建Web界面。
  • 优化搜索逻辑:支持分页、多搜索引擎集成。
  • 错误处理增强:添加重试机制、日志记录。
关键点总结
  • 环境变量管理:通过.env文件安全存储API密钥。
  • 模块化设计:分离搜索与文本处理逻辑,便于维护。
  • 错误处理:检查HTTP响应、JSON解析等关键步骤。

通过以上步骤,您可构建一个基于Go与OpenAI的智能搜索工具,适用于项目开发或个人学习。