调用大模型api

import os
from dotenv import load_dotenv
from langchain.chat_models import (init_chat_model,)

load_dotenv(encoding="utf-8")
# ========== 2. 实例化模型并调用 ==========
llmQwen = init_chat_model(
    model = "qwen-plus",    # 模型 ID,与平台模型广场一致
    model_provider = "openai",# # 表示使用「OpenAI 兼容」的 API(阿里百炼、通义等均兼容,阿里百炼不支持直接调用,需要通过OpenAI 兼容的 API 调用)
    api_key = os.getenv("aliQwen-api"),
    base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
)
# 调用并直接取回复正文:invoke 返回消息对象,.content 为文本内容
print(llmQwen.invoke("你是谁").content)

 

# ========== 第二个实例化模型并调用 ==========
llmDeepSeek = init_chat_model(
    model = "deepseek-chat",    # 模型 ID,与平台模型广场一致
    model_provider = "deepseek",# # 表示使用「OpenAI 兼容」的 API(阿里百炼、通义等均兼容,阿里百炼不支持直接调用,需要通过OpenAI 兼容的 API 调用)
    api_key = os.getenv("deepseek-api"),
    base_url = "https://api.deepseek.com"
)
print(llmDeepSeek.invoke("你是谁").content) # invoke():一次性返回完整结果。 适合: 简单问答+后台处理 + 不需要实时展示中间输出的场景
# stream():边生成边返回。 适合: 命令行实时输出 + 聊天打字机效果 + 长文本生成 +

 

大模型调用方式

1.普通调用 invoke/ainvoke

  • invoke:同步调用,最常用,适合单轮问答与脚本演示。
  • ainvoke:异步调用,适合异步 Web 服务、并发任务和高吞吐场景。
  • 命令行脚本、教学示例、简单后台任务:优先 invoke
  • FastAPI、异步服务、并发请求:优先 ainvoke
import os
import asyncio
from dotenv import load_dotenv
from langchain.chat_models import init_chat_model
from langchain_core.messages import SystemMessage,HumanMessage, AIMessage
load_detenv()

# 实例化模型
model = init_chat_model(
    model= "qwen-plus",
    model_provider= "openai",
    api_key= os.getenv("aliQwen-api"),
    base_url = "https://dashscope.aliyuncs.com/compatible-mode/v1"
)

async def main():
    """异步主函数:必须用 async def,内部用 await 调用 ainvoke。"""
    messages = [
        SystemMessage(content="你现在是ai领域的专家,回答要简洁"),
        HumanMessage(content="解释一下LangChain是什么,简洁回答100字以内")
    ]
    resp = awit model.ainvoke(messages)
    print(resp.content)
 
# ---------- 3. 运行异步程序 ----------
# asyncio.run(main()) 会启动事件循环、执行 main(),直到 main() 结束。初学者只需记住:异步入口这样写。
        
if __name__ == "__main__":
    asyncio.run(main())
  

 

2. 流式调用

  • stream:同步流式输出
  • astream:异步流式输出

流式的最大价值不是“更快算完”,而是更快把正在生成的内容展示给用户

真实项目里,stream / astream 很常用于:

  • 聊天界面的“打字机效果”
  • 长回答提前回显
  • 减少用户等待焦虑
import os
from dotenv import load_dotenv
from langchin.message import HumanMessage,SystemMessage
from langchain.chat_models import init_chat_model

load_dotenv()

# ---------- 1. 实例化模型 ----------
model = init_chat_model(
    model="qwen-plus",
    model_provider="openai",
    api_key=os.getenv("aliQwen-api"),
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
)
messages = [
    SystemMessage(content="你是小雯,一个乐于助人的ai助理"),
    HumanMessage(content="你是谁")
]
# ---------- 2. 同步调用 ----------
for chunk in model.stream(messages):
    print(chunk.content,end="",flush=True)
print("\n")

# ---------- 2. 异步调用 ----------

asycn def asycn_stream_call():
    resp = model.astream(messages)
    # 必须用 async for 遍历异步生成器,不能用普通 for
    async for chunk in response:
        print(chunk.content, end="", flush=True)
    print("\n")
    
# ---------- 4. 运行异步函数 ----------
if __name__ == "__main__":
    asyncio.run(async_stream_call())

 3. 批处理

  • batch:一次提交多条输入,统一获得多条结果
  • abatch:异步批处理

 别适合离线任务,而不是交互式聊天

  • 批量摘要一批文档
  • 批量清洗问答数据
  • 批量评估 Prompt 效果
  • 批量为商品、评论、工单做标签分类

 

# ---------- 1. 实例化模型 ----------

# ---------- 2. 准备多条独立问题(批量输入的列表)----------
# 每一条字符串会作为「一次请求」发给模型;batch 会并行处理这些请求,最后返回与之一一对应的响应列表。
questions = [
    "什么是redis?简洁回答,字数控制在100以内",
    "Python的生成器是做什么的?简洁回答,字数控制在100以内",
    "解释一下Docker和Kubernetes的关系?简洁回答,字数控制在100以内",
]

# ---------- 3. 批量调用:model.batch(questions) ----------
# 返回的是一个列表,每个元素对应一条问题的 AIMessage,用 .content 取该条回复的文本。
response = model.batch(questions)
print(f"响应类型:{type(response)}")
print()

# zip(questions, response):把“问题列表”和“回答列表”按位置配对,便于一起遍历。
for q, r in zip(questions, response):
    print(f"问题:{q}\n回答:{r.content}\n")

# ---------- 3. 异步批量调用(在 async 函数中)----------
async def async_batch_call():
    # await model.abatch(questions):异步批量处理,返回的仍是「问题与回答一一对应」的列表
    response = await model.abatch(questions)
    print(f"响应类型:{type(response)}")

    for q, r in zip(questions, response):
        print(f"问题:{q}\n回答:{r.content}\n")


# ---------- 4. 运行异步函数 ----------
if __name__ == "__main__":
    asyncio.run(async_batch_call())

 

posted @ 2026-04-28 15:56  幻影之舞  阅读(11)  评论(0)    收藏  举报