书生大模型实战营-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:
- 位置:在统计
ransomNote
中每个字符的出现次数之后。 - 目的:检查
ransom_count
字典的内容是否正确。
- 位置:在统计
-
断点2:
- 位置:在统计
magazine
中每个字符的出现次数之后。 - 目的:检查
magazine_count
字典的内容是否正确。
- 位置:在统计
-
断点3:
- 位置:在检查
ransomNote
中的每个字符是否在magazine
中有足够的数量的循环内部。 - 目的:逐个检查每个字符的计数是否正确。
- 位置:在检查
-
断点4:
- 位置:在返回
True
或False
之前。 - 目的:检查最终的返回值是否符合预期。
- 位置:在返回
书生浦语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}")
总结
告别繁琐,拥抱高效!