通辽做网站0475seo,影响网站建设价格的因素有,教育机构网站源码,企业网站建设要多Phi-3-mini-128k-instruct实战教程#xff1a;Chainlit添加用户身份认证模块 1. 引言 想象一下#xff0c;你刚刚用Chainlit为你的Phi-3-mini-128k-instruct模型搭建了一个漂亮的对话界面#xff0c;功能一切正常#xff0c;回答也很智能。但当你准备把它分享给团队成员或…Phi-3-mini-128k-instruct实战教程Chainlit添加用户身份认证模块1. 引言想象一下你刚刚用Chainlit为你的Phi-3-mini-128k-instruct模型搭建了一个漂亮的对话界面功能一切正常回答也很智能。但当你准备把它分享给团队成员或者部署到内网使用时一个现实问题摆在了面前谁都能直接访问没有任何权限控制。这就像给自家大门装了一把智能锁结果发现锁是坏的任何人都能推门而入。模型服务本身可能没什么敏感信息但无限制的访问会带来几个麻烦你无法追踪是谁在使用、无法控制使用频率、更无法为不同用户提供差异化的体验。今天我们就来解决这个问题。我将带你一步步为基于Chainlit的Phi-3-mini对话应用添加一个简单但实用的用户身份认证模块。不需要复杂的第三方服务用Chainlit自带的功能加上一点Python代码就能实现基本的登录验证。学完这篇教程你将掌握如何理解Chainlit的认证机制如何创建和管理用户凭据如何实现一个基础的登录界面如何将认证模块与现有的Phi-3模型服务结合整个过程就像给房子加装门锁一样既保护了你的应用又不会影响原有的居住体验。让我们开始吧。2. 环境与项目准备在开始添加认证功能之前我们需要先确保基础环境已经就绪。如果你已经按照之前的教程部署好了Phi-3-mini和Chainlit可以跳过环境检查部分。2.1 确认现有环境首先让我们检查一下关键组件是否正常运行# 检查vLLM服务是否在运行 ps aux | grep vllm # 检查模型日志确认Phi-3-mini-128k-instruct已加载 tail -f /root/workspace/llm.log如果看到类似下面的输出说明模型服务正常INFO 07-10 14:30:15 vllm.engine.arg_utils: Model: microsoft/Phi-3-mini-128k-instruct INFO 07-10 14:30:15 vllm.engine.arg_utils: Tokenizer: microsoft/Phi-3-mini-128k-instruct INFO 07-10 14:30:18 vllm.engine.llm_engine: Initializing an LLM engine with config...2.2 查看当前的Chainlit应用假设你现有的Chainlit应用结构是这样的phi3_chainlit_app/ ├── app.py # 主应用文件 ├── chainlit.md # 应用描述文件 └── requirements.txt # 依赖包列表你的app.py可能长这样简化版import chainlit as cl from vllm import LLM, SamplingParams # 初始化模型实际部署中可能在其他地方 # llm LLM(modelmicrosoft/Phi-3-mini-128k-instruct) cl.on_chat_start async def start_chat(): await cl.Message(content你好我是基于Phi-3-mini的AI助手有什么可以帮你的).send() cl.on_message async def main(message: cl.Message): # 这里应该是调用vLLM API的代码 # response llm.generate(message.content) response_text f模拟回复我已收到你的消息{message.content} await cl.Message(contentresponse_text).send()2.3 安装必要的依赖虽然Chainlit自带认证功能但我们可能需要一些额外的库来管理用户数据。确保你的requirements.txt包含chainlit1.0.0 python-dotenv1.0.0 bcrypt4.0.0 # 用于密码加密如果还没有安装运行pip install -r requirements.txt3. Chainlit认证机制解析在动手编码之前我们先花点时间理解Chainlit的认证系统是如何工作的。这能帮你更好地理解后面的实现逻辑。3.1 认证的基本流程Chainlit的认证流程可以概括为以下几个步骤用户访问应用用户在浏览器中打开Chainlit应用地址检查认证配置Chainlit检查是否启用了认证功能显示登录界面如果启用了认证用户会看到登录表单验证凭据用户输入用户名和密码应用进行验证创建会话验证通过后Chainlit创建用户会话正常使用用户进入主聊天界面开始与模型交互整个过程对用户来说是透明的他们只需要登录一次后续的对话都在认证后的上下文中进行。3.2 Chainlit的认证装饰器Chainlit提供了cl.password_auth_callback装饰器这是实现自定义认证的关键。你需要定义一个函数这个函数接收用户名和密码然后返回一个cl.User对象如果验证成功或None如果验证失败。基本结构如下import chainlit as cl cl.password_auth_callback def auth_callback(username: str, password: str): # 在这里验证用户名和密码 if 验证通过: return cl.User(identifierusername, metadata{role: user}) else: return None3.3 用户数据存储考虑Chainlit本身不提供用户管理功能这意味着你需要自己决定如何存储和验证用户凭据。常见的选择有环境变量适合少量固定用户最简单配置文件如JSON或YAML文件易于管理数据库适合用户数量多或需要动态管理的场景外部认证服务如OAuth、LDAP等考虑到我们的目标是快速实现一个可用的认证模块我会选择使用环境变量配置文件的方式这样既简单又足够安全。4. 实现基础认证模块现在让我们开始编写代码。我们将创建一个完整的认证系统包括用户管理、密码加密和登录验证。4.1 创建用户管理模块首先创建一个新的Python文件auth_manager.py专门处理用户相关的逻辑# auth_manager.py import bcrypt import json import os from typing import Dict, Optional, List from dataclasses import dataclass, asdict dataclass class User: 用户数据类 username: str password_hash: str # 存储加密后的密码 role: str user enabled: bool True def verify_password(self, password: str) - bool: 验证密码是否正确 try: return bcrypt.checkpw(password.encode(utf-8), self.password_hash.encode(utf-8)) except: return False class UserManager: 用户管理器 def __init__(self, users_file: str users.json): self.users_file users_file self.users: Dict[str, User] {} self.load_users() def load_users(self): 从文件加载用户数据 if os.path.exists(self.users_file): try: with open(self.users_file, r, encodingutf-8) as f: data json.load(f) for user_data in data: user User(**user_data) self.users[user.username] user print(f已加载 {len(self.users)} 个用户) except Exception as e: print(f加载用户文件失败: {e}) self.users {} else: # 如果文件不存在创建默认管理员用户 self.create_default_admin() def save_users(self): 保存用户数据到文件 try: users_data [asdict(user) for user in self.users.values()] with open(self.users_file, w, encodingutf-8) as f: json.dump(users_data, f, ensure_asciiFalse, indent2) print(用户数据已保存) except Exception as e: print(f保存用户数据失败: {e}) def create_default_admin(self): 创建默认管理员账户 default_password os.getenv(DEFAULT_ADMIN_PASSWORD, admin123) self.add_user(admin, default_password, admin) print(已创建默认管理员账户: admin) def hash_password(self, password: str) - str: 加密密码 salt bcrypt.gensalt() hashed bcrypt.hashpw(password.encode(utf-8), salt) return hashed.decode(utf-8) def add_user(self, username: str, password: str, role: str user) - bool: 添加新用户 if username in self.users: print(f用户 {username} 已存在) return False password_hash self.hash_password(password) user User(usernameusername, password_hashpassword_hash, rolerole) self.users[username] user self.save_users() print(f用户 {username} 添加成功) return True def authenticate(self, username: str, password: str) - Optional[User]: 验证用户凭据 user self.users.get(username) if user and user.enabled and user.verify_password(password): return user return None def list_users(self) - List[Dict]: 列出所有用户不包含密码哈希 return [ { username: user.username, role: user.role, enabled: user.enabled } for user in self.users.values() ] def update_user_role(self, username: str, role: str) - bool: 更新用户角色 if username in self.users: self.users[username].role role self.save_users() return True return False def disable_user(self, username: str) - bool: 禁用用户 if username in self.users: self.users[username].enabled False self.save_users() return True return False # 全局用户管理器实例 user_manager UserManager()这个用户管理器提供了完整的用户管理功能密码使用bcrypt加密存储确保安全用户数据保存在JSON文件中便于管理支持添加、验证、列出、更新和禁用用户自动创建默认管理员账户4.2 创建环境配置文件为了让配置更灵活我们创建一个.env文件来管理敏感信息# .env # 默认管理员密码首次运行时会使用这个密码创建admin账户 DEFAULT_ADMIN_PASSWORDyour_secure_password_here # 是否启用认证true/false ENABLE_AUTHtrue # Session配置 SESSION_SECRET_KEYyour_session_secret_key_here SESSION_MAX_AGE86400 # 24小时单位秒然后创建一个配置加载模块config.py# config.py import os from dotenv import load_dotenv # 加载环境变量 load_dotenv() class Config: 应用配置 # 认证相关配置 ENABLE_AUTH os.getenv(ENABLE_AUTH, true).lower() true DEFAULT_ADMIN_PASSWORD os.getenv(DEFAULT_ADMIN_PASSWORD, admin123) # Session配置 SESSION_SECRET_KEY os.getenv(SESSION_SECRET_KEY, change_this_to_a_random_string) SESSION_MAX_AGE int(os.getenv(SESSION_MAX_AGE, 86400)) # 模型配置 MODEL_NAME microsoft/Phi-3-mini-128k-instruct API_BASE_URL os.getenv(API_BASE_URL, http://localhost:8000/v1) classmethod def validate(cls): 验证配置 if cls.ENABLE_AUTH and cls.DEFAULT_ADMIN_PASSWORD admin123: print(警告建议修改默认管理员密码) if cls.SESSION_SECRET_KEY change_this_to_a_random_string: print(警告建议设置一个随机的SESSION_SECRET_KEY) # 验证配置 Config.validate()4.3 集成认证到Chainlit应用现在让我们修改主应用文件app.py集成认证功能# app.py import chainlit as cl from chainlit.types import AskFileResponse import requests import json from typing import Optional # 导入我们的模块 from auth_manager import user_manager from config import Config # 设置Chainlit配置 cl.instrument_openai False # 禁用OpenAI监控 # 认证回调函数 cl.password_auth_callback def auth_callback(username: str, password: str) - Optional[cl.User]: 处理用户登录认证 # 如果未启用认证允许所有访问 if not Config.ENABLE_AUTH: return cl.User(identifierguest, metadata{role: guest, auth_disabled: True}) # 验证用户凭据 user user_manager.authenticate(username, password) if user: print(f用户 {username} 登录成功) return cl.User( identifieruser.username, metadata{ role: user.role, username: user.username } ) else: print(f用户 {username} 登录失败) return None # 可选的自定义登录界面文案 cl.header_auth_callback def header_auth_callback(headers) - Optional[cl.User]: 如果需要HTTP头认证可以在这里实现 # 这里可以实现基于API Key的认证 # 对于Web界面我们主要用上面的密码认证 return None # 聊天开始时的欢迎消息 cl.on_chat_start async def start_chat(): 聊天开始时的初始化 # 获取当前用户信息 user cl.user_session.get(user) if user: username user.metadata.get(username, 用户) role user.metadata.get(role, user) # 根据用户角色显示不同的欢迎消息 if role admin: welcome_msg f欢迎回来管理员 {username}我是您的Phi-3-mini助手。 else: welcome_msg f你好 {username}我是基于Phi-3-mini的AI助手有什么可以帮你的 # 发送欢迎消息 await cl.Message( contentwelcome_msg, authorPhi-3-mini助手 ).send() # 如果是管理员显示一些管理提示 if role admin: await cl.Message( content提示您拥有管理员权限可以访问所有功能。, author系统提示 ).send() else: # 未认证用户如果禁用了认证 await cl.Message( content你好我是基于Phi-3-mini的AI助手。请注意当前运行在无认证模式下。, authorPhi-3-mini助手 ).send() # 处理用户消息 cl.on_message async def main(message: cl.Message): 处理用户消息并调用模型 # 获取用户信息 user cl.user_session.get(user) username user.metadata.get(username, 匿名用户) if user else 匿名用户 print(f收到来自 {username} 的消息: {message.content[:50]}...) # 显示正在思考的提示 thinking_msg cl.Message(content, authorPhi-3-mini助手) await thinking_msg.send() try: # 调用vLLM API假设vLLM服务运行在8000端口 # 注意实际部署中vLLM可能运行在单独的容器或进程中 api_url f{Config.API_BASE_URL}/completions payload { model: Config.MODEL_NAME, prompt: message.content, max_tokens: 512, temperature: 0.7, top_p: 0.9, stream: False } # 发送请求到vLLM response requests.post(api_url, jsonpayload, timeout60) if response.status_code 200: result response.json() answer result[choices][0][text] # 更新消息内容 thinking_msg.content answer await thinking_msg.update() # 记录对话日志可选 log_entry { username: username, timestamp: cl.utils.get_timestamp(), question: message.content, answer: answer[:100] ... if len(answer) 100 else answer } print(f对话记录: {json.dumps(log_entry, ensure_asciiFalse)}) else: error_msg f模型服务返回错误: {response.status_code} thinking_msg.content error_msg await thinking_msg.update() print(error_msg) except requests.exceptions.ConnectionError: error_msg 无法连接到模型服务请检查vLLM是否正在运行。 thinking_msg.content error_msg await thinking_msg.update() print(error_msg) except Exception as e: error_msg f处理请求时发生错误: {str(e)} thinking_msg.content error_msg await thinking_msg.update() print(error_msg) # 可选的添加上下文菜单管理员功能 cl.action_callback(manage_users) async def on_action(action): 管理用户动作回调 user cl.user_session.get(user) if user and user.metadata.get(role) admin: # 获取用户列表 users user_manager.list_users() # 创建用户列表消息 users_text 当前用户列表\n\n for u in users: status ✓ 启用 if u[enabled] else ✗ 禁用 users_text f- {u[username]} ({u[role]}) - {status}\n await cl.Message(contentusers_text).send() else: await cl.Message(content需要管理员权限才能执行此操作。).send() # 应用启动时的初始化 cl.on_chat_resume async def on_chat_resume(): 当用户重新连接时调用 user cl.user_session.get(user) if user: print(f用户 {user.metadata.get(username)} 重新连接)4.4 创建用户管理工具脚本为了方便管理用户我们创建一个简单的命令行工具user_tool.py# user_tool.py #!/usr/bin/env python3 import sys import getpass from auth_manager import user_manager def print_usage(): 打印使用说明 print(用户管理工具) print(用法: python user_tool.py [命令] [参数]) print() print(命令:) print( list - 列出所有用户) print( add 用户名 - 添加新用户) print( passwd 用户名 - 修改用户密码) print( role 用户名 角色 - 修改用户角色) print( disable 用户名 - 禁用用户) print( enable 用户名 - 启用用户) print( help - 显示此帮助) def main(): if len(sys.argv) 2: print_usage() return command sys.argv[1].lower() if command list: users user_manager.list_users() if not users: print(没有找到用户) return print(f{用户名:15} {角色:10} {状态:8}) print(- * 40) for user in users: status 启用 if user[enabled] else 禁用 print(f{user[username]:15} {user[role]:10} {status:8}) elif command add and len(sys.argv) 3: username sys.argv[2] password getpass.getpass(请输入密码: ) password_confirm getpass.getpass(请再次输入密码: ) if password ! password_confirm: print(错误两次输入的密码不一致) return role input(请输入角色 (默认: user): ) or user if user_manager.add_user(username, password, role): print(f用户 {username} 添加成功) else: print(f添加用户失败可能用户名已存在) elif command passwd and len(sys.argv) 3: username sys.argv[2] # 注意这里需要修改UserManager以支持密码修改 # 实际实现中需要添加update_password方法 print(修改密码功能待实现) elif command role and len(sys.argv) 4: username sys.argv[2] new_role sys.argv[3] if user_manager.update_user_role(username, new_role): print(f用户 {username} 的角色已更新为 {new_role}) else: print(f更新失败用户 {username} 可能不存在) elif command disable and len(sys.argv) 3: username sys.argv[2] if user_manager.disable_user(username): print(f用户 {username} 已禁用) else: print(f禁用失败用户 {username} 可能不存在) elif command enable and len(sys.argv) 3: username sys.argv[2] # 需要添加enable_user方法到UserManager print(启用用户功能待实现) elif command help: print_usage() else: print(未知命令或参数不足) print_usage() if __name__ __main__: main()5. 部署与测试现在我们已经完成了代码编写接下来让我们部署并测试这个带有认证功能的Chainlit应用。5.1 准备部署环境首先确保所有文件都在正确的位置phi3_chainlit_auth/ ├── app.py # 主应用文件已更新 ├── auth_manager.py # 用户管理模块 ├── config.py # 配置模块 ├── user_tool.py # 用户管理工具 ├── .env # 环境变量配置 ├── users.json # 用户数据文件运行后自动生成 ├── chainlit.md # Chainlit应用描述 └── requirements.txt # Python依赖更新requirements.txt确保包含所有必要的依赖chainlit1.0.0 python-dotenv1.0.0 bcrypt4.0.0 requests2.28.0安装依赖pip install -r requirements.txt5.2 配置环境变量编辑.env文件设置安全的密码和密钥# .env - 请修改这些值 DEFAULT_ADMIN_PASSWORDYourStrongPassword123! ENABLE_AUTHtrue SESSION_SECRET_KEYyour_random_string_here_make_it_long_and_complex SESSION_MAX_AGE86400 API_BASE_URLhttp://localhost:8000/v1生成一个随机的SESSION_SECRET_KEYpython -c import secrets; print(secrets.token_urlsafe(32))5.3 启动应用现在我们可以启动Chainlit应用了。首先确保vLLM服务正在运行# 检查vLLM服务状态 curl http://localhost:8000/health如果vLLM没有运行你需要先启动它根据你的部署方式# 示例使用vLLM启动Phi-3-mini # vllm serve microsoft/Phi-3-mini-128k-instruct --port 8000然后启动Chainlit应用# 在应用目录中运行 chainlit run app.py -w-w参数启用自动重载这样你修改代码后应用会自动重启。5.4 测试认证功能打开浏览器访问Chainlit应用默认是http://localhost:8000你应该会看到登录界面首次登录使用用户名admin和你在.env中设置的DEFAULT_ADMIN_PASSWORD登录创建新用户登录后你可以使用user_tool.py创建新用户python user_tool.py add alice测试不同用户退出后用新创建的用户登录测试禁用认证在.env中将ENABLE_AUTH改为false重启应用应该可以直接访问而不需要登录5.5 验证与Phi-3模型的集成登录后尝试与Phi-3-mini模型对话在Chainlit界面中输入问题比如用Python写一个快速排序算法观察响应是否正常检查控制台日志确认用户身份被正确记录你应该能在控制台看到类似这样的日志用户 admin 登录成功 收到来自 admin 的消息: 用Python写一个快速排序算法... 对话记录: {username: admin, timestamp: ..., question: 用Python写一个快速排序算法, answer: 以下是快速排序算法的Python实现...}6. 高级功能与优化基础认证功能已经完成但我们可以进一步优化和扩展。这里提供几个进阶功能的实现思路。6.1 添加基于角色的访问控制不同的用户角色可能有不同的权限。让我们扩展用户管理器支持更细粒度的权限控制# 在auth_manager.py中添加 class PermissionManager: 权限管理器 # 定义角色权限 ROLE_PERMISSIONS { admin: { can_chat: True, can_manage_users: True, can_view_logs: True, can_export_data: True, max_tokens_per_day: 100000, # 每天最大token数 }, user: { can_chat: True, can_manage_users: False, can_view_logs: False, can_export_data: False, max_tokens_per_day: 10000, }, guest: { can_chat: True, can_manage_users: False, can_view_logs: False, can_export_data: False, max_tokens_per_day: 1000, } } classmethod def has_permission(cls, role: str, permission: str) - bool: 检查角色是否有特定权限 role_perms cls.ROLE_PERMISSIONS.get(role, {}) return role_perms.get(permission, False) classmethod def get_quota(cls, role: str, quota_type: str) - int: 获取角色的配额限制 role_perms cls.ROLE_PERMISSIONS.get(role, {}) return role_perms.get(quota_type, 0) # 在User类中添加权限检查方法 dataclass class User: # ... 原有字段 ... def can(self, permission: str) - bool: 检查用户是否有特定权限 return PermissionManager.has_permission(self.role, permission) def get_quota(self, quota_type: str) - int: 获取用户的配额 return PermissionManager.get_quota(self.role, quota_type)然后在主应用中根据权限控制功能# 在app.py中修改消息处理函数 cl.on_message async def main(message: cl.Message): 处理用户消息并调用模型 user_obj cl.user_session.get(user) if not user_obj: await cl.Message(content请先登录).send() return # 检查用户权限 if not user_obj.metadata.get(can_chat, True): await cl.Message(content您的账户没有对话权限).send() return # 检查使用配额简化示例 user_quota user_obj.metadata.get(max_tokens_per_day, 10000) used_tokens user_obj.metadata.get(used_tokens_today, 0) if used_tokens user_quota: await cl.Message(content今日使用额度已用完).send() return # ... 原有的消息处理逻辑 ...6.2 添加使用统计和限制为了合理分配资源我们可以添加使用统计功能# usage_tracker.py import json import time from datetime import datetime, timedelta from typing import Dict, Optional class UsageTracker: 使用情况跟踪器 def __init__(self, stats_file: str usage_stats.json): self.stats_file stats_file self.stats: Dict self.load_stats() def load_stats(self) - Dict: 加载使用统计 try: with open(self.stats_file, r) as f: return json.load(f) except: return {} def save_stats(self): 保存使用统计 with open(self.stats_file, w) as f: json.dump(self.stats, f, indent2) def record_usage(self, username: str, tokens_used: int): 记录用户使用情况 today datetime.now().strftime(%Y-%m-%d) if username not in self.stats: self.stats[username] {} if today not in self.stats[username]: self.stats[username][today] { tokens_used: 0, requests: 0, last_used: time.time() } self.stats[username][today][tokens_used] tokens_used self.stats[username][today][requests] 1 self.stats[username][today][last_used] time.time() self.save_stats() def get_today_usage(self, username: str) - Dict: 获取用户今日使用情况 today datetime.now().strftime(%Y-%m-%d) user_stats self.stats.get(username, {}) return user_stats.get(today, {tokens_used: 0, requests: 0}) def cleanup_old_stats(self, days_to_keep: int 30): 清理旧的使用统计 cutoff_date (datetime.now() - timedelta(daysdays_to_keep)).strftime(%Y-%m-%d) for username in list(self.stats.keys()): dates_to_remove [] for date_str in self.stats[username]: if date_str cutoff_date: dates_to_remove.append(date_str) for date_str in dates_to_remove: del self.stats[username][date_str] # 如果用户没有更多数据删除用户条目 if not self.stats[username]: del self.stats[username] self.save_stats() # 全局使用跟踪器实例 usage_tracker UsageTracker()6.3 添加API密钥认证除了Web界面认证我们还可以添加API密钥支持方便程序调用# api_auth.py import hashlib import secrets from typing import Optional, Dict class ApiKeyManager: API密钥管理器 def __init__(self, api_keys_file: str api_keys.json): self.api_keys_file api_keys_file self.api_keys: Dict[str, Dict] self.load_api_keys() def load_api_keys(self) - Dict: 加载API密钥 try: with open(self.api_keys_file, r) as f: return json.load(f) except: return {} def save_api_keys(self): 保存API密钥 with open(self.api_keys_file, w) as f: json.dump(self.api_keys, f, indent2) def generate_api_key(self, username: str, description: str ) - str: 为用户生成新的API密钥 # 生成随机密钥 api_key secrets.token_urlsafe(32) key_hash hashlib.sha256(api_key.encode()).hexdigest() # 存储密钥哈希不存储原始密钥 self.api_keys[key_hash] { username: username, description: description, created_at: time.time(), last_used: None, is_active: True } self.save_api_keys() return api_key def validate_api_key(self, api_key: str) - Optional[Dict]: 验证API密钥 key_hash hashlib.sha256(api_key.encode()).hexdigest() key_info self.api_keys.get(key_hash) if key_info and key_info.get(is_active, True): # 更新最后使用时间 key_info[last_used] time.time() self.save_api_keys() return key_info return None def revoke_api_key(self, api_key: str) - bool: 撤销API密钥 key_hash hashlib.sha256(api_key.encode()).hexdigest() if key_hash in self.api_keys: self.api_keys[key_hash][is_active] False self.save_api_keys() return True return False # 在Chainlit应用中添加API端点 from fastapi import FastAPI, HTTPException, Header from pydantic import BaseModel app FastAPI() api_key_manager ApiKeyManager() class ChatRequest(BaseModel): prompt: str max_tokens: int 512 temperature: float 0.7 app.post(/api/chat) async def api_chat(request: ChatRequest, x_api_key: str Header(None)): API聊天端点 if not x_api_key: raise HTTPException(status_code401, detailAPI密钥缺失) key_info api_key_manager.validate_api_key(x_api_key) if not key_info: raise HTTPException(status_code401, detail无效的API密钥) # 调用Phi-3模型 # ... 调用模型的代码 ... return {response: 模型回复内容, user: key_info[username]}7. 总结通过这篇教程我们成功为基于Chainlit的Phi-3-mini-128k-instruct应用添加了一个完整的用户身份认证模块。让我们回顾一下实现的关键点7.1 核心成果基础认证系统实现了基于用户名和密码的登录验证使用bcrypt加密存储密码确保安全性。用户管理功能创建了完整的用户管理模块支持用户添加、角色分配、启用/禁用等操作。Chainlit集成通过cl.password_auth_callback装饰器将认证系统无缝集成到Chainlit应用中。配置化管理使用环境变量和配置文件管理敏感信息方便不同环境的部署。使用工具提供了命令行工具方便管理员管理用户账户。7.2 实际应用价值这个认证模块为你的Phi-3-mini应用带来了几个重要好处访问控制只有授权用户才能使用AI对话功能使用追踪可以记录谁在使用、使用了多少资源角色管理不同用户可以有不同权限如管理员、普通用户、访客安全提升密码加密存储防止敏感信息泄露可扩展性模块化设计方便后续添加更多功能7.3 下一步建议如果你想让这个系统更加完善可以考虑添加双因素认证使用手机验证码或认证器应用增加安全性集成第三方登录支持Google、GitHub等OAuth登录实现使用配额限制每个用户的每日使用量防止资源滥用添加审计日志记录所有重要操作便于安全审计优化用户体验添加记住我、密码重置、邮箱验证等功能7.4 部署注意事项在实际部署时请记住修改默认密码首次部署后立即修改admin用户的默认密码保护配置文件确保.env和users.json文件有适当的文件权限启用HTTPS在生产环境中务必使用HTTPS防止密码在传输中被截获定期备份定期备份用户数据和使用统计监控日志关注认证失败日志及时发现异常访问尝试现在你的Phi-3-mini应用已经从一个完全开放的服务变成了一个受控的、可管理的AI对话平台。这不仅提升了安全性也为后续的用户管理、资源分配和功能扩展打下了良好基础。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。