当前位置:   article > 正文

智能客服系统实现过程-指南_智能客服系统 怎么实现

智能客服系统 怎么实现

智能客服系统实现步骤

  1. 初始化项目

    • 创建项目目录和必要的文件。
    • 安装所需的 Python 包:Flasksqlite3openairedisnumpyscikit-learnpython-dotenv 等。
  2. 配置数据库和缓存

    • 使用 SQLite 作为数据库存储问答对和用户问题。
    • 使用 Redis 作为缓存,提升查询效率。
  3. 定义 Flask 应用

    • 创建 Flask 应用并配置路由。
    • 实现处理用户问题的 API 端点。
  4. 实现核心功能

    • 编码用户问题。
    • 查找相似问题。
    • 保存用户问题。
    • 动态添加新的问答对。
    • 提供热门词汇查询。

代码实现

1. 初始化项目

创建 app.py 文件并安装相关包:

pip install Flask sqlite3 openai redis numpy scikit-learn python-dotenv
2. 配置数据库和缓存

在项目根目录创建 .env 文件,并在其中添加 OpenAI API 密钥:

OPENAI_API_KEY=your_openai_api_key

创建初始化数据库的脚本 init_db.py

  1. import sqlite3
  2. conn = sqlite3.connect('qa_corpus.db')
  3. cursor = conn.cursor()
  4. # 创建QA语料库表
  5. cursor.execute('''
  6. CREATE TABLE IF NOT EXISTS qa_corpus (
  7. id INTEGER PRIMARY KEY AUTOINCREMENT,
  8. question TEXT NOT NULL,
  9. answer TEXT NOT NULL
  10. )
  11. ''')
  12. # 创建用户问题表
  13. cursor.execute('''
  14. CREATE TABLE IF NOT EXISTS user_questions (
  15. id INTEGER PRIMARY KEY AUTOINCREMENT,
  16. question TEXT NOT NULL,
  17. resolved BOOLEAN NOT NULL
  18. )
  19. ''')
  20. conn.commit()
  21. conn.close()

运行 init_db.py 初始化数据库:

python init_db.py
3. 定义 Flask 应用

在 app.py 中定义 Flask 应用和路由:

  1. from flask import Flask, request, jsonify
  2. import sqlite3
  3. import redis
  4. import numpy as np
  5. from sklearn.feature_extraction.text import TfidfVectorizer
  6. from sklearn.metrics.pairwise import cosine_similarity
  7. import os
  8. from dotenv import load_dotenv
  9. import openai
  10. # 加载环境变量
  11. load_dotenv()
  12. # 配置 Flask 应用
  13. app = Flask(__name__)
  14. # 配置 Redis 连接
  15. redis_client = redis.Redis(host='localhost', port=6379, db=0)
  16. # 配置 OpenAI API 密钥
  17. openai.api_key = os.getenv("OPENAI_API_KEY")
  18. # 配置 SQLite 数据库连接
  19. DATABASE = 'qa_corpus.db'
  20. # 获取数据库连接
  21. def get_db_connection():
  22. conn = sqlite3.connect(DATABASE)
  23. conn.row_factory = sqlite3.Row
  24. return conn
  25. # 缓存语料库
  26. def cache_corpus():
  27. conn = get_db_connection()
  28. cursor = conn.cursor()
  29. cursor.execute('SELECT * FROM qa_corpus')
  30. corpus = cursor.fetchall()
  31. conn.close()
  32. corpus_dict = {row['id']: {'question': row['question'], 'answer': row['answer']} for row in corpus}
  33. # 将语料库缓存到 Redis
  34. redis_client.set('qa_corpus', corpus_dict)
  35. # 获取缓存的语料库
  36. def get_cached_corpus():
  37. corpus = redis_client.get('qa_corpus')
  38. if corpus:
  39. return corpus
  40. else:
  41. cache_corpus()
  42. return redis_client.get('qa_corpus')
4. 实现核心功能
编码用户问题

  1. # 编码用户问题
  2. def encode_question(question):
  3. # 使用 OpenAI 模型对问题进行编码
  4. response = openai.Embedding.create(input=[question], model="text-embedding-ada-002")
  5. embedding = response['data'][0]['embedding']
  6. return np.array(embedding)
查找相似问题

  1. # 查找相似问题
  2. def find_similar_question(encoded_question, corpus):
  3. questions = [qa['question'] for qa in corpus.values()]
  4. # 使用Tf-idf进行特征编码
  5. vectorizer = TfidfVectorizer().fit_transform(questions)
  6. vectors = vectorizer.toarray()
  7. # 计算相似度
  8. similarities = cosine_similarity([encoded_question], vectors)
  9. most_similar_index = np.argmax(similarities)
  10. most_similar_id = list(corpus.keys())[most_similar_index]
  11. similarity = similarities[0][most_similar_index]
  12. return most_similar_id, similarity
保存用户问题
  1. # 保存用户问题到数据库
  2. def save_user_question(question, resolved):
  3. conn = get_db_connection()
  4. cursor = conn.cursor()
  5. cursor.execute('INSERT INTO user_questions (question, resolved) VALUES (?, ?)', (question, resolved))
  6. conn.commit()
  7. conn.close()
处理用户问题的 API 端点

  1. @app.route('/ask', methods=['POST'])
  2. def ask_question():
  3. user_question = request.json.get('question')
  4. # 对用户问题进行编码
  5. encoded_question = encode_question(user_question)
  6. corpus = get_cached_corpus()
  7. similar_question_id, similarity = find_similar_question(encoded_question, corpus)
  8. # 返回相似问题的答案或默认回复
  9. if similarity >= 0.8:
  10. answer = corpus[similar_question_id]['answer']
  11. response = {'answer': answer, 'similarity': similarity}
  12. else:
  13. response = {'answer': '对不起,我无法理解您的问题。', 'similarity': similarity}
  14. # 保存用户问题到数据库
  15. save_user_question(user_question, similarity >= 0.8)
  16. return jsonify(response)
动态添加新的问答对的 API 端点

  1. @app.route('/add_question', methods=['POST'])
  2. def add_question():
  3. question = request.json.get('question')
  4. answer = request.json.get('answer')
  5. conn = get_db_connection()
  6. cursor = conn.cursor()
  7. cursor.execute('INSERT INTO qa_corpus (question, answer) VALUES (?, ?)', (question, answer))
  8. conn.commit()
  9. conn.close()
  10. # 更新缓存
  11. cache_corpus()
  12. return jsonify({'status': 'success', 'message': '问题已成功添加到语料库中。'})
获取热门词汇的 API 端点

  1. @app.route('/hot_words', methods=['GET'])
  2. def hot_words():
  3. conn = get_db_connection()
  4. cursor = conn.cursor()
  5. cursor.execute('SELECT question FROM user_questions')
  6. questions = cursor.fetchall()
  7. conn.close()
  8. # 分词和统计词频
  9. all_words = ' '.join([q['question'] for q in questions]).split()
  10. word_freq = {word: all_words.count(word) for word in set(all_words)}
  11. sorted_word_freq = sorted(word_freq.items(), key=lambda item: item[1], reverse=True)
  12. return jsonify({'hot_words': sorted_word_freq[:10]})

运行 Flask 应用

确保在启动应用之前,已经正确配置了 Redis,并且已经初始化了 SQLite 数据库。

  1. if __name__ == '__main__':
  2. # 首次启动时缓存语料库
  3. cache_corpus()
  4. app.run(host='0.0.0.0', port=5000)

部署和测试

部署
  1. 确保安装并配置 Redis。
  2. 初始化 SQLite 数据库(运行 init_db.py)。
  3. 设置 OpenAI API 密钥(在 .env 文件中或环境变量中)。
  4. 运行 Flask 应用:python app.py
测试

可以使用 curl 或 Postman 来测试 API 端点

  • curl -X POST http://localhost:5000/ask -H "Content-Type: application/json" -d '{"question": "你们的营业时间是?"}'
    
  • curl -X POST http://localhost:5000/add_question -H "Content-Type: application/json" -d '{"question": "你们的营业时间是?", "answer": "我们每天早上9点到晚上9点营业。"}'
    
  • curl http://localhost:5000/hot_words
    

代码详解

获取数据库连接

  1. def get_db_connection():
  2. # 创建并返回一个 SQLite 数据库连接
  3. conn = sqlite3.connect(DATABASE)
  4. conn.row_factory = sqlite3.Row # 使查询结果以字典形式返回
  5. return conn
缓存语料库

  1. def cache_corpus():
  2. conn = get_db_connection()
  3. cursor = conn.cursor()
  4. cursor.execute('SELECT * FROM qa_corpus')
  5. corpus = cursor.fetchall()
  6. conn.close()
  7. # 将语料库转换为字典形式
  8. corpus_dict = {row['id']: {'question': row['question'], 'answer': row['answer']} for row in corpus}
  9. # 将语料库缓存到 Redis
  10. redis_client.set('qa_corpus', corpus_dict)

获取缓存的语料库

  1. def get_cached_corpus():
  2. # 从 Redis 获取缓存的语料库
  3. corpus = redis_client.get('qa_corpus')
  4. if corpus:
  5. return corpus
  6. else:
  7. # 如果缓存不存在,重新缓存语料库
  8. cache_corpus()
  9. return redis_client.get('qa_corpus')
编码用户问题

  1. def encode_question(question):
  2. # 使用 OpenAI 模型对问题进行编码
  3. response = openai.Embedding.create(input=[question], model="text-embedding-ada-002")
  4. embedding = response['data'][0]['embedding']
  5. return np.array(embedding)
查找相似问题

  1. def find_similar_question(encoded_question, corpus):
  2. # 从语料库中提取所有问题
  3. questions = [qa['question'] for qa in corpus.values()]
  4. # 使用Tf-idf进行特征编码
  5. vectorizer = TfidfVectorizer().fit_transform(questions)
  6. vectors = vectorizer.toarray()
  7. # 计算用户问题与语料库中问题的相似度
  8. similarities = cosine_similarity([encoded_question], vectors)
  9. most_similar_index = np.argmax(similarities)
  10. most_similar_id = list(corpus.keys())[most_similar_index]
  11. similarity = similarities[0][most_similar_index]
  12. return most_similar_id, similarity
保存用户问题

  1. def save_user_question(question, resolved):
  2. # 将用户问题保存到数据库
  3. conn = get_db_connection()
  4. cursor = conn.cursor()
  5. cursor.execute('INSERT INTO user_questions (question, resolved) VALUES (?, ?)', (question, resolved))
  6. conn.commit()
  7. conn.close()

API 端点实现

处理用户问题的 API 端点

  1. @app.route('/ask', methods=['POST'])
  2. def ask_question():
  3. user_question = request.json.get('question')
  4. # 对用户问题进行编码
  5. encoded_question = encode_question(user_question)
  6. corpus = get_cached_corpus()
  7. similar_question_id, similarity = find_similar_question(encoded_question, corpus)
  8. # 返回相似问题的答案或默认回复
  9. if similarity >= 0.8:
  10. answer = corpus[similar_question_id]['answer']
  11. response = {'answer': answer, 'similarity': similarity}
  12. else:
  13. response = {'answer': '对不起,我无法理解您的问题。', 'similarity': similarity}
  14. # 保存用户问题到数据库
  15. save_user_question(user_question, similarity >= 0.8)
  16. return jsonify(response)
动态添加新的问答对的 API 端点

  1. @app.route('/add_question', methods=['POST'])
  2. def add_question():
  3. question = request.json.get('question')
  4. answer = request.json.get('answer')
  5. # 将新的问答对插入到数据库
  6. conn = get_db_connection()
  7. cursor = conn.cursor()
  8. cursor.execute('INSERT INTO qa_corpus (question, answer) VALUES (?, ?)', (question, answer))
  9. conn.commit()
  10. conn.close()
  11. # 更新缓存
  12. cache_corpus()
  13. return jsonify({'status': 'success', 'message': '问题已成功添加到语料库中。'})
获取热门词汇的 API 端点

  1. @app.route('/hot_words', methods=['GET'])
  2. def hot_words():
  3. conn = get_db_connection()
  4. cursor = conn.cursor()
  5. cursor.execute('SELECT question FROM user_questions')
  6. questions = cursor.fetchall()
  7. conn.close()
  8. # 分词和统计词频
  9. all_words = ' '.join([q['question'] for q in questions]).split()
  10. word_freq = {word: all_words.count(word) for word in set(all_words)}
  11. sorted_word_freq = sorted(word_freq.items(), key=lambda item: item[1], reverse=True)
  12. return jsonify({'hot_words': sorted_word_freq[:10]})

运行 Flask 应用

确保在启动应用之前,已经正确配置了 Redis,并且已经初始化了 SQLite 数据库。

  1. if __name__ == '__main__':
  2. # 首次启动时缓存语料库
  3. cache_corpus()
  4. app.run(host='0.0.0.0', port=5000)

部署和测试

部署
  1. 安装 Redis

    • 在本地或服务器上安装并启动 Redis 服务。可以参考 Redis 官方文档进行安装:Redis 安装指南
  2. python init_db.py
    
  3. 设置 OpenAI API 密钥

    • 在项目根目录创建 .env 文件,并添加你的 OpenAI API 密钥。

    OPENAI_API_KEY=your_openai_api_key
    
  4. python app.py
    
测试

可以使用 curl 或 Postman 来测试 API 端点

  • curl -X POST http://localhost:5000/ask -H "Content-Type: application/json" -d '{"question": "你们的营业时间是?"}'
    

    响应示例:

    json

    1. {
    2. "answer": "我们每天早上9点到晚上9点营业。",
    3. "similarity": 0.95
    4. }
  • curl -X POST http://localhost:5000/add_question -H "Content-Type: application/json" -d '{"question": "你们的营业时间是?", "answer": "我们每天早上9点到晚上9点营业。"}'
    

    响应示例:

    json

    1. {
    2. "status": "success",
    3. "message": "问题已成功添加到语料库中。"
    4. }
  • curl http://localhost:5000/hot_words
    

    响应示例:

    json

     
    1. {
    2. "hot_words": [
    3. ["营业时间", 5],
    4. ["你们", 4],
    5. ["是", 3],
    6. ["什么", 2],
    7. ["时间", 2],
    8. ["几点", 1],
    9. ["到", 1],
    10. ["晚上", 1],
    11. ["早上", 1],
    12. ["我们", 1]
    13. ]
    14. }

代码模块的作用及其好处

  1. 数据库模块

    • 作用:存储和管理问答对及用户问题。
    • 好处:持久化存储数据,确保数据的可靠性和一致性。
  2. 缓存模块

    • 作用:使用 Redis 缓存问答对,提升查询效率。
    • 好处:减少数据库查询次数,提高系统响应速度。
  3. 编码模块

    • 作用:使用 OpenAI 模型对用户问题进行编码。
    • 好处:将自然语言转化为向量表示,便于相似度计算。
  4. 相似度计算模块

    • 作用:计算用户问题与语料库中问题的相似度。
    • 好处:找到最相似的问题,提供相关答案,提高用户满意度。
  5. API 模块

    • 作用:提供处理用户问题、添加新问答对、获取热门词汇的 API 接口。
    • 好处:通过标准接口与前端或其他系统集成,提升系统的可扩展性和易用性。

小结

通过上述步骤,我们构建了一个简单的智能客服系统。该系统能够处理用户提问、添加新的问答对,并提供热门词汇查询功能。每个模块的实现都经过详细的解释,确保代码易于理解和维护。希望这些内容对你有所帮助!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/851007
推荐阅读
相关标签
  

闽ICP备14008679号