书生大模型闯关L0G2000

156 阅读4分钟

任务概览

任务类型任务内容预计耗时
闯关任务Leetcode 383(笔记中提交代码与leetcode提交通过截图)20mins
闯关任务Vscode连接InternStudio debug笔记10mins
可选任务pip安装到指定目录10mins

作业总共分为三个任务,两个闯关任务均完成视作闯关成功。

提交地址:aicarrier.feishu.cn/share/base/…

任务一

完成Leetcode 383, 笔记中提交代码与leetcode提交通过截图

代码提交

class Solution {
 public:
  // Similar to 0242. Valid Anagram
  bool canConstruct(string ransomNote, string magazine) {
    vector<int> count(26);

    for (const char c : magazine)
      ++count[c - 'a'];

    for (const char c : ransomNote) {
      if (count[c - 'a'] == 0)
        return false;
      --count[c - 'a'];
    }

    return true;
  }
};

leetcode提交通过截图

截屏2025-01-24 17.25.39.png

任务二

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

TIPS:

  • 打断点查看下LLM返回的文本结果。造成本bug的原因与LLM的输出有关,学有余力的同学可以尝试修正这个BUG。
  • 作业提交时需要有debug过程的图文笔记,必须要有打断点在debug中看到res变量的值的截图。
  • 避免将api_key明文写在程序中!!!  本段demo为了方便大家使用debug所以将api_key明文写在代码中,这是一种极其不可取的行为!
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)

debug 提交 在 Res 处设置断点,可以运行,正常显示变量 截屏2025-01-26 16.58.34.png

点击下一步的时候报错,应该是没有加载 openai 的包,于是加载了 截屏2025-01-26 16.57.21.png

重新运行,继续报错,应该 API 的值为空造成的 截屏2025-01-26 16.58.59.png

输入 API 的值后,第一步可以运行了 截屏2025-01-26 17.00.46.png

继续下一步的时候,又报错了,这个错误表明程序尝试将一个无效的 JSON 数据(可能是空字符串或非 JSON 格式的数据)传递给 json.loads() 方法进行解析,后多次尝试,还是没有成功 截屏2025-01-26 17.00.59.png

在 deepseek 的帮助下,完成修改: 修改说明:

  1. prompt优化:明确要求只返回标准JSON对象,并指定字段名称和值类型

  2. 异常处理

    • 添加API调用时的异常捕获
    • 增加JSON解析失败时的错误提示
  3. 响应预处理:移除可能存在的```json标记

  4. 输出优化:使用json.dumps美化输出,支持中文显示

  5. 参数校验

    • 确保填写有效的API密钥
    • 添加空响应检查 修改后代码:
from openai import OpenAI
import json

def internlm_gen(prompt, client):
    '''
    LLM生成函数
    Param prompt: prompt string
    Param client: OpenAI client 
    '''
    try:
        response = client.chat.completions.create(
            model="internlm2.5-latest",
            messages=[{"role": "user", "content": prompt}],
            stream=False
        )
        return response.choices[0].message.content
    except Exception as e:
        print(f"API调用失败: {str(e)}")
        return None

api_key = '***'  # 确保填写有效API密钥
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更严格约束输出格式
prompt = f"""
请严格从以下``内的文本中提取模型信息,要求:
1. 只返回包含以下四个字段的标准JSON对象
2. 字段名称分别为:模型名字、开发机构、提供参数版本、上下文长度
3. 确保值为字符串类型
4. 不要包含任何JSON之外的文本或格式符号

需要提取的文本:
`{content}`
"""

res = internlm_gen(prompt, client)
if res:
    try:
        # 预处理可能存在的格式符号
        cleaned_res = res.replace('```json', '').replace('```', '').strip()
        res_json = json.loads(cleaned_res)
        print(json.dumps(res_json, indent=2, ensure_ascii=False))
    except json.JSONDecodeError:
        print(f"JSON解析失败,原始响应内容:\n{res}")
else:
    print("请求失败,请检查API配置")

输出正常啦! 截屏2025-01-28 14.37.18.png