在Go中使用OpenAI API创建Web搜索工具,需结合搜索引擎(如Google Custom Search)与OpenAI的文本处理能力。以下是分步实现方案:
1. 前提条件准备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. 运行与测试8. 扩展建议- 添加用户界面:使用HTML/CSS或框架(如Gin)构建Web界面。
- 优化搜索逻辑:支持分页、多搜索引擎集成。
- 错误处理增强:添加重试机制、日志记录。
关键点总结- 环境变量管理:通过.env文件安全存储API密钥。
- 模块化设计:分离搜索与文本处理逻辑,便于维护。
- 错误处理:检查HTTP响应、JSON解析等关键步骤。
通过以上步骤,您可构建一个基于Go与OpenAI的智能搜索工具,适用于项目开发或个人学习。