做汽车介绍视频的网站吗网站开发 哪些技术
2026/4/18 13:55:24 网站建设 项目流程
做汽车介绍视频的网站吗,网站开发 哪些技术,做网站建本地环境作用,老年大学网站建设在大型语言模型#xff08;LLM#xff09;的应用落地中#xff0c;RAG#xff08;检索增强生成#xff09;是解决模型幻觉和知识时效性的关键技术。 而在RAG的诸多场景中#xff0c;基于多文档高精度智能分析与问答系统#xff0c;也就是知识库又必然是我们最常遇到LLM的应用落地中RAG检索增强生成是解决模型幻觉和知识时效性的关键技术。而在RAG的诸多场景中基于多文档高精度智能分析与问答系统也就是知识库又必然是我们最常遇到且企业场景最刚需的一类。那么如何做好知识库本文将以开源项目Paddle-ERNIE-RAG为例对其关键技术进行说明介绍。该系统集成了在线 OCR 解析、Milvus 混合检索向量关键词以及多维度的重排序Reranker策略可以提升低资源环境下的检索准确率以实现高精度多文档分析与问答。01系统架构概览本项目的系统主要由四个核心模块组成数据提取层使用在线 OCR API 进行高精度的文档布局分析Layout Parsing。存储层利用 Milvus 向量数据库存储 Dense Embedding同时维护倒排索引以支持关键词检索。检索与问答层实现向量检索与关键词检索的加权融合RRF集成 ERNIE 大模型 API 接口生成回答。应用层基于 Gradio 构建交互界面。02关键技术实现2.1 PP-StructureV3 文档解析针对科研论文中常见的双栏排版、公式混排及图表嵌入问题传统的 PyPDF2 等纯文本提取工具往往力不从心容易导致段落乱序、表格崩坏。为此本项目在 backend.py 中封装了 OnlinePDFParser 类直接集成 PP-StructureV3 在线 API 进行高精度的文档布局分析Layout Parsing。该方案具备三大核心优势结构化输出直接返回 Markdown 格式自动识别标题层级、段落边界。图表提取在解析文本的同时自动提取文档中的图片并转存为后续的“多模态问答”提供素材。上下文保留基于滑动窗口进行切分防止关键信息在切片边界丢失。2.1.1 核心解析逻辑在 backend.py 中我们构建了 API 请求将 PDF 文件流发送至服务端并解析返回的 layoutParsingResults提取出清洗后的 Markdown 文本和图片资源。# backend.py (OnlinePDFParser 类核心逻辑摘要) def predict(self, file_path): # 1. 文件转 Base64 with open(file_path, rb) as file: file_data base64.b64encode(file.read()).decode(ascii) # 2. 构造请求 Payload payload { file: file_data, fileType: 1, # PDF 类型 useChartRecognition: False, # 根据需求配置 useDocOrientationClassify: False } # 3. 发送请求获取 Layout Parsing 结果 response requests.post(self.api_url, jsonpayload, headersheaders) res_json response.json() # 4. 提取 Markdown 文本与图片 parsing_results res_json.get(result, {}).get(layoutParsingResults, []) mock_outputs [] for item in parsing_results: md_text item.get(markdown, {}).get(text, ) images item.get(markdown, {}).get(images, {}) # ... (后续图片下载与文本清洗逻辑) mock_outputs.append(MockResult(md_text, images)) return mock_outputs, Success2.1.2 滑动窗口文本分块拿到结构化的 Markdown 文本后为了避免语义被生硬切断例如一句话跨了两个 chunk我们实现了一个带有 overlap重叠区的滑动窗口分块策略。# backend.py def split_text_into_chunks(text: str, chunk_size: int 300, overlap: int 120) - list: 基于滑动窗口的文本分块保留 overlap 长度的重叠上下文 if not text: return [] lines [line.strip() for line in text.split(\n) if line.strip()] chunks [] current_chunk [] current_length 0 for line in lines: while len(line) chunk_size: # 处理超长单行 part line[:chunk_size] line line[chunk_size:] current_chunk.append(part) # ... (切分逻辑) ... current_chunk.append(line) current_length len(line) # 当累积长度超过阈值生成一个 chunk if current_length chunk_size: chunks.append(\n.join(current_chunk)) # 回退保留最后 overlap 长度的文本作为下一个 chunk 的开头 overlap_text current_chunk[-1][-overlap:] if current_chunk else current_chunk [overlap_text] if overlap_text else [] current_length len(overlap_text) if current_chunk: chunks.append(\n.join(current_chunk).strip()) return chunks2.2 Milvus 向量库与混合检索策略2.2.1 知识库命名的工程化处理在实际部署中Milvus 等向量数据库对集合名称Collection Name通常有严格的命名限制。为了解决这一问题我们在后端代码中实现了一套透明的编解码机制。编码 (Encode)当用户创建如“物理论文”的库时系统将其 UTF-8 字节转换为 Hex 字符串并添加kb\_前缀。解码 (Decode)在前端展示时自动将 Hex 字符串反解为原始中文。import binascii import re def encode_name(ui_name): 把中文名称转为 Milvus 合法的 Hex 字符串 if not ui_name: return # 如果是纯英文/数字/下划线直接返回 if re.match(r^[a-zA-Z_][a-zA-Z0-9_]*$, ui_name): return ui_name # Hex 编码并加前缀 kb_ hex_str binascii.hexlify(ui_name.encode(utf-8)).decode(utf-8) return fkb_{hex_str} def decode_name(real_name): 把 Hex 字符串转回中文 if real_name.startswith(kb_): try: hex_str real_name[3:] return binascii.unhexlify(hex_str).decode(utf-8) except: return real_name return real_name2.2.2 向量化入库与元数据绑定在 OCR 解析并将长文本切分为 Chunks 后系统并非简单地将文本存入数据库而是执行了“向量化 元数据绑定”的关键步骤。为了支持后续的精确溯源Citation和多模态问答我们在设计 Milvus Schema 时除了存储 384 维的 Dense Vector 外还强制绑定了 filename文件名、page页码和 chunk_id切片 ID等标量字段。这一过程在 vector_store.py 中通过 insert_documents 方法实现采用批量 Embedding 策略以减少网络开销# vector_store.py def insert_documents(self, documents): 批量向量化并写入 Milvus if not documents: return # 1. 提取纯文本列表批量请求 Embedding 模型 texts [doc[content] for doc in documents] embeddings self.get_embeddings(texts) # 2. 数据清洗过滤掉 Embedding 失败的坏数据 valid_docs, valid_vectors [], [] for i, emb in enumerate(embeddings): if emb and len(emb) 384: # 确保向量维度正确 valid_docs.append(documents[i]) valid_vectors.append(emb) # 3. 组装列式数据 (Columnar Format) # Milvus insert 接口要求各字段数据以列表形式传入 data [ [doc[filename] for doc in valid_docs], # Scalar: 文件名 [doc[page] for doc in valid_docs], # Scalar: 页码 (用于溯源) [doc[chunk_id] for doc in valid_docs], # Scalar: 切片ID [doc[content] for doc in valid_docs], # Scalar: 原始内容 (用于关键词检索) valid_vectors # Vector: 语义向量 ] # 4. 执行插入与持久化 self.collection.insert(data) self.collection.flush()2.2.3 混合检索策略检索前系统首先利用 LLM 生成的问题的双语翻译避免中文问题询问英文文档使得关键词不匹配以最大化语义覆盖。随后并行执行两路检索Dense (向量检索)捕捉语义相似度例如“简谐振子”与“弹簧振子”的语义关联。Sparse (关键词检索)弥补向量模型对专有名词或精确数字匹配的不足例如精确匹配公式中的变量名。向量检索容易因语义泛化而召回错误概念如“弹簧振子”与“简谐振子”而关键词检索能确保专有名词的精确命中从而大幅提升准确率。然后执行RRF (倒排融合)系统内部使用倒排秩融合算法 (Reciprocal Rank Fusion) 将两路结果合并确保多样性。# vector_store.py 中的检索逻辑摘要 def search(self, query: str, top_k: int 10, \*\*kwargs): 向量检索(DenseKeyword)RRF 融合 # 1. 向量检索 (Dense) dense_results [] query_vector self.embedding_client.get_embedding(query) # ... (Milvus search code) ... # 2. 关键词检索 (Keyword) # 通过 jieba 分词后构建 like %keyword% 查询 keyword_results self._keyword_search(query, top_ktop_k * 5, exprexpr) # 3. RRF 融合 rank_dict {} def apply_rrf(results_list, k60, weight1.0): for rank, item in enumerate(results_list): doc_id item.get(id) or item.get(chunk_id) if doc_id not in rank_dict: rank_dict[doc_id] {data: item, score: 0.0} # RRF 核心公式 rank_dict[doc_id][score] weight * (1.0 / (k rank)) apply_rrf(dense_results, weight4.0) apply_rrf(keyword_results, weight1.0) # 4. 排序输出 sorted_docs sorted(rank_dict.values(), keylambda x: x[score], reverseTrue) return [item[data] for item in sorted_docs[:top_k * 2]]2.3 综合重排序算法检索回来的片段Chunks需要进一步精排。在reranker_v2.py中设计了一套综合打分算法。评分维度包括模糊匹配Fuzzy Score使用fuzzywuzzy计算 Query 与 Content 的字面重合度。关键词覆盖率Keyword Coverage计算 Query 中的核心词在文档片段中的出现比例。语义相似度来自 Milvus 的原始向量距离。长度惩罚与位置偏置对过短的片段进行惩罚对 Milvus 召回的排名靠前的片段给予位置奖励。专有名词英文看“大小写”特征使用正则\b[A-Z][a-z]\b|[A-Z]{2,}专门匹配首字母大写的单词如 “Milvus”或全大写的缩写如 “RAG”因为在英文中这些通常代表专有名词。中文看“连续性”特征由于中文没有大小写策略变成了“切分长度”使用非中文字符作为分隔符切断句子保留所有连续出现 2 个及以上**的汉字片段如“简谐振子”将其视为潜在实体。具体的分数占比见下图这种基于规则与语义结合的重排序策略在无训练数据的情况下比纯黑盒模型更具可解释性。# reranker_v2.py def _calculate_composite_score(self, query: str, chunk: Dict[str, Any]) - float: content chunk.get(content, ) # 1. 字面重合度 (FuzzyWuzzy) fuzzy_score fuzz.partial_ratio(query, content) # 2. 关键词覆盖率 query_keywords self._extract_keywords(query) content_keywords self._extract_keywords(content) keyword_coverage (len(query_keywords content_keywords) / len(query_keywords)) * 100 if query_keywords else 0 # 3. 向量语义分 (归一化) milvus_distance chunk.get(semantic_score, 0) milvus_similarity 100 / (1 milvus_distance * 0.1) # 4. 长度惩罚 (偏好 200-600 字的段落) content_len len(content) if 200 content_len 600: length_score 100 else: # ... (惩罚逻辑) length_score 100 - min(50, abs(content_len - 400) / 20) # 加权求和 base_score ( fuzzy_score * 0.25 keyword_coverage * 0.25 milvus_similarity * 0.35 length_score * 0.15 ) # 位置权重 position_bonus 0 if milvus_rank in chunk: rank chunk[milvus_rank] position_bonus max(0, 20 - rank) # 专有名词额外加分 (Bonus) proper_noun_bonus 30 if self._check_proper_nouns(query, content) else 0 return base_score proper_noun_bonus2.4 API 速率限制与自适应保护在调用 LLM 或 Embedding 服务时偶尔会遇到429 Too Many Requests。本项目在ernie_client.py中实现了自适应降速机制# 遇到限流时的处理逻辑 if is_rate_limit: self._adaptive_slow_down() # 永久增加请求间隔 wait_time (2 ** attempt) random.uniform(1.0, 3.0) # 指数退避 time.sleep(wait_time) def _adaptive_slow_down(self): 触发自适应降级遇到限流时永久增加全局请求间隔 self.current_delay min(self.current_delay * 2.0, 15.0) logger.warning(f 触发速率限制(429)系统自动降速: 新间隔 {self.current_delay:.2f}s)这保证了系统在大批量文档入库时的稳定性。2.5 多模态问答针对科研文档中包含大量关键图表如实验数据、模型架构的特点本系统实现了“图表锁定”问答功能。核心技术实现包含以下三个维度上下文增强 Prompt后端在构建请求时不仅发送图片本身还检索该图片所在页面的 OCR 文本作为背景信息Context。Prompt 结构动态拼装了“图片元数据 背景文本 用户问题”有效提升了模型对图表细节与上下文关联的理解能力。# backend.py - 多模态问答核心逻辑 # 1. 检索当前页面的 OCR 文本作为背景 (Context) # 系统根据文件名和页码从 Milvus 中拉取该图所在的完整页面文本 # page_num 来自前端图片文件名的解析 (e.g., p3_figure.jpg - Page 3) page_text_context milvus_store.get_page_content(doc_name, page_num)[:800] # 2. 动态拼装 Context-Enhanced Prompt # 关键点将视觉信息与文本背景强制对齐防止模型看图说话产生幻觉 final_prompt f 【任务】结合图片和背景信息回答问题。 【图片元数据】来源{doc_name} (P{page_num}) 【背景文本】{page_text_context} ... (此处省略长文本) 【用户问题】{user_question} # 3. 发送多模态请求 (Vision API) # 底层会将图片转为 Base64与 final_prompt 一起发给 ERNIE-VL 模型 answer ernie_client.chat_with_image(queryfinal_prompt, image_pathimg_path)Vision 接口封装底层客户端ernie_client.py实现了 OpenAI 兼容的视觉协议。系统自动读取本地图片并转换为 Base64 编码通过image_url格式构建多模态消息体实现了图像数据与文本指令的联合推理。# ernie_client.py def chat_with_image(self, query: str, image_path: str): base64_image self._encode_image(image_path) # 构造 Vision 消息格式 messages [ { role: user, content: [ {type: text, text: query}, { type: image_url, image_url: { url: fdata:image/jpeg;base64,{base64_image} } } ] } ] return self.chat(messages)降级策略为保障系统的高可用性backend.py中设计了自动回退机制。若多模态接口调用异常如模型不支持或网络错误系统将自动捕获异常并无缝切换至标准文本 RAG 通道利用 OCR 文本继续回答确保用户对话流程不中断。# backend.py 中的降级逻辑 try: answer ernie.chat_with_image(final_prompt, img_path) # ... except Exception as e: print(f⚠️ 模型不支持图片准备切换至文本模式。) # 降级使用提取出的文本作为 Context 继续问答 answer, metric ask_question_logic(final_prompt, collection_name)03界面交互与效果3.1 深度 CSS 定制前端基于 Gradio 搭建main.py采用自定义 CSS (modern_css) 搭建了美观的 UI 界面。重点改进了输入区域的视觉层级将默认的灰色背景改为白底圆角卡片并为发送按钮添加了渐变色与悬浮阴影使其在视觉上更加现代与聚焦。/* main.py - modern_css 片段 */ /* 强制输入框白底圆角模拟现代 Chat APP */ .custom-textbox textarea { background-color: #ffffff !important; border: 1px solid #e5e7eb !important; border-radius: 12px !important; box-shadow: 0 4px 12px rgba(0,0,0,0.05) !important; padding: 14px !important; } /* 渐变色发送按钮 */ .send-btn { background: linear-gradient(135deg, #6366f1 0%, #4f46e5 100%) !important; color: white !important; box-shadow: 0 4px 10px rgba(99, 102, 241, 0.3) !important; } 3.2 LaTeX 公式渲染为了保证公式在 UI 界面上能正常渲染出来首先定义一套完整的 LaTeX 识别规则涵盖行内与行间公式.这套配置被同时配置到对话框Chatbot和摘要区Markdown确保无论是模型的回答还是文档的摘要公式都能被渲染# main.py 配置 LaTeX 规则 latex_config [ {left: $$, right: $$, display: True}, # 识别行间公式 {left: $, right: $, display: False}, # 识别行内公式 {left: \\(, right: \\), display: False}, # 标准 LaTeX 行内 {left: \\[, right: \\], display: True} # 标准 LaTeX 行间 ] 随后在实例化组件时将此配置注入 # 在 Chatbot 中启用 LaTeX chatbot gr.Chatbot( labelConversation, # ... 其他参数 ... latex_delimiterslatex_config # 关键配置启用公式渲染 ) # 在摘要显示区启用 LaTeX doc_summary gr.Markdown( value*暂无摘要*, latex_delimiterslatex_config )3.3 可解释性设计在实际体验中为了打破 RAG 系统的“黑盒”属性本应用在界面中设计了两个维度的评价指标分别对应微观与宏观视角相关性 (Relevance)出现在聊天框的【参考来源】列表中。这是一个微观指标它直接展示了Reranker给每一个具体文档切片打出的composite\_score基于向量关键词规则的综合得分。它的作用是告诉用户“为什么系统引用了第 3 页这段话而不是第 5 页那段”# backend.py - 构建参考来源列表 sources \n\n **参考来源:**\n for c in final: # ... (去重逻辑) ... # 直接透传 Reranker 计算出的单片得分 sources f- {key} [相关性:{c.get(composite_score,0):.0f}%]\n置信度 (Confidence) 展示在【分析详情】面板中。这是一个 宏观指标 系统提取 Top-1 切片 的得分并进行归一化Capped at 100%作为本次问答的整体评分。它的作用是预警 “系统对自己生成的答案有多大把握” 如果置信度低于 60%即便模型生成的文字再通顺用户也应警惕可能存在的“幻觉”风险。# backend.py - 计算整体置信度 # 1. 获取重排序后的 Top-1 片段 final processed[:22] top_score final[0].get(composite_score, 0) if final else 0 # 2. 归一化处理 (封顶 100%)作为本次问答的置信度 metric f{min(100, top_score):.1f}%实现的 UI 界面效果如下在回答中显示了相应来源向量的页数和相关性04总结4.1 功能亮点高精度问答集成百度文心大模型 API利用文心大模型卓越的语义理解与生成能力配合“向量关键词”双路混合检索与 RRF 重排序算法确保回答的精准度与鲁棒性。多知识库管理支持动态创建、切换和删除知识库。召回率自测内置test\_self\_recall函数自动从库中抽取样本验证检索准确率。实时反馈上传大文件时通过进度条实时显示 OCR 解析与 Embedding 入库进度。4.2 未来改进通过结合 Milvus 的向量能力与传统的关键词匹配技术并辅以细粒度的重排序策略本系统在低成本下实现了较高精度的文档问答。未来的优化方向将集中在如何学习大模型 AI 由于新岗位的生产效率要优于被取代岗位的生产效率所以实际上整个社会的生产效率是提升的。但是具体到个人只能说是“最先掌握AI的人将会比较晚掌握AI的人有竞争优势”。这句话放在计算机、互联网、移动互联网的开局时期都是一样的道理。我在一线互联网企业工作十余年里指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家也可以通过我们的能力和经验解答大家在人工智能学习中的很多困惑所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限很多互联网行业朋友无法获得正确的资料得到学习提升故此将并将重要的AI大模型资料包括AI大模型入门学习思维导图、精品AI大模型学习书籍手册、视频教程、实战学习等录播视频免费分享出来。第一阶段10天初阶应用该阶段让大家对大模型 AI有一个最前沿的认识对大模型 AI 的理解超过 95% 的人可以在相关讨论时发表高级、不跟风、又接地气的见解别人只会和 AI 聊天而你能调教 AI并能用代码将大模型和业务衔接。大模型 AI 能干什么大模型是怎样获得「智能」的用好 AI 的核心心法大模型应用业务架构大模型应用技术架构代码示例向 GPT-3.5 灌入新知识提示工程的意义和核心思想Prompt 典型构成指令调优方法论思维链和思维树Prompt 攻击和防范…第二阶段30天高阶应用该阶段我们正式进入大模型 AI 进阶实战学习学会构造私有知识库扩展 AI 的能力。快速开发一个完整的基于 agent 对话机器人。掌握功能最强的大模型开发框架抓住最新的技术进展适合 Python 和 JavaScript 程序员。为什么要做 RAG搭建一个简单的 ChatPDF检索的基础概念什么是向量表示Embeddings向量数据库与向量检索基于向量检索的 RAG搭建 RAG 系统的扩展知识混合检索与 RAG-Fusion 简介向量模型本地部署…第三阶段30天模型训练恭喜你如果学到这里你基本可以找到一份大模型 AI相关的工作自己也能训练 GPT 了通过微调训练自己的垂直大模型能独立训练开源多模态大模型掌握更多技术方案。到此为止大概2个月的时间。你已经成为了一名“AI小子”。那么你还想往下探索吗为什么要做 RAG什么是模型什么是模型训练求解器 损失函数简介小实验2手写一个简单的神经网络并训练它什么是训练/预训练/微调/轻量化微调Transformer结构简介轻量化微调实验数据集的构建…第四阶段20天商业闭环对全球大模型从性能、吞吐量、成本等方面有一定的认知可以在云端和本地等多种环境下部署大模型找到适合自己的项目/创业方向做一名被 AI 武装的产品经理。硬件选型带你了解全球大模型使用国产大模型服务搭建 OpenAI 代理热身基于阿里云 PAI 部署 Stable Diffusion在本地计算机运行大模型大模型的私有化部署基于 vLLM 部署大模型案例如何优雅地在阿里云私有部署开源大模型部署一套开源 LLM 项目内容安全互联网信息服务算法备案…学习是一个过程只要学习就会有挑战。天道酬勤你越努力就会成为越优秀的自己。如果你能在15天内完成所有的任务那你堪称天才。然而如果你能完成 60-70% 的内容你就已经开始具备成为一名大模型 AI 的正确特征了。这份完整版的大模型 AI 学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询