(笔记+作业)书生大模型实战营春节卷王班---L0G2000 Python 基础知识

学员闯关手册:https://aicarrier.feishu.cn/wiki/QtJnweAW1iFl8LkoMKGcsUS9nld

课程视频:https://www.bilibili.com/video/BV13U1VYmEUr/

课程文档:https://github.com/InternLM/Tutorial/tree/camp4/docs/L0/Python

关卡作业:https://github.com/InternLM/Tutorial/blob/camp4/docs/L0/Python/task.md

开发机平台:https://studio.intern-ai.org.cn/

开发机平台介绍:https://aicarrier.feishu.cn/wiki/GQ1Qwxb3UiQuewk8BVLcuyiEnHe


Conda虚拟环境

bash 复制代码
#创建虚拟新环境,创建虚拟环境时我们主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。
conda create --name myenv python=3.9
#激活环境和推出环境
conda activate myenv
conda deactivate
#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv
#创建新环境到指定目录下,和激活指定目录下的环境
conda create --prefix /root/envs/myenv python=3.9
conda activate /root/envs/myenv

使用pip安装Python三方依赖包

使用pip安装包

bash 复制代码
pip install <somepackage> # 安装单个包,<somepackage>替换成你要安装的包名
pip install pandas numpy # 安装多个包,如panda和numpy
pip install numpy==2.0 # 指定版本安装
pip install numpy>=1.19,<2.0 # 使用版本范围安装

安装requirement.txt

pip install -r requirements.txt

安装包到指定目录

bash 复制代码
# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1

# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install <somepackage> --target /root/myenvs

# 注意这里也可以使用-r来安装requirements.txt
pip install -r requirements.txt --target /root/myenvs

#使用安装在指定目录的python包
import sys  
  
# 你要添加的目录路径  
your_directory = '/root/myenvs'  
  
# 检查该目录是否已经在 sys.path 中  
if your_directory not in sys.path:  
    # 将目录添加到 sys.path  
    sys.path.append(your_directory)  
  
# 现在你可以直接导入该目录中的模块了  
# 例如:import your_module

使用本地Vscode连接InternStudio开发机

VSCode安装Remote-SSH插件、python的插件、并进行SSH远程连接到开发机,

使用vscode连接开发机进行python debug

debug就是在程序中设置断点,一行一行运行代码,观测程序中变量的变化,然后找出并修正代码中的错误

调用书生LLM的api完成生成任务

获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次使用可能会需要先填写邀请码。

https://internlm.intern-ai.org.cn/api/document
使用api

python 复制代码
#./internlm_test.py
from openai import OpenAI
import os

client = OpenAI(
    api_key = os.getenv('api_key'),  # 此处传token,不带Bearer
    base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",
)

chat_rsp = client.chat.completions.create(
    model="internlm3-latest",
    messages=[{"role": "user", "content": "hello"}],
)

for choice in chat_rsp.choices:
    print(choice.message.content)

export api_key="填入你的api token"

python internlm_test.py

闯关任务 Leetcode 383

(笔记中提交代码与leetcode提交通过截图)

https://leetcode.cn/problems/ransom-note/description/

给你两个字符串:ransomNote 和 magazine ,判断 ransomNote 能不能由 magazine 里面的字符构成。

如果可以,返回 true ;否则返回 false 。

magazine 中的每个字符只能在 ransomNote 中使用一次。

python 复制代码
class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        from collections import Counter
        
        # 统计 ransomNote 和 magazine 中每个字符的频率
        ransom_counter = Counter(ransomNote)
        magazine_counter = Counter(magazine)
        
        # 检查 ransomNote 中的字符是否可以由 magazine 提供
        for char, count in ransom_counter.items():
            if magazine_counter[char] < count:
                return False
        
        return True

代码解释:

Counter: 使用 collections.Counter 来统计 ransomNote 和 magazine 中每个字符的出现次数。

遍历 ransomNote: 遍历 ransomNote 中的字符及其数量,检查 magazine 是否有足够的字符数量。如果某个字符在 magazine 中的数量少于在 ransomNote 中的数量,则返回 False。

for char, count in ransom_counter.items():

这行代码开始一个循环,遍历ransom_counter字典中的所有键值对。

char是字典中的键,代表一个字符。

count是字典中的值,代表该字符在赎金信中出现的次数。

.items()方法返回一个包含字典所有键值对的视图对象,可以在for循环中使用。

if magazine_counter[char] < count:

这行代码检查杂志文章中该字符的出现次数是否小于赎金信中该字符的出现次数。

magazine_counter[char]获取杂志文章中该字符的出现次数。

如果杂志中的次数小于赎金信中的次数,意味着无法用杂志中的字符拼写出赎金信。

返回结果: 如果 magazine 中的所有字符都能满足 ransomNote 的需求,返回 True。

使用示例:

bash 复制代码
solution = Solution()
print(solution.canConstruct("a", "b"))  # 输出: False
print(solution.canConstruct("aa", "ab"))  # 输出: False
print(solution.canConstruct("aa", "aab"))  # 输出: True

闯关任务 Vscode连接InternStudio debug笔记

下面是一段调用书生浦语API实现将非结构化文本转化成结构化json的例子,其中有一个小bug会导致报错。请大家自行通过debug功能定位到报错原因。

报错代码

python 复制代码
#python_debug.py
from openai import OpenAI
import json
import os
def internlm_gen(prompt,client):
    '''
    LLM生成函数
    Param prompt: prompt string
    Param client: OpenAI client 
    '''
    response = client.chat.completions.create(
        model="internlm2.5-latest",
        messages=[
            {"role": "user", "content": prompt},
      ],
        stream=False
    )
    return response.choices[0].message.content

api_key = os.getenv('api_key')
client = OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)

content = """
书生浦语InternLM2.5是上海人工智能实验室于2024年7月推出的新一代大语言模型,提供1.8B、7B和20B三种参数版本,以适应不同需求。
该模型在复杂场景下的推理能力得到全面增强,支持1M超长上下文,能自主进行互联网搜索并整合信息。
"""
prompt = f"""
请帮我从以下``内的这段模型介绍文字中提取关于该模型的信息,要求包含模型名字、开发机构、提供参数版本、上下文长度四个内容,以json格式返回。
`{content}`
"""
res = internlm_gen(prompt,client)
res_json = json.loads(res)
print(res_json)

报错原因解析

设置断点,查看报错变量

'根据提供的模型介绍文字,以下是提取的关于该模型的信息,以JSON格式返回:\n\njson\n{\n "model_name": "书生浦语InternLM2.5",\n "development_institution": "上海人工智能实验室",\n "parameter_versions": ["1.8B", "7B", "20B"],\n "context_length": "1M"\n}\n\n\n这个JSON对象包含了以下信息:\n- model_name:模型的名称,即"书生浦语InternLM2.5"。\n- development_institution:开发该模型的机构,为"上海人工智能实验室"。\n- parameter_versions:模型提供的参数版本,包括"1.8B"、"7B"和"20B"三个版本。\n- context_length:模型支持的上下文长度,为"1M",表示模型能够处理的上下文信息长度达到1百万字符。\n\n这些信息概括了模型的基本属性和功能特点,便于快速了解该模型的关键信息。'

报错变量修正

通过提示词去除额为文本,通过 res.strip('json\n').strip('')去除代码标记、换行符和缩进,

python 复制代码
from openai import OpenAI
import json
import os
def internlm_gen(prompt,client):
    '''
    LLM生成函数
    Param prompt: prompt string
    Param client: OpenAI client 
    '''
    response = client.chat.completions.create(
        model="internlm2.5-latest",
        messages=[
            {"role": "user", "content": prompt},
      ],
        stream=False
    )
    return response.choices[0].message.content

api_key=""
client = OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)

content = """
书生浦语InternLM2.5是上海人工智能实验室于2024年7月推出的新一代大语言模型,提供1.8B、7B和20B三种参数版本,以适应不同需求。
该模型在复杂场景下的推理能力得到全面增强,支持1M超长上下文,能自主进行互联网搜索并整合信息。
"""
prompt = f"""
请参考json格式,请帮我从以下``内的这段模型介绍文字中提取关于该模型的信息,要求包含模型名字、开发机构、提供参数只版本、上下文长度四个内容,以json格式返回,请移除额外的 Markdown 代码块标记 ````json和 ```,以及换行符\n`,不要有其他文字。
`{content}`
"""
res = internlm_gen(prompt,client)
# 移除 Markdown 代码块标记和换行符
json_str  = res.strip('```json\n').strip('```')
res_json = json.loads(json_str)
print(res_json)

成功!!!

可选任务 pip安装到指定目录

使用VScode连接开发机后使用pip install -t命令安装一个numpy到看开发机/root/myenvs目录下,并成功在一个新建的python文件中引用。

bash 复制代码
# 首先激活环境
conda activate /root/share/pre_envs/pytorch2.1.2cu12.1

# 创建一个目录/root/myenvs,并将包安装到这个目录下
mkdir -p /root/myenvs
pip install numpy --t /root/myenvs
python 复制代码
import sys  
  
# 你要添加的目录路径  
your_directory = '/root/myenvs'  
  
# 检查该目录是否已经在 sys.path 中  
if your_directory not in sys.path:  
    # 将目录添加到 sys.path  
    sys.path.append(your_directory)  
  
# 现在你可以直接导入该目录中的模块了  
# 例如:import your_module


相关推荐
reasonsummer2 分钟前
【教学类-89-04】20250130新年篇04——九叠篆印章(篆章生成器+UIBOT+Python)幼儿名字印章
python
Kerwin要坚持日更12 分钟前
一文讲解Java中的BIO、NIO、AIO之间的区别
java·开发语言
dal118网工任子仪13 分钟前
83,【7】BUUCTF WEB [MRCTF2020]你传你[特殊字符]呢
笔记·学习
earthzhang20211 小时前
《深入浅出HTTPS》读书笔记(31):HTTPS和TLS/SSL
开发语言·网络·python·https·1024程序员节
明月清了个风1 小时前
数据结构与算法学习笔记----容斥原理
笔记·学习·算法
天天爱吃肉82181 小时前
笔记:使用ST-LINK烧录STM32程序怎么样最方便?
笔记·stm32·嵌入式硬件
CSDN_PBB1 小时前
[STM32 - 野火] - - - 固件库学习笔记 - - -十三.高级定时器
笔记·stm32·学习
树天先森1 小时前
尚硅谷spring框架视频教程——学习笔记一(IOC、AOP)
笔记·学习·spring
HilariousDog1 小时前
clean code阅读笔记——如何命名?
windows·笔记
WarPigs1 小时前
Unity敌人逻辑笔记
笔记