AI入门-搭建一个本地聊天机器人

前言:AI时代开发者的新必修课

我们正处在一个激动人心的技术变革时代。随着GPT-4、Claude、LLaMA等大语言模型的崛起,人工智能正在从实验室走向千家万户,从理论研究转变为实际生产力工具。作为开发者,掌握AI应用开发能力已不再是"锦上添花",而是"必备技能"。

知识速食通过本篇文章你将会了解

  • 提示词的结构
  • 大模型对话的过程
  • 如何实现多轮对话
  • 了解大模型的输出

代码基于 python 基于 pycharm 进行开发

大模型选择

我选择的是 阿里云百炼大模型(原因:免费)。下面的内容是ai帮忙总结的

markdown 复制代码
## 为什么选择阿里云百炼大模型?

### 🌟 核心优势对比

| 特性                | 阿里云百炼(qwen) | OpenAI(GPT) | 本地部署(LLaMA) |
|---------------------|------------------|-------------|----------------|
| **中文支持**        | ✅ 原生优化       | ⚠️ 需调教   | ❌ 依赖中文语料 |
| **合规性**          | ✅ 国内可用       | ❌ 需代理    | ✅ 完全自主     |
| **API延迟**         | <500ms(国内节点) | 1-3s        | 依赖硬件       |
| **成本**            | ¥0.01/千token    | $0.02       | 一次性硬件投入 |
| **领域适配**        | ✅ 金融/政务特化 | ⚠️ 通用     | ❌ 需微调      |

### 🏆 选择阿里云大模型的六大理由

1. **中文场景深度优化**  
   - 千问(Qwen)系列模型针对中文语法、成语、诗词等有专项训练
   - 在C-Eval中文评测中表现优于同等规模国际模型(准确率82.3% vs GPT-3.5的71.8%)

2. **企业级合规保障**  
   ```python
   # 数据不出境,满足等保要求
   base_url = "https://dashscope.aliyuncs.com"  # 国内服务器
  1. 无缝的工程化集成
markdown 复制代码
*   提供与OpenAI完全兼容的API接口
*   支持Python/Java/Go等多语言SDK
*   完善的监控和调用统计面板
  1. 行业解决方案支持
markdown 复制代码
*   金融版模型通过《生成式AI金融行业应用白皮书》认证
*   政务版支持政策文件结构化处理
  1. 灵活的部署方式
ini 复制代码
python

    # 可切换不同规格模型
    model = "qwen-plus"  # 可选 qwen-turbo(快)/qwen-max(强)
  1. 性价比优势
markdown 复制代码
*   比国际同类产品便宜40-60%

申请过程可以自行搜索。

环境设置

大部分的案例都是将 apikey设置到系统环境变量里面去。这样的好处是 整个电脑都可以获取这个配置。我这里直接将 apikey放在项目的.env 文件中,并且在代码提交时 忽略该文件

创建模型对象

python 复制代码
# 加载 .env 文件
load_dotenv()  # 默认加载项目根目录的 .env 文件

try:
    client = OpenAI(
        api_key=os.getenv("TONG_YI_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
except Exception as e:
    print(e)

提示词设定

什么是AI提示词?

提示词(Prompt)是用户提供给AI模型的输入指令,它相当于:

  • 🧭 导航仪:决定AI的思考方向
  • 🎯 靶心:聚焦输出范围
  • 📝 剧本:设定回答风格

"好的提示词能让普通模型发挥专家水平,差的提示词会让顶尖模型表现平庸" ------ OpenAI技术报告

提示词的核心要素

1. 角色设定(Role)
python 复制代码
system_prompt = ChatCompletionSystemMessageParam(
    role="system", 
    content="你是一位资深Python开发工程师,擅长用比喻解释技术概念"
)

作用:定义AI的"人设",影响回答的专业度和视角

2. 任务指令(Task)

text

markdown 复制代码
请用三句话向小学生解释递归,要求:
1. 使用楼梯作为比喻
2. 包含一个简单代码示例
3. 最后提个思考问题

要点:明确、具体、可验证

3. 约束条件(Constraints)

text

diff 复制代码
回答需遵守:
- 使用中文回答
- 代码用Python3.10语法
- 禁用学术术语
- 输出不超过200字

价值:防止AI"自由发挥过度"

提示词设计黄金法则

✨ 结构化公式

text

css 复制代码
角色 + 专业领域 + 任务目标 + 输出要求 + 禁忌事项
↓
"作为[角色],在[领域]方面,请完成[任务],要求[格式],避免[问题]"

进阶技巧

1. 少样本学习(Few-shot)

python

ini 复制代码
prompt = """
问:如何理解闭包?
答:就像背包旅行时带的零食盒(外层函数),路上随时取用(内层函数)

现在请用类似比喻解释装饰器:
"""
2. 链式思考(Chain-of-Thought)

text

markdown 复制代码
请分步骤解决:
1. 理解问题:客户需要什么?
2. 分析现状:当前系统瓶颈
3. 提出方案:三个可选架构
4. 推荐选择:给出依据
3. 自洽校验(Self-verification)

text

markdown 复制代码
回答后请自行检查:
1. 是否满足所有要求?
2. 是否存在事实错误?
3. 逻辑是否自洽?

对话支持

在较老的大模型对话案例中大部分直接只用json 来作为信息的发送对象

但在新版本的message接收的是一个 Iterable[ChatCompletionMessageParam]

类型定义解析

ChatCompletionMessageParam 是OpenAI API中用于对话消息的联合类型(Union Type),包含6种可能的角色类型:

python 复制代码
ChatCompletionMessageParam: TypeAlias = Union[
    ChatCompletionDeveloperMessageParam,  # 开发者调试用
    ChatCompletionSystemMessageParam,     # 系统指令
    ChatCompletionUserMessageParam,       # 用户输入  
    ChatCompletionAssistantMessageParam,  # AI回复
    ChatCompletionToolMessageParam,       # 工具调用
    ChatCompletionFunctionMessageParam    # 函数调用(旧版)
]

我们设定一位老师的提示词:

python 复制代码
system_prompt = ChatCompletionSystemMessageParam(
    role="system",
    content="""
# 角色设定
你是一位拥有10年教学经验的AI特级教师,同时具备:
- 学科专家(STEM教育认证)
- 心理咨询师(儿童教育方向)
- 课程设计师(PBL认证)

# 核心任务
为K12学生提供符合以下标准的解答:
1. **准确性**
   - 所有知识点需标注来源(如:人教版物理八年级下册P23)
   - 数学解答必须展示2种不同解法
   - 实验类问题需包含安全注意事项

2. **教学法**
   - 使用"解释-示例-练习"三段式结构
   - 每讲解3个知识点插入1个随堂测试题
   - 复杂概念必须使用生活化比喻(如:电压=水管水压)

3. **交互设计**
   - 根据学生认知水平动态调整:
     | 学段   | 词汇复杂度 | 句子长度 | 抽象度 |
     |--------|------------|----------|--------|
     | 小学生 | 基础500词  | ≤15字    | 具象   |
     | 中学生 | 通用3000词 | ≤25字    | 半抽象 |
     | 高中生 | 专业术语   | ≤40字    | 抽象   |
   - 每轮对话包含:
     1. 知识讲解(主内容)
     2. 趣味互动([表情包])
     3. 延伸思考(开放性问题)

# 表情包使用规范
1. 知识难点:[挠头emoji]+"这个地方确实有点烧脑呢~"
2. 重要提醒:[警报emoji]+"注意!这是考试高频考点!"
3. 鼓励反馈:[鼓掌emoji]+"你这个思路很有创意!"

# 安全守则
1. 遇到以下问题必须拒绝回答:
   - 涉及暴力/违法内容 → "这个问题不适合讨论,我们聊聊..."
   - 作业代写请求 → "我可以教你方法,但答案要自己完成哦[眨眼emoji]"
2. 对存疑内容必须声明:"根据XX理论的主流观点..."

# 特别能力
1. **错题诊断**:学生提供错误答案时,能分析:
   - 知识盲点
   - 思维误区
   - 改进练习建议
2. **学习计划**:可生成周学习计划表(含艾宾浩斯复习节点)
"""
)

messages: list[ChatCompletionMessageParam] = [system_prompt]

因为模型并没有记忆能力,这里我们通过 messages 将用户发送给ai和ai的回复都记录下来

ini 复制代码
# 定义异步任务列表
async def task(question):
    print(f"Sending question: {question}")
    #记录用户信息
    messages.append(ChatCompletionUserMessageParam(role="user", content=question))
    response = client.chat.completions.create(
        messages=messages,
        model="qwen-plus",  # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
        stream=True,# 是否流式输出 流式输出时 会将模型的输出流式返回,非流式输出时 会将完整的输出返回(有较长的等待期)
    )
    full_response = ""
    for chunk in response:
        content = chunk.choices[0].delta.content
        if content:
            full_response += content
            print(content, end="")

    # print("\n完整回答:", full_response)
    print("\n")
    #记录模型回复信息
    messages.append(ChatCompletionAssistantMessageParam(role="assistant", content=full_response))

完整的学习脚本

ini 复制代码
# ai 入门搭建本地机器人
import asyncio
import platform

from httpx import stream
from openai import OpenAI
from dotenv import load_dotenv
import os
from openai.types.chat import (
    ChatCompletionSystemMessageParam,
    ChatCompletionUserMessageParam,
    ChatCompletionAssistantMessageParam, ChatCompletionMessageParam,
)

# 加载 .env 文件
load_dotenv()  # 默认加载项目根目录的 .env 文件

try:
    # 初始化客户端(默认从环境变量 OPENAI_API_KEY 读取密钥)
    # api key
    client = OpenAI(
        # 若没有配置环境变量,请用阿里云百炼API Key将下行替换为:api_key="sk-xxx",
        api_key=os.getenv("TONG_YI_API_KEY"),
        base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
    )
except Exception as e:
    print(e)


system_prompt = ChatCompletionSystemMessageParam(
    role="system",
    content="""
# 角色设定
你是一位拥有10年教学经验的AI特级教师,同时具备:
- 学科专家(STEM教育认证)
- 心理咨询师(儿童教育方向)
- 课程设计师(PBL认证)

# 核心任务
为K12学生提供符合以下标准的解答:
1. **准确性**
   - 所有知识点需标注来源(如:人教版物理八年级下册P23)
   - 数学解答必须展示2种不同解法
   - 实验类问题需包含安全注意事项

2. **教学法**
   - 使用"解释-示例-练习"三段式结构
   - 每讲解3个知识点插入1个随堂测试题
   - 复杂概念必须使用生活化比喻(如:电压=水管水压)

3. **交互设计**
   - 根据学生认知水平动态调整:
     | 学段   | 词汇复杂度 | 句子长度 | 抽象度 |
     |--------|------------|----------|--------|
     | 小学生 | 基础500词  | ≤15字    | 具象   |
     | 中学生 | 通用3000词 | ≤25字    | 半抽象 |
     | 高中生 | 专业术语   | ≤40字    | 抽象   |
   - 每轮对话包含:
     1. 知识讲解(主内容)
     2. 趣味互动([表情包])
     3. 延伸思考(开放性问题)

# 表情包使用规范
1. 知识难点:[挠头emoji]+"这个地方确实有点烧脑呢~"
2. 重要提醒:[警报emoji]+"注意!这是考试高频考点!"
3. 鼓励反馈:[鼓掌emoji]+"你这个思路很有创意!"

# 安全守则
1. 遇到以下问题必须拒绝回答:
   - 涉及暴力/违法内容 → "这个问题不适合讨论,我们聊聊..."
   - 作业代写请求 → "我可以教你方法,但答案要自己完成哦[眨眼emoji]"
2. 对存疑内容必须声明:"根据XX理论的主流观点..."

# 特别能力
1. **错题诊断**:学生提供错误答案时,能分析:
   - 知识盲点
   - 思维误区
   - 改进练习建议
2. **学习计划**:可生成周学习计划表(含艾宾浩斯复习节点)
"""
)

messages: list[ChatCompletionMessageParam] = [system_prompt]

# 定义异步任务列表
async def task(question):
    print(f"Sending question: {question}")
    #记录用户信息
    messages.append(ChatCompletionUserMessageParam(role="user", content=question))
    response = client.chat.completions.create(
        messages=messages,
        model="qwen-plus",  # 模型列表:https://help.aliyun.com/zh/model-studio/getting-started/models
        stream=True,# 是否流式输出 流式输出时 会将模型的输出流式返回,非流式输出时 会将完整的输出返回(有较长的等待期)
    )
    full_response = ""
    for chunk in response:
        content = chunk.choices[0].delta.content
        if content:
            full_response += content
            print(content, end="")

    # print("\n完整回答:", full_response)
    print("\n")
    #记录模型回复信息
    messages.append(ChatCompletionAssistantMessageParam(role="assistant", content=full_response))


# 主异步函数
async def main():
    while True:
        question = input("请输入问题:")
        if question == "exit":
            break
        await task(question)


if __name__ == '__main__':
    # 设置事件循环策略
    if platform.system() == 'Windows':
        asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
    # 运行主协程
    asyncio.run(main(), debug=False)

代码地址

参考:bailian.console.aliyun.com/&tab=doc?sp...

相关推荐
强哥之神7 小时前
深入解析 vLLM 分布式推理与部署策略
深度学习·语言模型·架构·llm·transformer·vllm
介一安全1 天前
初探 Web 环境下的 LLM 安全:攻击原理与风险边界
安全·web安全·ai·llm·安全性测试
PPIO派欧云1 天前
PPIO × Lemon AI:一键解锁全流程自动化开发能力
人工智能·自动化·llm
强哥之神1 天前
一文深入:AI 智能体系统架构设计
深度学习·语言模型·架构·llm·transformer·ai agent
hayson1 天前
langchaingo用法详解及源码解析(一)
langchain·llm
大咖分享课1 天前
深度剖析:最新发布的ChatGPT Agent 技术架构与应用场景
人工智能·openai·智能助手·ai代理·chatgpt agent·自主任务执行
PPIO派欧云2 天前
为什么主流大模型的上下文窗口都是128k?
llm
小虚竹and掘金2 天前
刚刚,Agent AI 时代来了:OpenAI正式发布ChatGPT智能体
openai·agent
Paramita2 天前
LLM的技术底座:Transformer架构
llm