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

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

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

引言

在当今AI技术快速发展的时代,构建自己的问答系统已经不再是遥不可及的梦想。本文将带你从零开始,使用简单的Shell脚本结合DeepSeek的API,快速搭建一个功能完善的问答系统应用。无需复杂的编程基础,跟着步骤一步步来,你就能拥有自己的智能问答助手!

准备工作

在开始之前,请确保你已准备好以下环境:

  1. Linux/macOS终端(Windows用户可以使用WSL或Git Bash)
  2. 一个可用的DeepSeek API密钥(可在DeepSeek官网申请)
  3. curl命令行工具(通常系统已自带)
  4. jq工具(用于处理JSON数据,可通过sudo apt install jqbrew install jq安装)

第一步:设置API密钥

首先,我们需要安全地存储你的DeepSeek API密钥。

代码片段
# 创建一个配置文件存放API密钥
mkdir -p ~/.deepseek
echo "YOUR_API_KEY_HERE" > ~/.deepseek/api_key
chmod 600 ~/.deepseek/api_key  # 设置权限只允许当前用户访问

注意事项
– 请将YOUR_API_KEY_HERE替换为你实际的API密钥
– 不要将API密钥直接硬编码在脚本中或上传到公开仓库

第二步:创建基础问答脚本

现在我们来编写一个基础的Shell脚本,用于向DeepSeek发送问题并获取回答。

代码片段
#!/bin/bash

# deepseek_qa.sh - 简单的DeepSeek问答系统脚本

# 读取API密钥
API_KEY=$(cat ~/.deepseek/api_key)

# 检查是否提供了问题
if [ -z "$1" ]; then
    echo "使用方法: $0 '你的问题'"
    exit 1
fi

QUESTION="$1"

# 调用DeepSeek API
RESPONSE=$(curl -s -X POST "https://api.deepseek.com/v1/chat/completions" \
     -H "Authorization: Bearer $API_KEY" \
     -H "Content-Type: application/json" \
     -d '{
          "model": "deepseek-chat",
          "messages": [
              {
                  "role": "user",
                  "content": "'"$QUESTION"'"
              }
          ],
          "temperature": 0.7,
          "max_tokens": 2000
     }')

# 提取并显示回答
ANSWER=$(echo "$RESPONSE" | jq -r '.choices[0].message.content')
echo -e "\nDeepSeek回答:\n$ANSWER"

代码解释
1. #!/bin/bash:指定使用Bash解释器执行此脚本
2. API_KEY=$(cat ~/.deepseek/api_key):安全读取之前存储的API密钥
3. if [ -z "$1" ]:检查用户是否输入了问题参数
4. curl命令:向DeepSeek API发送POST请求
5. jq工具:从JSON响应中提取回答内容

第三步:使脚本可执行并测试

保存上面的代码为deepseek_qa.sh后:

代码片段
# 添加执行权限
chmod +x deepseek_qa.sh

# 测试运行(示例问题)
./deepseek_qa.sh "Shell脚本是什么?"

你应该会看到类似这样的输出:

代码片段
DeepSeek回答:
Shell脚本是一种为Shell编写的脚本程序,它可以将一系列命令组合在一起自动执行...

第四步:增强功能 – 交互式问答模式

基础的命令行参数方式虽然简单,但交互体验不佳。让我们改进一下:

代码片段
#!/bin/bash

# deepseek_interactive.sh - DeepSeek交互式问答系统

# 读取API密钥
API_KEY=$(cat ~/.deepseek/api_key)

echo "欢迎使用DeepSeek问答系统 (输入'exit'退出)"
echo "--------------------------------------"

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

    # 检查退出命令
    if [ "$QUESTION" == "exit" ]; then
        echo "再见!"
        exit 0
    fi

    # API调用前显示等待信息
    echo -n "思考中..."

    # 调用DeepSeek API(后台执行以避免阻塞)
    RESPONSE=$(curl -s -X POST "https://api.deepseek.com/v1/chat/completions" \
         -H "Authorization: Bearer $API_KEY" \
         -H "Content-Type: application/json" \
         -d '{
              "model": "deepseek-chat",
              "messages": [
                  {
                      "role": "user",
                      "content": "'"$QUESTION"'"
                  }
              ],
              "temperature": 0.7,
              "max_tokens": 2000,
              "stream": false 
         }')

    # Clear the waiting message and show answer with formatting 
    echo -e "\r\033[K" # \r回到行首, \033[K清除到行尾

    ANSWER=$(echo "$RESPONSE" | jq -r '.choices[0].message.content')

    echo -e "\033[1;34mDeepSeek:\033[0m\n$ANSWER\n"
done

改进点
1. 交互式界面:使用无限循环实现持续对话模式
2. 更好的用户体验:添加了等待提示和彩色输出格式(\033转义序列)
3. 退出机制:输入’exit’可以优雅退出程序

第五步:添加对话历史记忆功能

真正的对话需要上下文记忆。让我们增强这个功能:

代码片段
#!/bin/bash

# deepseek_with_memory.sh - DeepSeek带记忆的问答系统

API_KEY=$(cat ~/.deepseek/api_key)
TEMP_FILE="/tmp/deepseek_conversation_$$.json"

# Initialize conversation history with system message (optional)
echo '[
    {
        "role": "system",
        "content": ""
    }
]' > "$TEMP_FILE"

function cleanup {
    rm -f "$TEMP_FILE"
}
trap cleanup EXIT

echo "# DeepSeek对话系统 (输入'exit'退出) #"
echo "# ---------------------------------- #"

while true; do

    read -p "[你]: "

    if [[ "$REPLY" == exit ]]; then break; fi

    # Add user message to conversation history (using jq)
    jq --arg role user --arg content "$REPLY" \
       '. += [{"role": $role, content: $content}]' \
       "$TEMP_FILE" > "${TEMP_FILE}.tmp"

    mv "${TEMP_FILE}.tmp" "$TEMP_FILE"

    echo "[AI]: ...思考中..."

    RESPONSE=$(curl --silent --show-error --fail-with-body \
         --request POST https://api.deepseek.com/v1/chat/completions \
         --header 'Content-Type: application/json' \
         --header 'Accept: application/json' \
         --header 'Authorization: Bearer '"$API_KEY"'' \
         --data @<(jq '{model: 'deepssek-chat', messages: .}' "$TEMP_FILE"))

    if [[ $? != 0 ]]; then 
        echo "[错误]: API请求失败!响应体:" >&2 
        echo "$RESPONSE" >&2 
        continue 
    fi

    ANSWER=$(jq --raw-output '.choices[0].message.content' <<< "$RESPONSE")

    printf '\r\033[K'

     printf '\033[32m%s\033[m\n%s\n\n' "[AI]:" "$ANSWER"

     # Add assistant response to conversation history 
     jq --arg role assistant --arg content "$ANSWER" \ 
        '. += [{"role": $role, content: $content}]' \ 
        "$TEMP_FILE"> "${TEMP_FILE}.tmp"

      mv "${TEMP_FILE}.tmp""$TEMP_FILE"
done 

printf '\n%s\n''感谢使用!'

关键改进:
1. 对话历史记录:使用临时文件存储整个对话上下文($$表示当前进程ID)
2. jq高级用法:动态更新JSON格式的对话历史记录(更健壮)
3. 错误处理:增加了对失败请求的处理逻辑(显示原始错误响应)

第六步:部署为系统命令(可选)

为了让这个工具更方便使用,我们可以将其安装为系统命令:

代码片段
sudo cp deepseak_with_memory.sh /usr/local/bin/deepseak-ai  
sudo chmod +x /usr/local/bin/deepseak-ai 

#现在可以直接在任何地方运行了!  
deepseak-ai  

常见问题解决

Q1:遇到权限被拒绝错误怎么办?

A1:

代码片段
chmod +x your_script.sh   #给脚本添加执行权限  
./your_script.sh          #正确执行方式(不是sh your_script.sh)  

Q2:CURL返回认证失败错误?

A2:
-确认你的API密钥正确且未过期
-检查~/.deepssek/api_key文件内容是否正确

Q3:响应速度慢怎么办?

A3:
-适当降低max_tokens参数值(如500)
-对于简单问题,可以使用更小的模型(如果有)

Q4:如何保存对话记录?

A4:
修改cleanup函数,将$TEMP_FILE复制到其他位置而非删除

总结

通过本教程,我们完成了:
✅基础Shell与DeepSsek API集成
✅交互式命令行界面开发
✅上下文记忆功能实现
✅系统级部署方法

这个简单的问答系统虽然只有100多行代码,但包含了现代AI应用的核心要素。你可以在此基础上继续扩展:

-添加多轮对话管理逻辑
-集成其他工具调用能力
-开发Web界面版本

希望这篇教程能帮助你快速入门AI应用开发!

原创 高质量