本系列会设计langchain开发、RAG、langgraph

本文主要介绍模型如何接入langchain,模型调用,记忆管理,工具调用,具体如下

```python
import langchain
```


```python
langchain.__version__
```


    '1.2.0'


```python
%pwd
```


    'D:\\'


```python
import os
print(os.getcwd())
```

    D:\
    


```python
#将秘钥放入nev文件
import os
from dotenv import load_dotenv
```


```python
load_dotenv(override=True)
```


    True


```python
#读入秘钥
DeepSeek_API_KEY=os.getenv("DEEPSEEK_API_KEY")
```


```python
print(DeepSeek_API_KEY)
```

    sk-2dc53438fb88460e94f316c50bdeb4ad
    


```python
from openai import OpenAI
```


```python
#初始化deepseekapi客户端
client=OpenAI(api_key=DeepSeek_API_KEY,base_url="https://api.deepseek.com/v1")
```


```python
#模型接入langchain的完整代码
import os
from openai import OpenAI

# 配置DeepSeek API信息(建议将API Key放在环境变量中,更安全)
DEEPSEEK_API_KEY = os.getenv("DEEPSEEK_API_KEY", "sk-2dc53438fb88460e94f316c50bdeb4ad")  # 替换为自己的API Key
BASE_URL = "https://api.deepseek.com/v1"

# 初始化客户端
client = OpenAI(
    api_key=DEEPSEEK_API_KEY,
    base_url=BASE_URL
)

def get_deepseek_response(user_prompt):
    """
    调用DeepSeek API获取回复
    :param user_prompt: 用户的提问内容
    :return: DeepSeek返回的回答内容
    """
    try:
        # 核心调用逻辑(包含DeepSeek必填参数)
        response = client.chat.completions.create(
            model="deepseek-chat",  # DeepSeek默认对话模型
            messages=[
                {"role": "system", "content": "你是一个乐于助人的智能助手,回答简洁、准确、易懂"},
                {"role": "user", "content": user_prompt}
            ],
            max_tokens=2048,  # 最大生成token数,可根据需求调整(范围1-4096)
            temperature=0.7,  # 回答随机性,0-1之间(0更严谨,1更有创意)
            stream=False       # 非流式返回(如需流式可改为True,需调整后续解析逻辑)
        )
        # 提取核心回答内容
        answer = response.choices[0].message.content
        return answer
    
    except Exception as e:
        # 捕获并提示常见错误(方便排查问题)
        print(f"调用DeepSeek API失败:{str(e)}")
        return None

# 测试调用
if __name__ == "__main__":
    # 自定义用户提问
    user_question = "您好,请介绍下你自己"
    # 获取回复
    result = get_deepseek_response(user_question)
    # 输出结果
    if result:
        print("DeepSeek回复:")
        print(result)
```

    DeepSeek回复:
    你好!我是DeepSeek,一个由深度求索公司开发的AI助手。很高兴认识你!😊
    
    让我简单介绍一下自己:
    - **身份**:我是DeepSeek最新版本的AI助手
    - **能力**:我可以进行对话交流、回答问题、协助写作、分析问题、编程帮助等
    - **特点**:完全免费使用,支持128K上下文长度
    - **文件处理**:支持上传图像、txt、pdf、ppt、word、excel等多种格式文件,并能从中读取文字信息进行处理
    - **联网功能**:支持联网搜索(需要手动开启)
    - **知识截止**:我的知识更新到2024年7月
    
    我的回复风格比较热情细腻,希望能给你带来温暖和帮助。有什么问题或需要协助的地方,尽管告诉我吧!我会尽力为你提供准确、有用的回答。✨
    


```python
#模型调用,记忆管理,工具调用
#每次调用要包括角色、内容,元数据是可选字段(如消息id、响应时间、token消耗量),基本使用方法如下:
from langchain_deepseek import ChatDeepSeek
```


```python
model=ChatDeepSeek(model="deepseek-chat")
```


```python
from langchain.messages import HumanMessage,AIMessage,SystemMessage
```


```python
system_msg=SystemMessage("你叫小智,是一名助人为乐的助手")
human_msg=HumanMessage("你好,好久不见,请介绍下你自己")
```


```python
messages=[system_msg,human_msg]
```


```python
messages
```


    [SystemMessage(content='你叫小智,是一名助人为乐的助手', additional_kwargs={}, response_metadata={}),
     HumanMessage(content='你好,好久不见,请介绍下你自己', additional_kwargs={}, response_metadata={})]


```python
 response=model.invoke(messages)
```


```python
 response
```


    AIMessage(content='你好!很高兴再次见到你!😊\n\n我是小智,一个乐于助人的AI助手。虽然我们没有具体的“上次见面”记忆,但每次对话对我来说都是全新的开始,我会用最大的热情来帮助你!\n\n关于我:\n- 我是一个人工智能助手,由先进的深度学习技术驱动\n- 我的知识截止到2024年7月,涵盖各个领域的信息\n- 我擅长回答问题、提供建议、协助思考、创作内容等\n- 我会用中文和你交流,但也能处理其他语言\n- 最重要的是,我会尽力提供准确、有用、安全的帮助\n\n无论你想聊什么话题,需要解决什么问题,或者只是想随便聊聊,我都很乐意陪伴你!有什么我可以帮你的吗?✨', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 149, 'prompt_tokens': 23, 'total_tokens': 172, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 23}, 'model_provider': 'deepseek', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': 'cf1fd6cc-50ee-488e-9542-af5ce7e10be7', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019b626c-02bd-79c0-a465-79108ca4110a-0', usage_metadata={'input_tokens': 23, 'output_tokens': 149, 'total_tokens': 172, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}})


```python
 #用stream来进行流式响应,即边生成边输出,更宽,更流畅,可展示思考过程
for chunk in model.stream("你好,好久不见"):
    print(chunk.text,end="|",flush=True)
```

    |你好|!|确实|有一|阵|子|没|见了|,|很高兴|能|再次|和你|聊天|。|最近|过得|怎么样|?|有没有|什么|新鲜|事|想|分享|,|或者|有什么|我可以|帮|你的|呢|?|无论是|闲聊|、|提问|,|还是|需要|建议|,|我|都在|这里|哦|~| 😊|||


```python
#每个任务完成都立刻获取结果用
for response in model.batch_as_completed(["请介绍下你自己","请问什么是机器学习","你知道机器学习和深度学习区别么"]):
    print(response)
```

    (0, AIMessage(content='你好!我是DeepSeek,由深度求索公司创造的AI助手,很高兴认识你!😊\n\n让我简单介绍一下自己:\n\n**基本信息:**\n- 我是纯文本AI模型,擅长理解和生成自然语言\n- 知识截止到2024年7月,会尽我所能为你提供准确、有用的信息\n- 拥有128K的上下文处理能力,可以处理较长的对话和文档\n\n**我的能力:**\n- 📝 回答各种问题,进行深度对话\n- 📁 支持文件上传(图像、txt、pdf、ppt、word、excel等),能从中读取文字信息进行处理\n- 🌐 支持联网搜索(需要你手动开启搜索功能)\n- 💭 逻辑推理、分析、创作、编程等多项任务\n\n**使用特点:**\n- 完全免费使用,没有收费计划\n- 可以通过官方应用商店下载App使用\n- 回复风格热情细腻,喜欢用心帮助每一位用户\n\n**我的局限:**\n- 我是纯文本模型,不支持多模态识别\n- 没有语音功能\n- 需要联网搜索时需手动开启\n\n我的使命就是尽我所能帮助你解决问题、获取知识、激发创意!无论是学习、工作还是日常生活中的疑问,我都很乐意和你一起探讨。\n\n有什么我可以帮你的吗?我会用心为你提供帮助!✨', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 278, 'prompt_tokens': 8, 'total_tokens': 286, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 8}, 'model_provider': 'deepseek', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': 'd80cf415-2f3f-48ea-9fde-c8b68494ff2a', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019b6279-6c0b-7cd0-a08d-0630de0516d9-0', usage_metadata={'input_tokens': 8, 'output_tokens': 278, 'total_tokens': 286, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}))
    (2, AIMessage(content='当然,这是一个非常核心的问题。简单来说,**深度学习是机器学习的一个子集**,但它在方法、能力和应用上带来了革命性的变化。\n\n我们可以用一个“同心圆”来理解它们的关系:\n**人工智能 > 机器学习 > 深度学习**\n\n下面从几个关键维度进行详细对比:\n\n| 维度 | 机器学习 | 深度学习 |\n| :--- | :--- | :--- |\n| **核心思想** | **从数据中学习模式和规则**,但通常需要人工进行“特征工程”。 | **让机器自动学习数据的多层次特征表示**。它模仿人脑的神经网络结构,通过多层处理来自动提取特征。 |\n| **数据依赖** | 对数据量要求相对较低,在小到中型数据集上也能表现良好。 | **极度依赖大量数据**。数据量越大,其性能通常越出色。在小数据集上容易过拟合。 |\n| **特征工程** | **至关重要且依赖人工**。专家需要花费大量时间从原始数据中提取、选择和构造有意义的特征。 | **自动化**。深度神经网络能够直接从原始数据(如图像像素、文本字符)中自动学习出层次化的特征,无需复杂的人工特征工程。 |\n| **模型结构** | 模型相对简单、可解释性强。 | 模型结构**非常复杂**,通常由数十、数百甚至上千层神经元组成,形成一个“深度”网络。 |\n| **计算需求** | 计算资源要求相对较低,可在普通CPU上运行。 | **计算需求极高**,通常需要强大的**GPU**或**TPU**进行大规模并行计算和训练,耗时耗电。 |\n| **可解释性** | 较好。如决策树、线性回归等模型的结果相对容易理解和解释。 | **较差,常被视为“黑箱”**。很难解释网络内部具体如何做出决策,这也是当前研究的热点。 |\n| **典型算法/模型** | - 线性/逻辑回归<br>- 决策树、随机森林<br>- 支持向量机<br>- K-近邻 | - **卷积神经网络**(用于图像)<br>- **循环神经网络/Transformer**(用于序列、文本)<br>- **深度强化学习**(用于游戏、控制) |\n| **典型应用场景** | - 垃圾邮件过滤<br>- 客户细分<br>- 房价预测<br>- 信用评分 | - **计算机视觉**:图像分类、人脸识别、自动驾驶<br>- **自然语言处理**:机器翻译、智能对话、文本生成<br>- **语音识别**:智能音箱、实时字幕<br>- 药物发现、AlphaGo |\n\n---\n\n### 一个生动的比喻\n\n想象一下你要教电脑识别“猫”:\n\n*   **传统机器学习方法**:\n    1.  你(专家)需要先告诉电脑:猫有“胡须”、“尖耳朵”、“椭圆形的眼睛”、“毛茸茸的纹理”等特征。\n    2.  然后你编写程序从图片中提取这些特征。\n    3.  最后,用一个机器学习算法(如SVM)根据这些特征来学习分类。\n\n*   **深度学习方法**:\n    1.  你只需要给电脑**海量的图片**,并标出哪些是猫,哪些不是。\n    2.  深度神经网络(如CNN)会自己从像素开始,**自动学习**:第一层可能学边缘和角落,第二层学形状和纹理,更深层的网络则组合这些低级特征,最终识别出“猫”这个复杂的概念。\n    3.  你不需要告诉它任何关于“胡须”或“耳朵”的规则。\n\n### 总结与选择\n\n*   **机器学习**:更适合**数据量有限、计算资源有限、需要模型可解释性**的场景。当业务逻辑清晰,特征易于定义时,它往往是更高效、更经济的选择。\n*   **深度学习**:在**处理非结构化数据**(图像、声音、文本)、**数据量巨大**、且**问题极其复杂**(如自然语言理解、复杂游戏)时表现出压倒性优势。但它成本高昂,且像“黑箱”。\n\n**发展趋势**:近年来,由于大数据和算力的爆发,深度学习已成为人工智能领域最主流、最强大的工具,并在许多任务上超越了传统机器学习方法。然而,传统机器学习并未被淘汰,在很多实际场景中,它们依然是更合适、更实用的选择。两者是相辅相成的技术工具箱。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 912, 'prompt_tokens': 10, 'total_tokens': 922, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 10}, 'model_provider': 'deepseek', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': 'dc08ac84-66c4-47a5-a698-cdfa48bad251', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019b6279-6c17-75a2-b7f0-4b6d7fab1671-0', usage_metadata={'input_tokens': 10, 'output_tokens': 912, 'total_tokens': 922, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}))
    (1, AIMessage(content='当然,很高兴为你解释机器学习!\n\n简单来说,**机器学习是人工智能的一个核心分支,它让计算机能够从数据中“学习”规律和模式,并利用这些学习成果来做出预测或决策,而无需为每个具体任务进行明确的、固定的编程。**\n\n你可以把它想象成教孩子认动物:\n*   **传统编程**:你需要详细地告诉他规则——“猫有尖耳朵、胡须、喵喵叫;狗耳朵形状多样、会汪汪叫”。每遇到一个新动物,你都要输入新规则。\n*   **机器学习**:你给他看成千上万张标有“猫”或“狗”的图片。通过分析这些图片,他自己总结出区分猫和狗的特征(比如脸型、体型、毛发纹理等)。之后,当他看到一张全新的动物图片时,他就能根据自己的“经验”(模型)判断出这是猫还是狗。\n\n---\n\n### 机器学习的核心要素\n\n1.  **数据**:这是机器学习的“燃料”。数据可以是数字、文本、图像、音频等。数据的数量和质量通常直接决定模型的效果。\n2.  **特征**:从原始数据中提取出的、对解决问题有用的属性或指标。例如,在判断邮件是否为垃圾邮件时,“发件人”、“标题关键词”、“是否包含链接”等都是特征。\n3.  **模型**:可以理解为一个数学函数或一套算法规则。它定义了如何根据输入特征得到输出结果。学习的过程就是不断调整模型内部参数,使其预测越来越准。\n4.  **训练**:将数据输入模型,让模型自动调整其内部参数,以找到数据中的模式和关系的过程。\n5.  **预测/推断**:使用训练好的模型,对新的、未见过的数据进行判断或预测。\n\n---\n\n### 主要学习类型\n\n机器学习主要分为三大类,区别在于学习时使用的“数据标签”不同:\n\n1.  **监督学习**\n    *   **核心**:使用 **带有标签** 的数据进行训练。即每个训练样本都包含了“输入数据”和“对应的正确答案(标签)”。\n    *   **目标**:学习输入到输出之间的映射关系,以便对新的输入做出预测。\n    *   **典型任务**:\n        *   **分类**:预测离散类别。如:垃圾邮件过滤(垃圾/非垃圾)、图像识别(猫/狗)、疾病诊断(患病/健康)。\n        *   **回归**:预测连续数值。如:预测房价、预测股价、预测销售额。\n\n2.  **无监督学习**\n    *   **核心**:使用 **没有标签** 的数据进行训练。算法需要自己发现数据中的内在结构和模式。\n    *   **目标**:探索数据的底层结构,进行数据分组或降维。\n    *   **典型任务**:\n        *   **聚类**:将数据自动分组。如:客户细分、社交网络分析。\n        *   **降维**:在保留主要信息的前提下压缩数据。便于可视化或后续处理。\n\n3.  **强化学习**\n    *   **核心**:智能体通过与环境互动来学习。它采取**行动**,获得**奖励**或**惩罚**,目标是学习一套能获得长期最大累积奖励的**策略**。\n    *   **类比**:像训练宠物或玩游戏。你做对了(接近目标)就加分,做错了就扣分,最终学会如何完成任务。\n    *   **典型应用**:AlphaGo(围棋)、机器人控制、自动驾驶、游戏AI。\n\n---\n\n### 为什么机器学习如此重要?\n\n*   **处理海量复杂数据**:在当今的大数据时代,人类难以手动处理和理解所有数据,机器学习可以高效地从中挖掘价值。\n*   **解决传统编程难以解决的问题**:如图像识别、自然语言理解、语音识别等任务,很难用“如果...那么...”的规则来穷尽描述。\n*   **自动化与智能化**:能够自动化进行预测、推荐、识别等任务,提升效率和体验。\n*   **持续改进**:随着新数据的输入,模型可以不断更新和优化,变得越来越聪明。\n\n---\n\n### 生活中的常见应用\n\n你每天都在接触机器学习:\n*   **推荐系统**:Netflix的电影推荐、淘宝的商品推荐、抖音的短视频推荐。\n*   **搜索引擎**:谷歌、百度的搜索排序和自动补全。\n*   **语音助手**:Siri、小爱同学、天猫精灵的语音识别和对话。\n*   **人脸识别**:手机解锁、支付验证、照片自动分类。\n*   **机器翻译**:谷歌翻译、百度翻译、DeepL。\n*   **金融风控**:信用卡欺诈检测、贷款信用评估。\n*   **自动驾驶**:感知周围环境并做出驾驶决策。\n\n### 总结\n\n**机器学习本质上是一种通过数据驱动,让计算机获得“举一反三”能力的技术。** 它不再依赖于人类编写所有逻辑,而是让计算机从大量示例中自己归纳出规律,从而能够处理未知的、复杂的新情况。\n\n它是当前人工智能浪潮的主要推动力,正在深刻地改变着我们生活的方方面面。', additional_kwargs={'refusal': None}, response_metadata={'token_usage': {'completion_tokens': 1052, 'prompt_tokens': 7, 'total_tokens': 1059, 'completion_tokens_details': None, 'prompt_tokens_details': {'audio_tokens': None, 'cached_tokens': 0}, 'prompt_cache_hit_tokens': 0, 'prompt_cache_miss_tokens': 7}, 'model_provider': 'deepseek', 'model_name': 'deepseek-chat', 'system_fingerprint': 'fp_eaab8d114b_prod0820_fp8_kvcache', 'id': '17b689d7-c36a-4767-90e8-ab7b6dfb3f38', 'finish_reason': 'stop', 'logprobs': None}, id='lc_run--019b6279-6c13-7451-978f-d35d0dde2c30-0', usage_metadata={'input_tokens': 7, 'output_tokens': 1052, 'total_tokens': 1059, 'input_token_details': {'cache_read': 0}, 'output_token_details': {}}))
    


```python
#结构化输出,用with_structured_output
from pydantic import BaseModel, Field#提供字段校验、默认值、描述信息、多层嵌套等高级功能  

class Movie(BaseModel):#定义结构
    """A movie with details."""
    title: str = Field(..., description="The title of the movie")
    year: int = Field(..., description="The year the movie was released")
    director: str = Field(..., description="The director of the movie")
    rating: float = Field(..., description="The movie's rating out of 10")
```


```python
model_with_structure = model.with_structured_output(Movie)#结构化输入输出
response = model_with_structure.invoke("Provide details about the movie Inception")
print(response)
```

    title='Inception' year=2010 director='Christopher Nolan' rating=8.8
    


```python
#小例子,搭建流式问答机器人,具体代码如下:
# 1. 导入所需依赖
from langchain_deepseek import ChatDeepSeek
from langchain.messages import HumanMessage, AIMessage, SystemMessage
from dotenv import load_dotenv
import os

# 2. 加载环境变量(优先使用.env文件中的配置,覆盖系统原有环境变量)
load_dotenv(override=True)

# 3. 初始化DeepSeek模型
model = ChatDeepSeek(model="deepseek-chat")

# 4. 初始化系统提示词(定义AI身份和对话风格)
system_message = SystemMessage(
    content="你叫小智,是一名乐于助人的智能助手。请在对话中保持温和、有耐心的语气,用简洁易懂的语言回复用户。"
)

# 5. 初始化对话上下文(初始包含系统提示词,用于记忆多轮对话)
messages = [system_message]

# 6. 打印提示信息
print("♦ 输入 exit 或 quit 即可退出对话\n")

# 7. 多轮对话主循环
while True:
    # 获取用户输入
    user_input = input("👤 你: ")
    
    # 退出逻辑:判断用户输入是否为退出指令(不区分大小写)
    if user_input.lower() in {"exit", "quit"}:
        print("🤖 小智: 对话结束,再见!")
        break
    
    # 追加用户消息到对话上下文
    messages.append(HumanMessage(content=user_input))
    
    # 调用模型获取流式回复
    print("🤖 小智: ", end="", flush=True)  # 不换行,保证回复内容紧跟提示词
    ai_response_content = ""
    # 流式获取AI回复,提升交互体验
    for chunk in model.stream(messages):
        if chunk.content:
            print(chunk.content, end="", flush=True)
            ai_response_content += chunk.content
    
    # 换行分隔,优化视觉效果
    print("\n")
    
    # 追加AI回复到对话上下文(实现多轮上下文记忆)
    messages.append(AIMessage(content=ai_response_content))
```

    ♦ 输入 exit 或 quit 即可退出对话
    
    👤 你: 你好,舞蹈怎么学
    🤖 小智: 你好!学习舞蹈是一个既有趣又有挑战的过程,以下是为你整理的入门步骤和建议,希望能帮助你顺利开始:
    
    ---
    
    ### **1. 明确学习目标**
       - **兴趣方向**:先确定想学的舞种(如街舞、爵士、芭蕾、民族舞、交谊舞等)。
       - **目标设定**:是为了健身、社交、表演,还是培养爱好?目标会影响学习重点。
    
    ---
    
    ### **2. 零基础入门建议**
       - **从基础开始**:
         - **体能训练**:舞蹈需要核心力量、柔韧性和耐力,可以每天做拉伸、平板支撑等。
         - **节奏感培养**:多听音乐,尝试用手或脚打拍子,跟上节拍。
       - **基本功练习**:
         - **身体协调性**:练习手脚分离动作(如左手画圆右手画方)。
         - **基本步法**:从简单步伐开始,如踏步、滑步等。
    
    ---
    
    ### **3. 选择学习方式**
       - **线上资源**(适合自学):
         - 平台:B站、YouTube有很多免费教学视频(搜索“零基础舞蹈教程”)。
         - 推荐博主:街舞可看“O-DOG”,爵士舞可关注“舞林一分钟”。
       - **线下课程**(推荐初学者):
         - 舞蹈工作室体验课:亲身体验老师指导,纠正动作。
         - 社区/学校社团:成本低,适合结交舞友。
       - **结合学习**:先通过视频了解基础,再找老师细化动作。
    
    ---
    
    ### **4. 练习技巧**
       - **分解动作**:将复杂动作拆解成小步骤,逐步连贯。
       - **对着镜子练**:及时调整姿势和表情。
       - **录制视频**:回看自己的动作,对比教学视频找差距。
       - **定期复习**:肌肉记忆需要重复,每周至少练习3次。
    
    ---
    
    ### **5. 常见误区提醒**
       - **不要急于求成**:舞蹈进步需要时间,从简单曲目开始。
       - **避免受伤**:热身必不可少!尤其注意膝盖、脚踝的保护。
       - **保持放松**:僵硬会影响动作美感,呼吸要均匀。
    
    ---
    
    ### **6. 附加小贴士**
       - **寻找舞友**:和小伙伴一起练会更坚持,也能互相纠正。
       - **参加舞蹈活动**:线下舞室或社区常有体验课、交流舞会。
       - **记录进步**:用打卡或视频记录自己的变化,会更有动力!
    
    ---
    
    如果你有具体的舞种或学习阶段(比如“想学K-pop翻跳”或“柔韧性差怎么办”),可以告诉我,我会给你更针对性的建议哦! 🌟
    
    


```python

```
 

更多推荐