Ch1 Conda虚拟环境

虚拟环境是Python开发中不可或缺的一部分,它允许你在不同的项目中使用不同版本的库,避免依赖冲突。Conda是一个强大的包管理器和环境管理器。

创建新环境

在开发机上已经安装好了conda,可以直接使用。创建虚拟环境时主要需要设置两个参数,一是虚拟环境的名字,二是python的版本。

conda create --name myenv python=3.9

这将创建一个名为myenv的新环境,使用Python 3.9。 在安装包时会有一步二次确认,填y就行。

【书生大模型实战营第四期】Python task 关卡插图


如果要退出环境,回到默认环境,命令为

conda deactivate

其他常见的虚拟环境管理命令还有

#查看当前设备上所有的虚拟环境
conda env list
#查看当前环境中安装了的所有包
conda list
#删除环境(比如要删除myenv)
conda env remove myenv

进行开发机python debug

配置debug

在上一篇文章中,已经将python环境搭建好,所以需要调试配置一下。
进入到vscode,连接到开发机,点击以下

【书生大模型实战营第四期】Python task 关卡插图1


选择python debugger后选择“Python File” config。

【书生大模型实战营第四期】Python task 关卡插图2

debug单个python文件

默认应该是已经选择好了python解释器,在代码行号旁边点击,即可设置断点

【书生大模型实战营第四期】Python task 关卡插图3


在第四行打上断点

【书生大模型实战营第四期】Python task 关卡插图4
【书生大模型实战营第四期】Python task 关卡插图5


启动debug

【书生大模型实战营第四期】Python task 关卡插图6


在“Run and Debug”侧边栏的“Variables”(变量)部分,你可以看到当前作用域内的所有变量及其值。

【书生大模型实战营第四期】Python task 关卡插图7

单步执行代码

可以使用顶部的debug面板的按钮来单步执行代码。这样,你可以逐行运行代码,并查看每行代码执行后的效果。

【书生大模型实战营第四期】Python task 关卡插图8

不同的断点

在VSCode中,我们还可以设置条件断点,这样断点只有在满足特定条件时才会触发。

普通断点:在代码行号左侧点击,添加断点。
条件断点:在断点标记上右键,选择条件断点(conditional breakpoint)。VSCode 中常用的条件断点主要有三种类型:
表达式(Expression):输入一个 Python 表达式,每次触发断点时运行该表达式,当表达式的值为 True 时 VS Code 会暂停执行。例如:x == 10
触发计数(Hit Count):断点触发计数达到输入值时才会暂停运行。
记录日志(Log Message):触发该断点时在 Debug Console 中输出指定信息,实际上就是 logpoint。需要输入要输出的信息,如果要用到表达式,可以使用 {} 将表达式括起来。例如,每次记录变量 i 的值可以写 x={i}。

Python调用InternLM api

获取api key

前往书生浦语的API文档,登陆后点击API tokens。初次进入应该要绑定手机号。

【书生大模型实战营第四期】Python task 关卡插图9


【书生大模型实战营第四期】Python task 关卡插图10


注意保存好自己的的API Token。

使用InternLM api

#./internlm_test.py
from openai import OpenAI
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')
#api_key = "" #也可以明文写在代码内,不推荐
client = OpenAI(base_url="https://internlm-chat.intern-ai.org.cn/puyu/api/v1/",api_key=api_key)
prompt = '''你好!你是谁?'''
response = internlm_gen(prompt,client)
print(response)

可以在终端中临时将token加入变量,此时该环境变量只在当前终端内有效。

export api_key="填入你的api token"
python internlm_test.py

若是想永久加入环境变量,可以对 ~/.bashrc 文件中添加以下命令。

export api_key="填入你的api token"

运行时可能会缺少openai的库,所以可以使用

pip install openai

效果如下

【书生大模型实战营第四期】Python task 关卡插图11

任务二

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

from openai import OpenAI
import json
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格式返回。
`{content}`
"""
res = internlm_gen(prompt,client)
res_json = json.loads(res)
print(res_json)

以上代码运行后,报错提示:

【书生大模型实战营第四期】Python task 关卡插图12


开始进行debug调试

【书生大模型实战营第四期】Python task 关卡插图13


弹出报错提示,所以尝试打印res,查看其res内容和类型

【书生大模型实战营第四期】Python task 关卡插图14


发现多了个json标识,要保证为纯json内容,即:

{
  "model_name": "书生浦语InternLM2.5",
  "developer": "上海人工智能实验室",
  "parameter_versions": [1.8B, 7B, 20B],
  "context_length": "1M"
}

可以修改代码为:(res左边删除json```\n,右边删除\n```)

from openai import OpenAI
import json
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格式返回。例如:
`{content}`
"""
res = internlm_gen(prompt,client)
# res = res.replace('json','',1) # 去掉json字符串
# res = res.strip('```\n') # 去掉json字符串前后的```符号
res = res.lstrip('```json\n')
res = res.rstrip('\n```')
print(res)
res_json = json.loads(res)
print(res_json)