2026/1/11 17:13:08
网站建设
项目流程
网站建设商业阶段,查询数据的网站怎么做,网络营销推广四个步骤,优化营商环境心得体会2023学习目标#xff1a;
了解DeepSeek API开发平台#xff0c;学习如何使用API开发应用。搞懂什么是向量数据库#xff0c;为什么RAG需要它。掌握RAG#xff08;检索增强生成#xff09;的基本原理和关键技术要点。最后#xff0c;实现一个基于DeepSeek和RAG搭建的智能问答…学习目标了解DeepSeek API开发平台学习如何使用API开发应用。搞懂什么是向量数据库为什么RAG需要它。掌握RAG检索增强生成的基本原理和关键技术要点。最后实现一个基于DeepSeek和RAG搭建的智能问答机器人。DeepSeek应用开发入门DeepSeek API官方与第三方平台介绍deepSeek模型有三种使用方法官方途径第三方渠道和本地化部署deepseek官方网站https://platform.deepseek.com/sign_in第三方渠道阿里字节腾讯等Token是模型用来表示自然语言文本的基本单位也是API调用的计费单元可以直观的理解为字或词。余额查看APIkey创建阿里百炼官方地址https://bailian.console.aliyun.com/console?tabapi#/apiDeepSeek应用开发环境搭建与实战本项目的环境基于python v3.11版本开发python环境管理Minicondahttps://www.anaconda.com/docs/getting-started/miniconda/mainpython交互式环境开发Jupyter Labhttps://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html大模型调用OpenAI python SDK首先我们要创建对应的虚拟环境conda create -n deepseek python3.11我们需要安装python依赖软件包pip install -r requirmenets.txt# DeepSeek API 和 OpenAI SDK openai1.82.0 # HTTP 请求 requests2.32.3 # 进度条 tqdm4.67.1 # 向量数据库和模型 pymilvus[model]2.5.10 # 深度学习框架 # GPU版本 torch2.7.0 # CPU版本 # torch2.7.0cpu --extra-index-url https://download.pytorch.org/whl/cpu配置DeepSeek API Keyexport DEEPSEEO_API_KEY sk-XXX安装和使用Jupyter lab# 安装jupyter lab conda install -c conda-forge jupyterlab # 生成jupyter lab 配置文件 jupyter lab --generate-config使用nohub后台运行jupyter Labjupyter lab --port8000 --ServerApp.token123456 --notebook-dir./完整代码import os from openai import OpenAI api_key os.getenv(DEEPSEEK_API_KEY) if not api_key: raise ValueError(请设置DEEPSEEK_API_KEY环境变量) # 初始化OpenAI客户端 client OpenAI( api_keyapi_key, base_urlhttps://api.deepseek.com/v1, ) # 提示词 prompt 请帮我用 HTML 生成一个江西地图的静态网页所有代码都保存在一个 HTML 中。 try: # 调用OpenAI API response client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: 你是一个专业的 Web 开发助手擅长用 HTML/CSS/JavaScript 编写游戏。}, {role: user, content: prompt}, ], temperature0.7, streamFalse ) #提取生成的 HTML内容 if response.choices and len(response.choices)0: html_content response.choices[0].message.content #保存HTML文件 with open(demo.html, w, encodingutf-8) as f: f.write(html_content) print(HTML文件保存成功) else: print(没有找到有效的响应) except Exception as e: print(f发生错误{e})大模型的分类普通大模型普通大模型如 DeepSeek-V3, Qwen-3, GPT-4.5等适用于语言表达、常识问答、总结、提取、翻译、客服类对话等“直接输出型”任务。适用的典型场景场景描述文本分类与摘要新闻、评论、合同提取要点对话客服机器人回答 FAQ、售后支持、流程引导文本生成市场文案、邮件写作、内容创作语言翻译普通领域下的中英、英中互译信息抽取表单、报告中的字段提取语义搜索 / FAQ 匹配基于 embedding 的召回与匹配推理大模型推理大模型如 DeepSeek-R1, Qwen-QwQ-Max, OpenAI o1, Gemini 2.5 Pro 等擅长“链式思维、多步推理、数学/逻辑问题、复杂代码理解与生成、结构化推理”。适用的电线场景场景描述数学解题 / 逻辑推理解方程、推理题、数列推理等代码理解与生成多文件分析、跨模块重构、复杂函数推导复杂问答系统需要多步结合上下文的信息推理结构化文档生成例如法律文本、技术报告、推理性摘要企业决策支持涉及多维数据分析和因果关系判断多 Agent 协同任务需要规划任务、判断优先级与协调向量数据库快速实战引言为什么RAG需要特别的数据库RAG的核心是检索也就是从海量的信息中找到和用户问题最相关的几段内容。这些内容通常被转换成了数字指纹-向量Embeddings。传统数据库Mysql不擅长高效地比较这些数字指纹的相似度。向量数据库就是专门为存储管理和高效检索这些向量而产生的。向量数据库基本原理核心任务相似度搜索当用户提出一个问题我们先把这个问题也转换成一个查询向量。然后向量数据库会在存储的海量内容向量中。快速找出根这个查询向量在空间中距离最近最相似的那些。常见的距离/相似度计算方法余弦相似度看两个向量的方向有多一致最常用。欧式距离看两个向量的直线距离。点积。加速搜索近似最近邻搜索要在几千万几百万甚至上亿的向量里精确找到最近的太慢了。ANN算法能在保证较高召回率找到大部分相关的的前提下极大地提高搜索速度。牺牲一点点精度换来巨大的效率提升。向量数据库典型架构数据接⼊层 (Ingestion API/Client)负责接收你要存储的原始数据⽂本、图⽚等和它们对应的向量 (Embeddings)。存储层 (Storage Engine)可能使⽤磁盘、内存或混合存储实际存储向量数据和可能的元数据⽐如 原始⽂本的 ID来源等。索引层 (Indexing Service)核⼼ 对存⼊的向量构建特殊的索引结构⽐如 HNSW, IVFADC, LSH 等这是实现快速 ANN 搜索的关键。索引的构建可能在写⼊时同步进⾏也可能异步批量进⾏。查询处理层 (Query Engine/API)接收⽤户的查询向量利⽤索引快速执⾏相似度搜索⽀持过滤⽐ 如只在特定类别或时间范围内搜索返回最相似的 Top-K 个结果及其元数据。管理与监控 (Management Monitoring)集群管理、扩缩容、备份恢复、性能监控、安全等。向量数据库的选型1.性能Performance查询延迟搜索一次要多久越低越好吞吐量每秒能处理多少次查询越高越好索引构建时间导入新数据后多久能被搜到2.可扩展性Scalability能否轻松应对数据量和查询量的增长支持水平扩展吗3.准确性Accuracy/RecallANN 搜索的召回率如何能不能在速度和精度之间做取舍4.成本Cost硬件成本、托管费用、人力维护成本开源免费还是商业付费5.易用性与生态Ease of Use EcosystemAPI 是否友好文档是否完善社区是否活跃是否有成熟的客户端 / SDK与其他工具如 LLM 框架 LangChain、Llamaindex的集成度如何6.功能特性Features支持哪些 ANN 索引算法支持元数据过滤吗支持混合搜索向量 关键词吗数据持久性、备份恢复、安全机制等。向量数据库常见选型向量数据库使用方面RAGRAG核⼼思想让⼤语⾔模型 (LLM) 在回答问题或⽣成 内容之前先从⼀个外部的知识库⾥“查找资料” 然后再结合查到的资料和它⾃⼰的知识来给出答案。离线RAG1. 加载数据 (Load)从各种来源⽂档、⽹⻚、数据库等加载原始知识。2. 切分数据 (Split/Chunk)将加载的⽂档切分成更⼩的、易于处理的⽂本块。3. ⽣成嵌⼊ (Embed)使⽤ Embedding 模型为每个⽂本块⽣成向量嵌⼊。4. 存储⼊库 (Store)将⽂本块及其向量嵌⼊存储到向量数据库中并建⽴索引在线RAG5. ⽤户提问 (User Query)⽤户输⼊⼀个问题或指令。6. 查询嵌⼊ (Query Embedding)将⽤户的问题也转换成⼀个查询向量。7. 检索 (Retrieve)⽤查询向量去向量数据库中搜索最相似的 Top-K 个⽂本块这些就是“查到的资料”。8. 增强与⽣成 (Augment Generate) 将⽤户原始问题和检索到的相关⽂本块⼀起组织成⼀个新的提示 (Prompt) 给到 LLM。 LLM 参考提供的资料和⾃身知识⽣成最终的答案。RAG在信息检索和生成任务中的优势1. 减少 “幻觉”Reduce HallucinationsLLM 有时会编造听起来合理但不真实的信息RAG 通过提供相关、真实的外部知识作为依据显著减少这种情况。2. 使用最新 / 私有知识Access to Up-to-Date/Private KnowledgeLLM 的知识截止于训练数据对训练后新事件或公司内部私有数据一无所知RAG 允许 LLM 访问和利用外部的、动态更新的知识库。3. 提高答案的可追溯性 / 可解释性Improved Verifiability/Explainability答案基于检索到的特定文本块生成可明确告知用户 “答案根据 XXX 文档的第 Y 段而来”方便验证。4. 更具成本效益地更新知识Cost-Effective Knowledge Updates重新训练 LLM 成本极高RAG 只需更新向量数据库内容LLM 本身无需重训成本更低。5. 个性化与领域适应Personalization Domain Adaptation可针对特定用户 / 领域构建专属知识库让 LLM 回答更个性化、专业化。RAG技术要点1. 数据预处理与切块Chunking Strategy切多大太小易丢失上下文太大易引入噪声 / 超出 LLM 上下文窗口怎么切按固定字数、按句子 / 段落、基于语义的智能切分元数据Metadata为每个块添加来源、标题、日期等元数据辅助后续过滤 / 引用。2. 嵌入模型选择Embedding Model质量至上Embedding 的质量决定检索准确性“垃圾进垃圾出”一致性查询和文档必须用相同的 Embedding 模型领域适配专业知识库需选用 / 微调领域特定的 Embedding 模型。3. 检索策略Retrieval StrategyTop-K 选择选择多少个相关文本块太少信息不足太多易引入噪声相似度阈值只选相似度高于某个分数的块混合检索Hybrid Search结合向量相似度搜索与关键词搜索重排Re-ranking用复杂模型如 Cross-Encoder对 Top-K 结果二次排序。4. 上下文构建与提示工程Context Construction Prompt Engineering如何组织将问题和检索到的多文本块有效组合成清晰提示指令清晰明确告知 LLM “根据提供的上下文回答问题”处理超长上下文内容过多时需筛选、压缩后分批次给 LLM处理冲突信息提示中引导 LLM 处理文本块间的矛盾。5. 生成模型选择Generation to Chooose!选模型优先选理解能力强、幻觉少的 LLM上下文窗口窗口大小影响能输入的检索信息数量。6. 评估与迭代Evaluation Iteration如何评价检索质量召回率、精确率、MRR 等生成质量回答的相关性、准确性、流畅性等端到端评估结合具体场景综合评估持续优化监控 bad case迭代优化各环节。第一个RAGpip install pymilvus[model]2.5.10 openai 1.82 .0 requests 2.32 .3 tqdm 4.67 .1 torch 2.7 .0 import os api_key os.getenv(DEEPSEEK_API_KEY) from glob import glob text_lines [] for file_path in glob(milvus_docs/en/faq/*.md, recursiveTrue): with open(file_path, r) as file: file_text file.read() text_lines file_text.split(# ) len(text_lines) # 准备 LLM 和 Embedding 模型 from openai import OpenAI deepseek_client OpenAI( api_keyapi_key, base_urlhttps://api.deepseek.com/v1, # DeepSeek API 的基地址 ) # from pymilvus import model as milvus_model # embedding_model milvus_model.DefaultEmbeddingFunction() from pymilvus import model as milvus_model # OpenAI国内代理 https://api.apiyi.com/token embedding_model milvus_model.dense.OpenAIEmbeddingFunction( model_nametext-embedding-3-large, # Specify the model name api_keysk-XXX, # Provide your OpenAI API key base_urlhttps://api.apiyi.com/v1, dimensions512 ) test_embedding embedding_model.encode_queries([This is a test])[0] embedding_dim len(test_embedding) print(embedding_dim) print(test_embedding[:10]) test_embedding_0 embedding_model.encode_queries([That is a test])[0] print(test_embedding_0[:10]) # 将数据加载到 Milvus from pymilvus import MilvusClient milvus_client MilvusClient(uri./milvus_demo.db) collection_name my_rag_collection if milvus_client.has_collection(collection_name): milvus_client.drop_collection(collection_name) milvus_client.create_collection( collection_namecollection_name, dimensionembedding_dim, metric_typeIP, # 内积距离 consistency_levelStrong, # 支持的值为 (Strong, Session, Bounded, Eventually)。更多详情请参见 https://milvus.io/docs/consistency.md#Consistency-Level。 ) from tqdm import tqdm data [] doc_embeddings embedding_model.encode_documents(text_lines) for i, line in enumerate(tqdm(text_lines, descCreating embeddings)): data.append({id: i, vector: doc_embeddings[i], text: line}) milvus_client.insert(collection_namecollection_name, datadata) question How is data stored in milvus? # 在 collection 中搜索该问题并检索语义上最匹配的前3个结果。 search_res milvus_client.search( collection_namecollection_name, dataembedding_model.encode_queries( [question] ), # 将问题转换为嵌入向量 limit3, # 返回前3个结果 search_params{metric_type: IP, params: {}}, # 内积距离 output_fields[text], # 返回 text 字段 ) import json retrieved_lines_with_distances [ (res[entity][text], res[distance]) for res in search_res[0] ] print(json.dumps(retrieved_lines_with_distances, indent4)) context \n.join( [line_with_distance[0] for line_with_distance in retrieved_lines_with_distances] ) context question SYSTEM_PROMPT Human: 你是一个 AI 助手。你能够从提供的上下文段落片段中找到问题的答案。 USER_PROMPT f 请使用以下用 context 标签括起来的信息片段来回答用 question 标签括起来的问题。最后追加原始回答的中文翻译并用 translated和/translated 标签标注。 context {context} /context question {question} /question translated /translated USER_PROMPT response deepseek_client.chat.completions.create( modeldeepseek-chat, messages[ {role: system, content: SYSTEM_PROMPT}, {role: user, content: USER_PROMPT}, ], ) print(response.choices[0].message.content)