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)}")

 

三,测试效果:

image

posted @ 2026-08-07 23:42  刘宏缔的架构森林  阅读(14)  评论(0)    收藏  举报