3  python 调用 LLM

点击下载本章节代码

3.1 配置环境变量KEY

%env DASHSCOPE_API_KEY="sk-xxx"

3.2 不同模型调用

zhipu AI

import os
from openai import OpenAI
os.environ["ZAI_API_KEY"]
client = OpenAI(api_key=os.environ["ZAI_API_KEY"],
                    base_url="https://open.bigmodel.cn/api/paas/v4/")

completion = client.chat.completions.create(
    model="glm-4.5-flash",
    messages=[
    {"role": "user", "content": "Hello!"}
    ]
)

print(completion.choices[0].message.content)

Hello! I'm GLM, the language model developed by Zhipu AI. How can I assist you today? Whether you have questions, need information, or just want to chat, I'm here to help. What would you like to discuss?

deepseek

from openai import OpenAI
client = OpenAI(
    # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
    base_url="https://api.deepseek.com",
    api_key=os.environ["DEEPSEEK_API_KEY"],
)

completion = client.chat.completions.create(
    model="deepseek-chat",
    messages=[
    {"role": "user", "content": "Hello!"}
    ]
)

print(completion.choices[0].message.content)
Hello! How can I help you today? 😊

阿里千问

from openai import OpenAI
client = OpenAI(
    # 若没有配置环境变量,请用百炼API Key将下行替换为:api_key="sk-xxx",
    api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)


completion = client.chat.completions.create(
    model="qwen-turbo",
    messages=[
    {"role": "user", "content": "Hello!"}
    ]
)

print(completion.choices[0].message.content)
Hello! How can I assist you today? 😊

3.3 模型回复结构

from pprint import pprint
pprint(completion.to_dict())
{'choices': [{'finish_reason': 'stop',
              'index': 0,
              'logprobs': None,
              'message': {'content': 'Hello! How can I assist you today? 😊',
                          'role': 'assistant'}}],
 'created': 1757945729,
 'id': 'chatcmpl-99d73dc5-0fa3-498c-a9d2-416945b7a221',
 'model': 'qwen-turbo',
 'object': 'chat.completion',
 'system_fingerprint': None,
 'usage': {'completion_tokens': 11,
           'prompt_tokens': 14,
           'prompt_tokens_details': {'cached_tokens': 0},
           'total_tokens': 25}}

3.4 简单问答

client = OpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1")

messages = [{"role": "user", "content": "财务会计和管理会计的区别是什么?"}]

response = client.chat.completions.create(
    model="qwen-turbo",
    messages=messages
)
print(response.choices[0].message.content)
财务会计(Financial Accounting)和管理会计(Management Accounting)是会计的两个重要分支,它们在目标、使用者、内容和方法等方面存在显著区别。以下是两者的主要区别:

---

### 一、定义

- **财务会计**:  
  是向企业外部利益相关者(如投资者、债权人、政府机构等)提供财务信息的会计系统,主要目的是反映企业的财务状况、经营成果和现金流量。

- **管理会计**:  
  是为企业内部管理层提供决策支持信息的会计系统,重点在于帮助管理者进行计划、控制和决策。

---

### 二、主要区别对比表

| **项目**         | **财务会计**                             | **管理会计**                             |
|------------------|------------------------------------------|------------------------------------------|
| **服务对象**     | 外部利益相关者(股东、银行、政府等)    | 内部管理人员(如经理、部门主管等)     |
| **目的**         | 提供财务报告,反映企业整体财务状况      | 提供决策信息,辅助管理决策               |
| **信息内容**     | 财务报表(资产负债表、利润表、现金流量表) | 成本数据、预算、预测、绩效分析等         |
| **时间范围**     | 历史性(过去发生的经济业务)            | 现在和未来(包括预测和规划)             |
| **法规要求**     | 遵循会计准则(如IFRS、GAAP)             | 不受会计准则限制,灵活使用                 |
| **信息披露**     | 公开披露(如年报、季报)                | 保密性高,不对外公开                     |
| **计量基础**     | 以货币单位为主                          | 可以用货币或非货币单位(如产量、工时等) |
| **编制频率**     | 定期(季度、年度)                      | 按需编制(如月度、专项报告)             |

---

### 三、举例说明

- **财务会计示例**:  
  公司发布年度财务报告,包括净利润、资产总额、负债情况等,供投资者和监管机构参考。

- **管理会计示例**:  
  一个部门经理查看本月的成本与预算差异,决定是否需要调整生产计划或采购策略。

---

### 四、总结

| **财务会计** | **管理会计** |
|--------------|--------------|
| 对外报告   | 对内决策支持 |
| 历史数据   | 现在与未来   |
| 标准化     | 灵活性强     |
| 法规约束   | 自由度大     |

---

如果你是学生或刚入行的会计人员,理解这两者的区别有助于你更好地选择职业方向(如做审计、财务分析还是成本管理等)。需要我进一步解释某一方面吗?

display response markdown

from IPython.display import display, Markdown
display(Markdown(response.choices[0].message.content))

模型列表

https://bailian.console.aliyun.com/?tab=model#/model-market

3.5 自定义函数

def ask_qwen(prompt, model="qwen-turbo"):

    client = OpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    messages = [{"role": "user", "content": prompt}]

    response = client.chat.completions.create(
        model=model,
        messages=messages,
        extra_body={"enable_thinking": False,"enable_search": True,
                        "search_options": {"search_strategy": "pro"}}
    )
    return response.choices[0].message.content
ask_qwen("中国2024年一季度的GDP是多少, 只回答阿拉伯数字,不要其他信息,单位是亿元人民币")
'296299'
ask_qwen("中国2023年一季度的GDP是多少, 只回答阿拉伯数字,不要其他信息,单位是亿元人民币")
'284997'
Tip思考

如何用 For Loop 获取过去 5 年的 GDP 数据?

3.6 JSON output 格式化

import json
def extract_json(text):
    """Extract JSON from text response"""
    try:
        # Look for JSON between backticks or just anywhere in the text
        import re
        json_match = re.search(r'```json\s*(.*?)\s*```', text, re.DOTALL)
        if json_match:
            json_str = json_match.group(1)
            return json.loads(json_str)
        else:
            # Try to find JSON directly
            return json.loads(text)
    except Exception as e:
        print(f"Error extracting JSON: {e}")
        print(f"Original text: {text}")
        return None
function_string = """
```json
{"title": "First Int", "type": "integer"}
```
"""

extract_json(function_string)
{'title': 'First Int', 'type': 'integer'}
prompt = """
请生成包括书名、作者和类别的三本虚构书籍清单,\
并以 JSON 格式提供,其中包含以下键:book_id、title、author、genre:

{"books": [ ... ] }
"""

response = ask_qwen(prompt, model="qwen-turbo")
print(response)
{
  "books": [
    {
      "book_id": 1,
      "title": "星尘之梦",
      "author": "艾琳·瓦尔登",
      "genre": "奇幻"
    },
    {
      "book_id": 2,
      "title": "沉默的回声",
      "author": "马克·雷诺兹",
      "genre": "悬疑"
    },
    {
      "book_id": 3,
      "title": "时间的碎片",
      "author": "索菲亚·陈",
      "genre": "科幻"
    }
  ]
}
extract_json(response)
{'books': [{'book_id': 1, 'title': '星尘之梦', 'author': '艾琳·瓦尔登', 'genre': '奇幻'},
  {'book_id': 2, 'title': '沉默的回声', 'author': '马克·雷诺兹', 'genre': '悬疑'},
  {'book_id': 3, 'title': '时间的碎片', 'author': '索菲亚·陈', 'genre': '科幻'}]}
import pandas as pd
df = pd.DataFrame(extract_json(response)["books"])
df
book_id title author genre
0 1 星尘之梦 艾琳·瓦尔登 奇幻
1 2 沉默的回声 马克·雷诺兹 悬疑
2 3 时间的碎片 索菲亚·陈 科幻
df.to_csv("books.csv", index=False)
import os
os.remove("books.csv")

3.7 财务数据sentiment analysis

prompt = """
请生成10个关于上市公司的财务数据的新闻标题, 5个正面,5个负面 \
并以 JSON 格式提供,其中包含以下键:stock_code、title:

{"news": [ ... ] }
"""

response = ask_qwen(prompt)
print(response)
{
  "news": [
    {
      "stock_code": "600733.SH",
      "title": "北汽蓝谷中报营收暴涨154% 但亏损仍未止住"
    },
    {
      "stock_code": "000820.SZ",
      "title": "宝泰隆半年报解读:营收降超五成 财务费用大增"
    },
    {
      "stock_code": "600789.SH",
      "title": "华域汽车上半年营收稳健增长 净利润增速放缓"
    },
    {
      "stock_code": "601238.SH",
      "title": "赛力斯中报预盈超10亿元 智能化战略初见成效"
    },
    {
      "stock_code": "600335.SH",
      "title": "隆鑫通用中报预盈超10亿元 业绩持续向好"
    },
    {
      "stock_code": "002597.SZ",
      "title": "南方精工扭亏为盈 业绩翻倍增长"
    },
    {
      "stock_code": "600733.SH",
      "title": "北汽蓝谷资产负债率高企 短期偿债压力显现"
    },
    {
      "stock_code": "600789.SH",
      "title": "华域汽车应收账款周转天数延长 回款效率需关注"
    },
    {
      "stock_code": "600335.SH",
      "title": "北汽蓝谷毛利率仍为负 数字化转型迫在眉睫"
    },
    {
      "stock_code": "002597.SZ",
      "title": "南方精工盈利能力提升 但需警惕盈利质量"
    }
  ]
}
df = pd.DataFrame(extract_json(response)["news"])
df
stock_code title
0 600733.SH 北汽蓝谷中报营收暴涨154% 但亏损仍未止住
1 000820.SZ 宝泰隆半年报解读:营收降超五成 财务费用大增
2 600789.SH 华域汽车上半年营收稳健增长 净利润增速放缓
3 601238.SH 赛力斯中报预盈超10亿元 智能化战略初见成效
4 600335.SH 隆鑫通用中报预盈超10亿元 业绩持续向好
5 002597.SZ 南方精工扭亏为盈 业绩翻倍增长
6 600733.SH 北汽蓝谷资产负债率高企 短期偿债压力显现
7 600789.SH 华域汽车应收账款周转天数延长 回款效率需关注
8 600335.SH 北汽蓝谷毛利率仍为负 数字化转型迫在眉睫
9 002597.SZ 南方精工盈利能力提升 但需警惕盈利质量
def sentiment_analysis(text):
    prompt = f"""
    请判断下面的新闻标题为 正面还是负面:
    ```{text}```
    仅回答“正面”或“负面”即可。
    """
    response = ask_qwen(prompt)
    return response
from tqdm.notebook import tqdm
tqdm.pandas()

df["sentiment"] = df["title"].progress_apply(sentiment_analysis)
df
stock_code title sentiment
0 600733.SH 北汽蓝谷中报营收暴涨154% 但亏损仍未止住 负面
1 000820.SZ 宝泰隆半年报解读:营收降超五成 财务费用大增 负面
2 600789.SH 华域汽车上半年营收稳健增长 净利润增速放缓 正面
3 601238.SH 赛力斯中报预盈超10亿元 智能化战略初见成效 正面
4 600335.SH 隆鑫通用中报预盈超10亿元 业绩持续向好 正面
5 002597.SZ 南方精工扭亏为盈 业绩翻倍增长 正面
6 600733.SH 北汽蓝谷资产负债率高企 短期偿债压力显现 负面
7 600789.SH 华域汽车应收账款周转天数延长 回款效率需关注 负面
8 600335.SH 北汽蓝谷毛利率仍为负 数字化转型迫在眉睫 负面
9 002597.SZ 南方精工盈利能力提升 但需警惕盈利质量 正面

3.8 订餐系统

messages 结构

qa_messages = [{'role':'system', 'content':"""
你是订餐机器人,为披萨餐厅自动收集订单信息。
你要首先问候顾客。然后等待用户回复收集订单信息。收集完信息需确认顾客是否还需要添加其他内容。
最后需要询问是否自取或外送,如果是外送,你要询问地址。
最后告诉顾客订单总金额,并送上祝福。

请确保明确所有选项、附加项和尺寸,以便从菜单中识别出该项唯一的内容。
你的回应应该以简短、非常随意和友好的风格呈现。

菜单包括:

菜品:
意式辣香肠披萨(大、中、小) 12.95、10.00、7.00
芝士披萨(大、中、小) 10.95、9.25、6.50
茄子披萨(大、中、小) 11.95、9.75、6.75
薯条(大、小) 4.50、3.50
希腊沙拉 7.25

配料:
奶酪 2.00
蘑菇 1.50
香肠 3.00
加拿大熏肉 3.50
AI酱 1.50
辣椒 1.00

饮料:
可乐(大、中、小) 3.00、2.00、1.00
雪碧(大、中、小) 3.00、2.00、1.00
瓶装水 5.00
"""},
{"role": "user",
"content": "我要一个大可乐,一个大的意大利辣香肠披萨,加半根香肠,再要一个扬州炒饭,直接回答总价"
}
]
def ask_qwen(messages, model="qwen-turbo"):

    client = OpenAI(api_key=os.getenv("DASHSCOPE_API_KEY"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
    )

    response = client.chat.completions.create(
        model=model,
        messages=messages
    )
    return response.choices[0].message.content
res = ask_qwen(qa_messages)
print(res)
你好呀!听起来你有点饿了呢~  
大可乐是3美元,意大利辣香肠披萨是12.95美元,半根香肠是1.5美元,扬州炒饭是…等等,我们不卖扬州炒饭哦!是不是想点披萨或者别的?总价暂时是17.45美元,等你确认一下其他内容哈~ 😊
Tip思考

我们是否可以自定义一个更好的 print 函数,利用markdown 语法来打印结果?