从零开始:用Shell和Gemini构建问答系统应用

云信安装大师
90
AI 质量分
10 5 月, 2025
3 分钟阅读
0 阅读

从零开始:用Shell和Gemini构建问答系统应用

引言

你是否想过用简单的Shell脚本就能打造一个智能问答系统?本文将带你从零开始,使用Shell脚本结合Google的Gemini API构建一个命令行问答应用。无需复杂框架,只需基础的Shell知识和API调用就能实现!

准备工作

在开始之前,你需要准备:

  1. 一台Linux/macOS电脑(Windows可使用WSL)
  2. 基本的Shell脚本知识
  3. Google账号(用于获取Gemini API密钥)
  4. curljq工具(用于API请求和JSON处理)

安装必要工具

代码片段
# 在Ubuntu/Debian上安装所需工具
sudo apt update && sudo apt install -y curl jq

# 在macOS上使用Homebrew安装
brew install curl jq

获取Gemini API密钥

  1. 访问 Google AI Studio
  2. 登录你的Google账号
  3. 创建新项目并获取API密钥
  4. 将密钥保存在安全位置(我们稍后会用到)

构建问答系统

第一步:创建项目目录

代码片段
mkdir gemini-qa-system && cd gemini-qa-system

第二步:编写Shell脚本

创建一个名为gemini_qa.sh的文件,并添加以下内容:

代码片段
#!/bin/bash

# Gemini QA系统 - Shell脚本实现

# API配置
API_KEY="YOUR_API_KEY"  # 替换为你的实际API密钥
API_URL="https://generativelanguage.googleapis.com/v1beta/models/gemini-pro:generateContent"

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
NC='\033[0m' # No Color

# 检查依赖项
check_dependencies() {
    if ! command -v curl &> /dev/null; then
        echo -e "${RED}错误: curl未安装${NC}"
        exit 1
    fi

    if ! command -v jq &> /dev/null; then
        echo -e "${RED}错误: jq未安装${NC}"
        exit 1
    fi

    if [ -z "$API_KEY" ] || [ "$API_KEY" == "YOUR_API_KEY" ]; then
        echo -e "${RED}错误: 请设置有效的Gemini API密钥${NC}"
        exit 1
    fi
}

# 向Gemini发送请求并获取响应
ask_gemini() {
    local question="$1"

    # JSON请求体构建
    local json_request=$(cat <<EOF
{
    "contents": [{
        "parts": [{
            "text": "$question"
        }]
    }]
}
EOF
)

    # API调用并处理响应
    local response=$(curl -s \
        -H "Content-Type: application/json" \
        -X POST "${API_URL}?key=${API_KEY}" \
        -d "$json_request")

    # 检查错误并提取回答文本
    if echo "$response" | jq -e '.error' > /dev/null; then
        echo -e "${RED}错误: $(echo "$response" | jq -r '.error.message')${NC}"
        return 1
    else
        echo "$response" | jq -r '.candidates[0].content.parts[0].text'
    fi
}

# 主函数
main() {
    check_dependencies

    echo -e "${GREEN}欢迎使用Gemini问答系统!${NC}"
    echo -e "${YELLOW}输入'退出'或'quit'结束对话${NC}\n"

    while true; do
        read -p "你的问题: " question

        if [[ "$question" =~ ^(退出|quit)$ ]]; then
            echo -e "${GREEN}再见!${NC}"
            break
        fi

        if [ -z "$question" ]; then
            continue
        fi

        echo -e "\n${YELLOW}思考中...${NC}\n"

        answer=$(ask_gemini "$question")

        if [ $? -eq 0 ]; then # $?获取上一个命令的退出状态,0表示成功

            # AI回答格式化输出(每行最多80字符)
            echo "$answer" | fold -w80 | sed 's/^/AI: /'

            # AI回答保存到文件(可选)
            timestamp=$(date +"%Y-%m-%d %H:%M:%S")
            echo "[$timestamp] Q: $question" >> qa_history.txt

            # AI回答保存到文件时进行换行处理(每行最多80字符)
            formatted_answer=$(echo "$answer" | fold -w80)
            while IFS= read -r line; do 
                echo "[$timestamp] A: $line" >> qa_history.txt 
            done <<< "$formatted_answer"

            echo "" >> qa_history.txt

            echo ""

        else

            continue

        fi


    done

}

main "$@"

第三步:使脚本可执行并运行

代码片段
chmod +x gemini_qa.sh

# Windows WSL用户可能需要使用以下方式运行:
# bash gemini_qa.sh

./gemini_qa.sh   # macOS/Linux直接运行方式 

代码解析与关键点说明

API请求结构解析

我们使用POST请求向Gemini发送问题,请求体是一个JSON对象:

代码片段
{
   "contents": [{
       "parts": [{
           "text": "你的问题内容"
       }]
   }]
}

JSON响应处理

Gemini返回的响应也是JSON格式,我们使用jq工具提取文本部分:

代码片段
{
   "candidates": [
       {
           "content": {
               "parts": [
                   {"text": "AI的回答内容"}
               ]
           }
       }
   ]
}

提取命令:jq '.candidates[0].content.parts[0].text'

Shell脚本最佳实践

  1. 错误处理:检查依赖项和API响应中的错误信息
  2. 用户友好:添加彩色输出和提示信息
  3. 日志记录:自动保存问答历史到文件
  4. 格式化输出:限制每行字符数提高可读性

常见问题与解决方案

Q1: API返回权限错误?

  • 解决方案
    1. 确认你的API密钥正确
    2. Google Cloud项目中启用Generative Language API
    3. API密钥可能有区域限制

Q2: JSON解析失败?

  • 解决方案
    1. jq工具必须正确安装
    2. curl返回的可能是错误信息而非有效JSON
    3. echo $response | jq .查看原始JSON结构

Q3: Shell脚本在Windows上无法运行?

  • 解决方案
    1. Windows用户请使用WSL(Windows Subsystem for Linux)
    2. Git Bash或Cygwin也可作为替代方案
    3. dos2unix gemini_qa.sh转换换行符

扩展建议与优化方向

  1. 多轮对话:添加上下文记忆功能
  2. 流式输出:实现打字机效果显示AI回答
  3. 本地缓存:缓存常见问题的答案减少API调用

总结与关键点回顾

通过本文你学会了:
✔️ Shell脚本调用REST API的基本方法
✔️ Gemini API的简单集成方式
✔️ JSON数据的处理和解析技巧
✔️ Shell脚本的错误处理和日志记录

这个基础版本已经可以工作,你可以继续扩展它!尝试添加更多功能如多语言支持、敏感词过滤等。


希望这篇教程对你有所帮助!如果有任何问题或改进建议,欢迎在评论区讨论。Happy coding! 🚀

原创 高质量