ai相关: 安装LlamaIndex+阿里千问(百炼),创建一个简单的智能客服
一,安装用到的库
1. 安装 LlamaIndex 核心框架及阿里通义千问专属插件
pip install llama-index-core llama-index-llms-dashscope llama-index-embeddings-dashscope
2. 安装 Redis 记忆存储组件(多会话隔离必备)
pip install llama-index-storage-chat-store-redis redis
3,post数据:
$ pip install python-multipart
二,代码
import os
import uuid
from fastapi import FastAPI, Body, HTTPException, Form
from fastapi.middleware.cors import CORSMiddleware
from llama_index.core import VectorStoreIndex, SimpleDirectoryReader, Settings
from llama_index.llms.dashscope import DashScope
from llama_index.embeddings.dashscope import DashScopeEmbedding
from llama_index.core.memory import ChatMemoryBuffer
from llama_index.storage.chat_store.redis import RedisChatStore
app = FastAPI(title="AI 智能客服系统")
# ==================== 1. 配置阿里通义千问模型 ====================
# !!!请在环境变量中设置 DASHSCOPE_API_KEY,或在此处直接硬编码赋值!!!
# DASHSCOPE_API_KEY = os.environ.get("DASHSCOPE_API_KEY", "YOUR_DASHSCOPE_API_KEY")
DASHSCOPE_API_KEY = '此处输入你在阿里云百炼的api_key'
# 全局配置大语言模型 (推荐使用适合复杂业务的 qwen-plus)
Settings.llm = DashScope(
model_name="qwen-plus",
api_key=DASHSCOPE_API_KEY,
temperature=0.1 # 调低随机性,使其严格根据知识库回答
)
# 全局配置向量化模型 (推荐中文性能强大的 v3 版本)
Settings.embed_model = DashScopeEmbedding(
model_name="text-embedding-v3",
api_key=DASHSCOPE_API_KEY
)
# ==================== 2. 全局知识库与 Redis 初始化 ====================
# 检查并创建知识库目录
if not os.path.exists("data"):
os.makedirs("data")
with open("data/sample.txt", "w", encoding="utf-8") as f:
f.write("欢迎使用本公司服务。公司公积金贷款最高额度为120万元,多子女家庭最高可贷144万元。")
# 加载 data 文件夹下的所有文档并建立索引
documents = SimpleDirectoryReader("data").load_data()
global_index = VectorStoreIndex.from_documents(documents)
# 配置 Redis 存储多会话聊天记录(假设 Redis 运行在本地默认端口)
try:
chat_store = RedisChatStore(redis_url="redis://localhost:6379")
except Exception:
print("警告: 无法链接 Redis,本 Demo 将降级使用内存存储。生产环境请务必开启 Redis!")
chat_store = None
# ==================== 3. 智能客服聊天接口 ====================
@app.post("/api/chat")
async def chat_endpoint(
session_id: str = Form(default=None),
message: str = Form(..., description="用户输入的聊天内容")
):
# 如果是新会话,前端没有传 session_id,则后端自动生成一个 UUID
if not session_id:
session_id = str(uuid.uuid4())
# 配置当前会话的历史记忆缓冲区
if chat_store:
memory = ChatMemoryBuffer.from_defaults(
token_limit=3000, # 限制记忆总长度,防止超出大模型窗口
chat_store=chat_store,
chat_store_key=f"user_session:{session_id}" # 在 Redis 中作为 Key 隔离用户
)
else:
# Redis 未启动时的内存降级备用方案
memory = ChatMemoryBuffer.from_defaults(token_limit=3000)
# 创建基于 RAG 的聊天引擎
chat_engine = global_index.as_chat_engine(
chat_mode="condense_plus_context", # 最适合多轮 RAG 客服的模式
memory=memory,
context_prompt=(
"你是一个专业的企业线上智能客服。请严格根据以下参考资料回答用户的问题。\n"
"如果你在资料中找不到答案,请礼貌地回复:'抱歉,我暂时无法回答这个问题,正在为您转接人工客服...'\n"
"参考资料如下:\n"
"---------------------\n"
"{context_str}\n"
"---------------------\n"
)
)
try:
# 执行多轮对话检索与生成
response = chat_engine.chat(message)
return {
"session_id": session_id,
"response": str(response)
}
except Exception as e:
raise HTTPException(status_code=500, detail=f"调用模型失败: {str(e)}")
三,测试效果:

浙公网安备 33010602011771号