调用大模型API打造AI 智能客服系统实践教程

调用大模型API打造AI 智能客服系统实践教程

1.前言

在用户与人工客服的沟通中,等待时间长、需求难满足等问题频发,企业面临用户流失风险,用户渴望快速精准的答案,企业需要“开源节流”、“降本增效”。对此,利用 AI 大模型打造智能客服成为主流解决方案。本次调用大模型 API,实操构建一个具备知识库的 AI 智能客服系统,有效化解沟通难题。

2.智能客服系统展示

不同以往,这次我选择把智能客服系统页面展示放前头。先让大家伙直观看到系统界面和操作流程,一秒 get 系统全貌,再讲干货内容。要是我先讲一堆理论,大家伙怕是早不耐烦了吧。把页面展示放前面,也是为我后续介绍API调用、知识库、实际开发操作这些干货内容时做铺垫,帮助大家理解理论和代码。

下面是智能客服系统运行后的界面,这个智能客服是支持知识库的上传的。

在这里插入图片描述


实际对话界面如下

在这里插入图片描述


在这里插入图片描述


隔了一段时间再与智能客服进行对话,可以看见智能客服系统能保留我们的历史对话记录,并正常给我们推荐符合要求的手机商品,响应快速。

3.API调用

3.1.大模型API介绍

大模型API是大模型对外提供服务的接口。通过API,开发者不需要了解大模型复杂的内部结构和运行机制,就能将大模型强大的功能集成到自己的应用、系统中。同时我们也可以调用大模型的API对模型进行微调、推理训练等。

3.2.API 调用流程

3.2.1确定调用方式​

用 Python 语言常用的requests库(这个库没安装需要手动安装)来构造请求。我们要根据所选大模型 API 的要求,确定请求的 URL 地址。
平台URL地址:

https://maas-api.lanyun.net/v1/chat/completions

requests库安装命令:

pip install requests

3.2.2构造请求参数​

请求参数是 API 调用的关键部分,它决定了我们向大模型传递的信息以及期望得到的响应形式 。​

在这里插入图片描述
  • 模型相关参数:指定要调用的具体模型名称,在请求参数中明确设置模型参数。

这次智能客服并不需要向用户展示深度思考的思维链,我选择的模型是deepseek -V3模型,这个模型自然语言处理能力不错,最重要是的是响应十分快速,符合智能客服的需要。

“model”: “/maas/deepseek-ai/DeepSeek-V3”

设置生成文本的最大长度(max_tokens),设置为 200,意味着大模型生成的回答不超过 200 个 token。
控制生成文本的随机性(temperature),取值范围在 0 - 1 之间,这里设置为 0.7,生成的文本会相对更具多样性。

API配置核心代码:

# API配置 self.api_config ={"url":"https://maas-api.lanyun.net/v1/chat/completions","api_key":"请替换为实际API密钥",# 请替换为实际API密钥"model":"/maas/deepseek-ai/DeepSeek-V3"}

这里我给一段测试代码,大家可以试试自己的API调用是否成功

import requests url ="https://maas-api.lanyun.net/v1/chat/completions" headers ={"Content-Type":"application/json","Authorization":"Bearer 这里改成自己的API密钥"} data ={"model":"/maas/deepseek-ai/DeepSeek-V3","messages":[{"role":"system","content":"You are a helpful assistant."},{"role":"user","content":"Hello!"}]} response = requests.post(url, headers=headers, json=data)if response.status_code ==200: result = response.json()print(result)else:print(f"请求失败,状态码: {response.status_code}")

调用成功模型是会给我们返回结果的,我利用的是利用Jupyter Notebook环境,当然别的环境也可以测试

在这里插入图片描述

4.知识库

4.1介绍

知识库(Knowledge Base) 是一个系统地存储、管理和组织知识的结构化集合,旨在高效地检索、共享和利用知识。它不仅包含事实、数据和信息,还涵盖规则、经验、理论等经过提炼的知识,通常用于辅助决策、问题解决或信息检索。

4.1.1核心特点

  • 结构化存储:知识通过分类、标签、层级结构或关联关系进行组织,便于快速检索和管理。
  • 知识多样性:包含多种类型的知识
  • 可扩展性:支持持续更新和扩展,通过人工录入、自动抓取或机器学习等方式补充新知识。
  • 应用导向:设计目标明确,服务于特定领域或场景,解决实际问题。

4.1.2知识库与数据库的区别

下面简单从四个方面,区分一下知识库和数据库

在这里插入图片描述

4.2知识库在智能客服中的用途

知识库是智能客服系统的核心,存储产品介绍、使用指南等业务相关知识,经整理分类后,可被系统快速检索匹配用户问题。它能让智能客服快速提供准确答案、保证回答一致、提升响应速度,支持多轮对话与个性化服务,还能辅助人工客服,且可随业务发展更新知识。

4.3知识库文件上传格式

为上传的文件设置可上传的格式,python进行文件操作比较中常见的格式有json、txt格式

在这里插入图片描述


考虑现实生活中知识库需要的格式非常常用的是word文件和pdf文件。若想要我们的知识库支持.docx和.pdf格式文件上传我们需要导入python的第三方库 python-docx 、PyPDF2,这个库没安装的需要我们手动安装。

在这里插入图片描述


打开终端输入安装命令

pip install python-docx PyPDF2

这里显示我已经安装过python-docx库了,只需要安装PyPDF2库就行

在这里插入图片描述


这样我们的知识库就可以支持多种格式上传了。知识库上传文件的函数代码逻辑:

# 新增库:用于处理Word和PDF文件try:from docx import Document import PyPDF2 PDF_SUPPORT =Trueexcept ImportError: PDF_SUPPORT =Falseprint("警告:缺少PyPDF2或python-docx库,无法支持PDF和DOCX格式")classKnowledgeBaseManager:def__init__(self): self.knowledge_base =[] self.vector_index =None# 预留向量索引接口defload_from_file(self, filepath):"""从文件加载知识库,支持多种格式"""try: filename = os.path.basename(filepath)if filepath.endswith('.json'):withopen(filepath,'r', encoding='utf-8')as f: data = json.load(f) self.knowledge_base.extend(data ifisinstance(data,list)else[data])elif filepath.endswith('.txt'):withopen(filepath,'r', encoding='utf-8')as f: self.knowledge_base.extend([{"content": line.strip(),"source": filename}for line in f if line.strip()])elif filepath.endswith('.docx'):# 处理Word文档 doc = Document(filepath) content ="\n".join([para.text for para in doc.paragraphs]) self.knowledge_base.append({"content": content,"source": filename})elif filepath.endswith('.pdf')and PDF_SUPPORT:# 处理PDF文档withopen(filepath,'rb')as f: reader = PyPDF2.PdfReader(f) content =""for page_num inrange(len(reader.pages)): content += reader.pages[page_num].extract_text()+"\n" self.knowledge_base.append({"content": content,"source": filename})else: messagebox.showerror("格式错误",f"不支持的文件格式: {filename}")returnFalsereturnTrueexcept Exception as e: messagebox.showerror("加载错误",f"无法解析文件 {filename}: {str(e)}")returnFalse

这里我演示下实际操作效果,点击我们的智能客服“上传文件”按钮,就能打开文件目录,选择需要的格式上传就OK了。

在这里插入图片描述


这里,我以手机产品介绍为例作为智能客服的知识库上传,上面这个模块是展示我们上传了的文档的列表,下面显示文档具体的内容,最下面是系统操作提示。

在这里插入图片描述

5.智能客服

带知识库的智能客服是融合知识库与智能交互的服务系统。它以结构化知识库为核心,存储产品说明、操作指南等海量专业信息,通过自然语言处理技术理解用户问题,快速匹配知识库内容生成标准化回答。

5.1获取知识库内容

通过遍历知识库中前max_items条内容,将每条内容按格式[知识序号] 内容拼接成字符串返回,实现根据查询获取相关知识库内容。

defget_context(self, query, max_items=5):"""获取与查询相关的知识库内容"""return"\n".join(f"[知识{i+1}] {item['content']}"for i, item inenumerate(self.knowledge_base[:max_items]))if self.knowledge_base else""

5.2开场白设置

设置的开场白prompt,符合企业风格。

# 聊天历史 self.conversation =[{"role":"system","content": self.get_system_prompt()},{"role":"assistant","content":"您好!我是您的手机智能助手,很高兴为您服务!关于手机购买、使用教程、故障排查等问题,都可以告诉我,我会尽力为您解答~"}]# 自动显示开场白 self.display_message("客服","您好!我是您的手机智能助手,很高兴为您服务!关于手机购买、使用教程、故障排查等问题,都可以告诉我,我会尽力为您解答~")

5.3窗口布局设计

这里简单说明,系统窗口界面分成两个区域,一个区域用来上传智能客服需要的知识库,另一区域做AI客服与用户对话区域。

defsetup_window(self): self.root.title("AI智能客服系统 v1.0") self.root.geometry("1000x700") self.root.minsize(800,600) self.style = ttk.Style() self.style.configure('TButton', padding=5) self.style.configure('TFrame', background='#f0f0f0')defsetup_ui(self):# 主布局框架 main_frame = ttk.Frame(self.root) main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)# 知识库面板 (左侧30%) knowledge_frame = ttk.LabelFrame(main_frame, text="知识库管理", width=300) knowledge_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(0,10)) knowledge_frame.pack_propagate(False) self.setup_knowledge_ui(knowledge_frame)# 聊天面板 (右侧70%) chat_frame = ttk.Frame(main_frame) chat_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) self.setup_chat_ui(chat_frame)

5.3.1知识库区域

支持用户上传文件,并展示已上传文件的列表,点击文件可浏览文件具体内容。

defsetup_knowledge_ui(self, parent):# 上传按钮区域 upload_frame = ttk.Frame(parent) upload_frame.pack(fill=tk.X, pady=5) ttk.Button(upload_frame, text="上传文件", command=self.upload_knowledge).pack(side=tk.LEFT) ttk.Button(upload_frame, text="清空知识库", command=self.clear_knowledge).pack(side=tk.RIGHT)# 知识库列表 list_frame = ttk.Frame(parent) list_frame.pack(fill=tk.BOTH, expand=True) self.knowledge_list = tk.Listbox( list_frame, selectmode=tk.SINGLE, font=('Microsoft YaHei',10)) self.knowledge_list.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL) scrollbar.config(command=self.knowledge_list.yview) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.knowledge_list.config(yscrollcommand=scrollbar.set)# 知识详情 detail_frame = ttk.LabelFrame(parent, text="知识详情") detail_frame.pack(fill=tk.BOTH, pady=(5,0)) self.knowledge_detail = scrolledtext.ScrolledText( detail_frame, wrap=tk.WORD, font=('Microsoft YaHei',10), height=8) self.knowledge_detail.pack(fill=tk.BOTH, expand=True)
在这里插入图片描述

5.3.2聊天区域

用户可与客服直接用自然语言对话,页面会显示当前聊天的实时时间,(这是这个智能客服的一个小亮点),最下方还会显示系统的操作。

在这里插入图片描述
defsetup_chat_ui(self, parent):# 聊天显示区域self.chat_display = scrolledtext.ScrolledText( parent, wrap=tk.WORD, state='disabled', font=('Microsoft YaHei',12), padx=10, pady=10)self.chat_display.pack(fill=tk.BOTH, expand=True)# 输入区域 input_frame = ttk.Frame(parent) input_frame.pack(fill=tk.X, pady=(5,0))self.user_input = ttk.Entry( input_frame, font=('Microsoft YaHei',12))self.user_input.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0,5)) send_btn = ttk.Button( input_frame, text="发送", command=self.send_message, style='TButton') send_btn.pack(side=tk.RIGHT)# 状态栏self.status_var = tk.StringVar()self.status_var.set("就绪") ttk.Label( parent, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W).pack(fill=tk.X, pady=(5,0))

实际运行效果与对话效果

在这里插入图片描述


AI智能客服系统v1.0界面拥有着三大亮点:

  • 布局合理:界面分区明确,左侧知识库管理区域(页面大小占比30%)便于上传文件、查看知识条目及知识内容详情,右侧聊天区域(页面大小占比70%)专注对话交互,系统信息展示(右下方)和操作互不干扰,用户能快速定位所需功能,使用便捷。
  • 功能直观:“上传文件”、“清空知识库”按钮功能清晰,用户可管理和快速查看知识库内容;聊天窗口消息按时间和角色排列,方便用户回顾对话过程,理解交互逻辑。
  • 专业实用:智能客服能基于知识库为用户推荐手机产品,给出详细产品信息,具备专业知识储备和应用能力,切实满足用户咨询需求。

5.4完整代码

完整的代码给大家做参考,直接用也可以。

import tkinter as tk from tkinter import scrolledtext, messagebox, filedialog, ttk import requests import threading import json import os from datetime import datetime # 新增库:用于处理Word和PDF文件try:from docx import Document import PyPDF2 PDF_SUPPORT =Trueexcept ImportError: PDF_SUPPORT =Falseprint("警告:缺少PyPDF2或python-docx库,无法支持PDF和DOCX格式")classKnowledgeBaseManager:def__init__(self): self.knowledge_base =[] self.vector_index =None# 预留向量索引接口defload_from_file(self, filepath):"""从文件加载知识库,支持多种格式"""try: filename = os.path.basename(filepath)if filepath.endswith('.json'):withopen(filepath,'r', encoding='utf-8')as f: data = json.load(f) self.knowledge_base.extend(data ifisinstance(data,list)else[data])elif filepath.endswith('.txt'):withopen(filepath,'r', encoding='utf-8')as f: self.knowledge_base.extend([{"content": line.strip(),"source": filename}for line in f if line.strip()])elif filepath.endswith('.docx'):# 处理Word文档 doc = Document(filepath) content ="\n".join([para.text for para in doc.paragraphs]) self.knowledge_base.append({"content": content,"source": filename})elif filepath.endswith('.pdf')and PDF_SUPPORT:# 处理PDF文档withopen(filepath,'rb')as f: reader = PyPDF2.PdfReader(f) content =""for page_num inrange(len(reader.pages)): content += reader.pages[page_num].extract_text()+"\n" self.knowledge_base.append({"content": content,"source": filename})else: messagebox.showerror("格式错误",f"不支持的文件格式: {filename}")returnFalsereturnTrueexcept Exception as e: messagebox.showerror("加载错误",f"无法解析文件 {filename}: {str(e)}")returnFalsedefget_context(self, query, max_items=5):"""获取与查询相关的知识库内容"""return"\n".join(f"[知识{i+1}] {item['content']}"for i, item inenumerate(self.knowledge_base[:max_items]))if self.knowledge_base else""classChatApp:def__init__(self, root): self.root = root self.setup_window() self.knowledge_mgr = KnowledgeBaseManager() self.setup_ui() self.setup_bindings()# API配置 self.api_config ={"url":"https://maas-api.lanyun.net/v1/chat/completions","api_key":"请替换为实际API密钥",# 请替换为实际API密钥"model":"/maas/deepseek-ai/DeepSeek-V3"}# 聊天历史 self.conversation =[{"role":"system","content": self.get_system_prompt()},{"role":"assistant","content":"您好!我是您的手机智能助手,很高兴为您服务!关于手机购买、使用教程、故障排查等问题,都可以告诉我,我会尽力为您解答~"}]# 自动显示开场白 self.display_message("客服","您好!我是您的手机智能助手,很高兴为您服务!关于手机购买、使用教程、故障排查等问题,都可以告诉我,我会尽力为您解答~")defsetup_window(self): self.root.title("AI智能客服系统 v1.0") self.root.geometry("1000x700") self.root.minsize(800,600) self.style = ttk.Style() self.style.configure('TButton', padding=5) self.style.configure('TFrame', background='#f0f0f0')defsetup_ui(self):# 主布局框架 main_frame = ttk.Frame(self.root) main_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=10)# 知识库面板 (左侧30%) knowledge_frame = ttk.LabelFrame(main_frame, text="知识库管理", width=300) knowledge_frame.pack(side=tk.LEFT, fill=tk.Y, padx=(0,10)) knowledge_frame.pack_propagate(False) self.setup_knowledge_ui(knowledge_frame)# 聊天面板 (右侧70%) chat_frame = ttk.Frame(main_frame) chat_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True) self.setup_chat_ui(chat_frame)defsetup_knowledge_ui(self, parent):# 上传按钮区域 upload_frame = ttk.Frame(parent) upload_frame.pack(fill=tk.X, pady=5) ttk.Button(upload_frame, text="上传文件", command=self.upload_knowledge).pack(side=tk.LEFT) ttk.Button(upload_frame, text="清空知识库", command=self.clear_knowledge).pack(side=tk.RIGHT)# 知识库列表 list_frame = ttk.Frame(parent) list_frame.pack(fill=tk.BOTH, expand=True) self.knowledge_list = tk.Listbox( list_frame, selectmode=tk.SINGLE, font=('Microsoft YaHei',10)) self.knowledge_list.pack(side=tk.LEFT, fill=tk.BOTH, expand=True) scrollbar = ttk.Scrollbar(list_frame, orient=tk.VERTICAL) scrollbar.config(command=self.knowledge_list.yview) scrollbar.pack(side=tk.RIGHT, fill=tk.Y) self.knowledge_list.config(yscrollcommand=scrollbar.set)# 知识详情 detail_frame = ttk.LabelFrame(parent, text="知识详情") detail_frame.pack(fill=tk.BOTH, pady=(5,0)) self.knowledge_detail = scrolledtext.ScrolledText( detail_frame, wrap=tk.WORD, font=('Microsoft YaHei',10), height=8) self.knowledge_detail.pack(fill=tk.BOTH, expand=True)defsetup_chat_ui(self, parent):# 聊天显示区域 self.chat_display = scrolledtext.ScrolledText( parent, wrap=tk.WORD, state='disabled', font=('Microsoft YaHei',12), padx=10, pady=10) self.chat_display.pack(fill=tk.BOTH, expand=True)# 输入区域 input_frame = ttk.Frame(parent) input_frame.pack(fill=tk.X, pady=(5,0)) self.user_input = ttk.Entry( input_frame, font=('Microsoft YaHei',12)) self.user_input.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=(0,5)) send_btn = ttk.Button( input_frame, text="发送", command=self.send_message, style='TButton') send_btn.pack(side=tk.RIGHT)# 状态栏 self.status_var = tk.StringVar() self.status_var.set("就绪") ttk.Label( parent, textvariable=self.status_var, relief=tk.SUNKEN, anchor=tk.W ).pack(fill=tk.X, pady=(5,0))defsetup_bindings(self): self.user_input.bind("<Return>",lambda e: self.send_message()) self.knowledge_list.bind("<<ListboxSelect>>", self.show_knowledge_detail)defupload_knowledge(self): filetypes =[("所有支持的文件","*.txt *.json *.docx *.pdf"),("Word文档","*.docx"),("PDF文档","*.pdf"),("JSON文件","*.json"),("文本文件","*.txt"),("所有文件","*.*")] filepath = filedialog.askopenfilename(filetypes=filetypes)if filepath:if self.knowledge_mgr.load_from_file(filepath): self.update_knowledge_list() self.status_var.set(f"已加载知识库: {os.path.basename(filepath)}")else: self.status_var.set("知识库加载失败")defclear_knowledge(self): self.knowledge_mgr.knowledge_base =[] self.update_knowledge_list() self.knowledge_detail.delete(1.0, tk.END) self.status_var.set("知识库已清空")defupdate_knowledge_list(self): self.knowledge_list.delete(0, tk.END)for idx, item inenumerate(self.knowledge_mgr.knowledge_base[:200]): content = item.get('content','').strip()# 使用get方法避免键错误 self.knowledge_list.insert(tk.END,f"{idx+1}. {content[:50]}...")defshow_knowledge_detail(self, event): selection = self.knowledge_list.curselection()if selection:try: item = self.knowledge_mgr.knowledge_base[selection[0]] self.knowledge_detail.delete(1.0, tk.END)ifisinstance(item,dict): self.knowledge_detail.insert(tk.END,f"来源: {item.get('source','未知')}\n\n"f"内容:\n{item.get('content','')}")else: self.knowledge_detail.insert(tk.END,str(item))except IndexError: messagebox.showerror("索引错误","知识库条目已被删除")defget_system_prompt(self): knowledge_context = self.knowledge_mgr.get_context("")returnf"""你是专业客服助手,请根据以下知识库内容回答问题: {knowledge_context} 回答要求: 1. 优先使用知识库内容 2. 保持专业礼貌 3. 不知道的内容明确说明 4. 回答简明扼要"""defsend_message(self): user_input = self.user_input.get().strip()ifnot user_input:return self.user_input.delete(0, tk.END) self.display_message("用户", user_input)# 添加到对话历史 self.conversation.append({"role":"user","content": user_input})# 获取知识库上下文并更新系统提示 knowledge_context = self.knowledge_mgr.get_context(user_input) self.conversation[0]['content']= self.get_system_prompt().replace("{knowledge_context}", knowledge_context )# 启动线程调用API threading.Thread(target=self.call_ai_api, daemon=True).start()defcall_ai_api(self):try:# 构建请求头 headers ={"Content-Type":"application/json","Authorization":f"Bearer {self.api_config['api_key']}"}# 构建请求体(确保messages为列表) data ={"model": self.api_config["model"],"messages": self.conversation.copy()# 使用copy避免修改原列表}# 打印调试信息print("=== 发起API请求 ===")print("URL:", self.api_config["url"])print("请求头:", headers)print("请求体:", json.dumps(data, indent=2))# 发送请求 response = requests.post( self.api_config["url"], headers=headers, json=data, timeout=15)# 处理响应if response.status_code ==200: result = response.json()print("API响应:", result)# 提取回复内容(根据实际API响应格式调整) ai_answer = result.get("choices",[{}])[0].get("message",{}).get("content","")if ai_answer: self.display_message("客服", ai_answer)# 更新对话历史 self.conversation.append({"role":"assistant","content": ai_answer}) self.status_var.set("回答已生成")else: self.status_var.set("API返回空内容") messagebox.showerror("API响应错误","接收到的回复内容为空")else: error_msg =f"API错误:状态码{response.status_code},详情:{response.text}" messagebox.showerror("API调用失败", error_msg)print("=== API请求失败 ===")print(error_msg) self.status_var.set("API调用失败")except Exception as e: error_msg =f"系统异常:{str(e)}" messagebox.showerror("系统错误", error_msg)print("=== 系统错误 ===")print(error_msg) self.status_var.set("系统异常")defdisplay_message(self, role, content): timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") self.chat_display.configure(state='normal') self.chat_display.insert(tk.END,f"[{timestamp}] {role}: {content}\n","tag") self.chat_display.configure(state='disabled') self.chat_display.see(tk.END)if __name__ =="__main__": root = tk.Tk() app = ChatApp(root) root.mainloop()

6.总结

调用大模型API,在智能客服服务场景中,我们实现了带知识库的智能客服系统,智能客服借助统一知识库保障回答一致性、支持动态更新适配业务迭代,精准匹配用户问题,实现长时间高效服务,AI智能客服还能通过多轮对话解决复杂问题,适用于电商、金融等领域,助力企业降本增效的同时还提升用户满意度,构建智能化服务体系。

Read more

如何利用简单的浏览器插件Web Scraper爬取知乎评论数据

如何利用简单的浏览器插件Web Scraper爬取知乎评论数据

一、简单介绍: Web Scraper 的优点就是对新手友好,在最初抓取数据时,把底层的编程知识和网页知识都屏蔽了,可以非常快的入门,只需要鼠标点选几下,几分钟就可以搭建一个自定义的爬虫。 我在过去的半年里,写了很多篇关于 Web Scraper 的教程,本文类似于一篇导航文章,把爬虫的注意要点和我的教程连接起来。最快一个小时,最多一个下午,就可以掌握 Web Scraper 的使用,轻松应对日常生活中的数据爬取需求。 像这样的网页数据,想要通过网页爬虫的方式获取数据,可以下载web scraper进行爬虫 这是常见的网页类型: 1.单页 单页是最常见的网页类型。 我们日常阅读的文章,推文的详情页都可以归于这种类型。作为网页里最简单最常见的类型,Web Scraper 教程里就拿豆瓣电影作为案例,入门 Web Scraper 的基础使用。 2.分页列表 分页列表也是非常常见的网页类型。 互联网的资源可以说是无限的,当我们访问一个网站时,不可能一次性把所有的资源都加载到浏览器里。现在的主流做法是先加载一部分数据,随着用户的交互操作(

15. Web可访问性最佳实践:让每个用户都能平等访问

15. Web可访问性最佳实践:让每个用户都能平等访问 引言 Web 可访问性是前端开发的重要组成部分,它确保所有用户,包括残障人士,都能平等地访问和使用网站。作为一名把代码当散文写的 UI 匠人,我始终认为:好的设计不仅要美观,更要包容。就像一首好的音乐,不仅要动听,更要让所有人都能欣赏。Web 可访问性,就是为了让这种包容成为现实。 什么是 Web 可访问性? Web 可访问性(Web Accessibility)是指网站、工具和技术能够被所有人使用的程度,无论他们是否有残疾。这包括: * 视觉障碍(如失明、低视力) * 听觉障碍(如耳聋) * 运动障碍(如无法使用鼠标) * 认知障碍(如学习困难) 可访问性的重要性 1. 法律要求:许多国家和地区都有关于 Web 可访问性的法律法规 2. 扩大受众:提高可访问性可以让更多人使用你的网站

保姆级教程| Obsidian +Claudian 搭建AI 时代下最好的知识管理方案

保姆级教程| Obsidian +Claudian 搭建AI 时代下最好的知识管理方案

保姆级教程| Obsidian +Claudian 搭建AI 时代下最好的知识管理方案 OBSIDIAN AI COGNITIONFLOW 让你的笔记从信息坟场变成AI知识引擎 💡把“死笔记”变成“活资产”的终极方案 1一句话变思维导图 COMMAND /obsidian帮我把这篇文章画成思维导图 可拖拽、可展开、可链接——比纯文字清晰 10 倍 2AI 帮你追踪项目进度 CHAT 帮我看看这个项目目前的进展,哪些完成了,哪些还没做 AI 自动读取项目笔记,汇总进度、列出待办、提醒遗漏 3公众号一键排版输出 正文开始 从 Notion 到Obsidian ,从 Roam Research 到 Logseq — 笔记软件永远是效率圈最热的战场。双链、大纲、白板、数据库……我们折腾插件、

A / B测试太慢?AI帮你实时优化实验策略

A / B测试太慢?AI帮你实时优化实验策略

👋 大家好,欢迎来到我的技术博客! 📚 在这里,我会分享学习笔记、实战经验与技术思考,力求用简单的方式讲清楚复杂的问题。 🎯 本文将围绕AI这个话题展开,希望能为你带来一些启发或实用的参考。 🌱 无论你是刚入门的新手,还是正在进阶的开发者,希望你都能有所收获! 文章目录 * A/B测试太慢?AI帮你实时优化实验策略 🚀 * 为什么传统A/B测试成了效率黑洞? * AI驱动的实时优化:从“被动等待”到“主动决策” * 贝叶斯优化:AI决策的数学引擎 * 代理模型:预测点击率 * 采集函数:决定下一步策略 * 代码实战:用Python实现AI优化A/B测试 * 代码执行结果示例 * 实时决策流程:AI如何动态调整实验? * 实际业务场景:电商大促的AI优化案例 * 贝叶斯优化 vs 其他AI方法 * 如何在你的系统中落地AI优化? * 步骤1:构建基础数据层 * 步骤2:集成AI优化引擎 * 步骤3:设置停止条件 * 为什么AI优化能避免“实验陷阱”?