书生大模型实战营

书生大模型实战营-L0-Python基础知识

任务要点

  • Python实现wordcount
  • Vscode连接InternStudio debug笔记

实践流程

赎金信

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

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

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

示例 1:

输入:ransomNote = “a”, magazine = “b”
输出:false
示例 2:

输入:ransomNote = “aa”, magazine = “ab”
输出:false
示例 3:

输入:ransomNote = “aa”, magazine = “aab”
输出:true

提示:

1 <= ransomNote.length, magazine.length <= 105
ransomNote 和 magazine 由小写英文字母组成

代码实现:

class Solution:
    def canConstruct(self, ransomNote: str, magazine: str) -> bool:
        ransom_count = {}
        magazine_count = {}

        for char in ransomNote:
            if char in ransom_count:
                ransom_count[char] += 1
            else:
                ransom_count[char] = 1

        for char in magazine:
            if char in magazine_count:
                magazine_count[char] += 1
            else:
                magazine_count[char] = 1

        for char in ransom_count:
            if char not in magazine_count or ransom_count[char] > magazine_count[char]:
                return False

        return True

代码解释:

  • 统计 ransomNote 和 magazine 中每个字符的出现次数:

    • 使用两个字典 ransom_count 和 magazine_count 分别记录 ransomNote 和 magazine 中每个字符的出现次数。

    • 遍历 ransomNote 和 magazine 中的每个字符,如果字符已经在字典中,则将其计数加一;否则,将其添加到字典中并设置计数为1。

  • 检查 ransomNote 中的每个字符是否在 magazine 中有足够的数量:

    • 遍历 ransom_count 中的每个字符。

    • 如果字符不在 magazine_count 中,或者 ransom_count 中的计数大于 magazine_count 中的计数,则返回 False,表示 ransomNote 不能由 magazine 构成。

  • 返回结果:

    • 如果 ransomNote 中的所有字符都能在 magazine 中找到足够的数量,则返回 True。
  • 复杂度分析

    • 时间复杂度:O(n + m),其中 n 是 ransomNote 的长度,m 是 magazine 的长度。

    • 空间复杂度:O(k),其中 k 是 ransomNote 和 magazine 中不同字符的数量(最多为26,因为只有小写英文字母)。

测试结果:在这里插入图片描述

连接InternStudio debug笔记

请使用本地vscode连接远程开发机,将上面你写的wordcount函数在开发机上进行debug,体验debug的全流程,并完成一份debug笔记(需要截图)。

步骤:

断点位置解释

  1. 断点1

    • 位置:在统计 ransomNote 中每个字符的出现次数之后。
    • 目的:检查 ransom_count 字典的内容是否正确。
  2. 断点2

    • 位置:在统计 magazine 中每个字符的出现次数之后。
    • 目的:检查 magazine_count 字典的内容是否正确。
  3. 断点3

    • 位置:在检查 ransomNote 中的每个字符是否在 magazine 中有足够的数量的循环内部。
    • 目的:逐个检查每个字符的计数是否正确。
  4. 断点4

    • 位置:在返回 TrueFalse 之前。
    • 目的:检查最终的返回值是否符合预期。
      在这里插入图片描述

书生浦语API Debug

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

Debug过程

首先填写对应的api_key
在这里插入图片描述
运行发现没有对应的openai库,手动安装
在这里插入图片描述
安装成功后进行调试
断点1:检查API调用是否成功。
在这里插入图片描述

断点2:检查API响应是否正确。
在这里插入图片描述

断点3:检查API密钥和URL是否正确,确保client对象创建成功。
在这里插入图片描述

断点4:检查internlm_gen函数的调用,确保传入的prompt和client正确。
在这里插入图片描述

断点5:检查JSON解析是否成功,确保res_json解析正确。

在这里插入图片描述
在这里插入图片描述
根据错误信息,json.loads(res) 在尝试解析 res 时失败了,因为 res 的内容是以 ```json开头的多行字符串,而不是一个有效的 JSON 字符串。

为了修复这个问题,我们需要在解析 JSON 之前,检查 res 是否以 ```json 开头,如果是,则裁剪掉这部分内容。
在这里插入图片描述
现在已经可以看到最终结果
在这里插入图片描述

修改过后的代码
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 = 'eyJ0eXBlIjoiSldUIiwiYWxnIjoiSFM1MTIifQ.eyJqdGkiOiI1MDE3MTYwMCIsInJvbCI6IlJPTEVfUkVHSVNURVIiLCJpc3MiOiJPcGVuWExhYiIsImlhdCI6MTczMDI2OTI1OCwiY2xpZW50SWQiOiJlYm1ydm9kNnlvMG5semFlazF5cCIsInBob25lIjoiMTUyOTY2MjY3OTIiLCJ1dWlkIjoiMmVlOGE3YWMtMTFlYy00ZjdmLWE3YzUtY2JmODU2Njc0YzlkIiwiZW1haWwiOiIiLCJleHAiOjE3NDU4MjEyNTh9.GfAtJ14ofsB5A-trL7d9VsGZeFqW4tGfCExYPBpnE4f9jCy5kiOL6ijhmvYJhCqJzwaErcxCT6zbqbFmwHP3hg'
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)

# 检查是否以 ```json 开头,如果是则裁剪掉这部分内容
if res.startswith('```json'):
    # 找到 ```json 标记的结束位置
    start_index = res.find('```json') + len('```json')
    # 找到 ```标记的结束位置
    end_index = res.rfind('```')
    if end_index > start_index:
        res = res[start_index:end_index].strip()  # 裁剪掉标记部分并去除前后空格

try:
    res_json = json.loads(res)
    print(res_json)
except json.JSONDecodeError as e:
    print(f"JSON解析失败: {e}")
    print(f"原始响应: {res}")

总结

告别繁琐,拥抱高效!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X_taiyang18

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值