Skip to content

人工智能开发实战


知识模块

  • L1. ChatGPT 应用
  • L2. 提示词工程
  • L3. 人工智能应用开发平台

目录

  • 实战:多轮对话的聊天机器人
  • 实战:智能问答系统
  • 实战:人工智能服务平台

受众

  • 测试开发工程师
  • Python 开发工程师

实战:多轮对话的聊天机器人

需求:

  1. 编写代码进行多轮对话,设计一个聊天机器人,能够处理用户的连续问题并保持上下文。
  2. 使用循环接收用户输入,并根据上下文生成回复
  3. 再对话结束添加结束条件(如用户输入退出

课堂练习:基本的 API 调用示例

from ollama import Client

client = Client(
    host='https://ollama.ceshiren.com/',
    auth=('ceshiren', 'hogwarts66')
)


def ask_question(prompt):
    response = client.chat(
        model="qwen2:7b",
        messages=[{"role": "user", "content": prompt}],
    )
    return response.message.content


# 发送简单的问题
question = "法国的首都是哪里?"
print(f"问题: {question}")
answer = ask_question(question)
print(f"回答: {answer}")

# 发送不同的问题并观察大模型的回应
question2 = "《杀死一只知更鸟》的作者是谁?"
print(f"\n问题: {question2}")
answer2 = ask_question(question2)
print(f"回答: {answer2}")

# 继续进行提问
question3 = "讲个笑话吧。"
default_answer = ask_question(question3)
print(f"回答: {default_answer}")

实战思路

uml diagram


实战代码

conversation = [
    {"role": "system", "content": "你是一个智能回答小助手"}
]

print("开始聊天吧,输入`exit`退出聊天")
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        break
    conversation.append({"role": "user", "content": user_input})

    response = client.chat(
        model="qwen2:7b",
        messages=conversation
    )

    bot_response = response.message.content
    conversation.append({"role": "assistant", "content": bot_response})
    print(f"小助手: {bot_response}")

实战:智能问答系统

需求:

  1. 使用 ChatGPT API 结合文档内容来回答用户的问题。
  2. 设计一个系统,将用户的问题与文档内容进行匹配,并生成相应的回答。

实现要求:

  1. 准备一个包含信息的文档。
  2. 编写一个 Python 脚本,加载文档并根据用户的问题生成回答。
  3. 使用 API 进行调用,并优化提取的回答。

实战思路

uml diagram


实战代码

document = """
[在这里插入长文档内容]
"""

print("根据文档内容提问吧(输入 'exit' 退出):")
while True:
    user_input = input("You: ")
    if user_input.lower() == "exit":
        break

    messages = [
        {"role": "system", "content": "你是一个智能问答小助手"},
        {"role": "user", "content": f"Document: {document}"},
        {"role": "user", "content": f"Question: {user_input}"}
    ]

    response = client.chat(
        model='qwen2:7b',
        messages=messages,
    )

    answer = response.message.content
    print(f"Answer: {answer}")

实战:人工智能服务平台

  1. 通过人工智能修改简历、模拟面试。
  2. 开发人工智能模拟面试平台。

实战思路

uml diagram


技术架构设计

uml diagram


技术选型

  • 因为功能比较简单,所以技术架构可选择任意的前后端技术。
  • 示例使用 Flask + Template + HTML/CSS 技术

前端界面实现

<!DOCTYPE html>
<head>
    <title>霍格沃兹测试开发学社模拟面试系统</title>
    <link rel="stylesheet" href="{{ url_for('static', filename='main.css') }}"/>
</head>

<body>
<img src="{{ 'https://ceshiren.com/uploads/default/original/1X/809c63f904a37bc0c6f029bbaf4903c27f03ea8a.png' }}"
     class="icon"/>
<h3>霍格沃兹测试开发学社模拟面试系统</h3>
{% if result %}
<div class="result">{{ result }}</div>
{% endif %}
<form action="/" method="post">
    <input type="text" name="msg" placeholder="请先说你好,打个招呼" required/>
    <input type="submit" value="开始面试"/>
</form>
</body>

后端服务实现

通过变量message记录和大模型的历史交互信息。

# 发送的历史消息
messages = []

从前端获取到用户的输入信息,并将从大模型获取到的响应展示到界面上。 - 如果是第一次,则使用预制的prompt。 - 不是第一次,则接受响应信息。

from ollama import Client
from flask import Flask, request, redirect, url_for, render_template

# 创建 flask 实例
app = Flask(__name__)

messages = []

# 创建 Ollama 实例
client = Client(
    host='https://ollama.ceshiren.com/',
    auth=('ceshiren', 'hogwarts66')
)

# 定义路由
@app.route("/", methods=("GET", "POST"))
def index():
    if request.method == "POST":
        # 获取前端的用户输入信息
        user_msg = request.form["msg"]
        # 定义要发送给 Ollama 接口的信息
        if messages:
            # 有上下文历史
            messages.append({
                'role': 'user',
                # 把用户输入的信息直接发给 Ollama
                'content': user_msg
            })
        else:
            # 第一次初始化
            messages.append({
                'role': 'user',
                # 把最初的提示词发送给 openai
                'content': generate_prompt(user_msg)
            })
        # 打印创建好的信息
        print(f"messages: {messages}")
        # 调用 Ollama 自带的方法,向 Ollama 服务器发出请求,并获取响应
        response = client.chat(
            model='qwen2:7b',
            messages=messages
        )
        # 从响应内容中提取 Ollama 回复的内容
        answer = response.message.content
        # 打印回复内容
        print(f"answer: {answer}")
        # 刷新首页,返回答案信息
        # result 参数会拼接在 index 视图函数对应路由的后方
        # http://xx/?result=xxx
        return redirect(url_for("index", result=answer))
    # 获取拼接在 url 中的 result 参数的值,如果没有携带 result,则 result 值为空
    result = request.args.get("result")
    print(f"result = {result}")
    # 第一次进入首页,result 为空,输入框上方不显示内容
    return render_template("index.html", result=result)


def generate_prompt(msg):
    # 定义提示词
    prompt_msg = f"""你是一名软件测试工程师,你了解软件测试的技术与经验,你需要面试应聘者。
    我是应聘者,你会问我这个职位的面试问题。
    我希望你只以面试官的身份回答,一次只问一个问题,问我问题并等待我的回答。
    当我说结束面试的时候给出我的面试表现的评价和我的改进方向。
    我的输入是 {msg}
    """
    # 返回提示词
    return prompt_msg


if __name__ == '__main__':
    app.run(debug=True)

总结

  • 掌握 Ollama API 的调用方式
  • 了解一个人工智能平台的基本设计思路。
  • 通过前后端开发的技术,实现一个基本的模拟面试平台。