76 lines
2.4 KiB
Python
76 lines
2.4 KiB
Python
import os
|
||
import json
|
||
from openai import OpenAI
|
||
|
||
|
||
def deepseek(user_query, need_extra=False):
|
||
"""
|
||
调用 deepseek 接口生成回答。
|
||
|
||
参数:
|
||
user_query (str): 用户输入的查询内容。
|
||
need_extra (bool): 是否额外返回 usage 信息(completion_tokens),默认为 False。
|
||
|
||
返回:
|
||
如果 need_extra 为 True,则返回一个元组 (full_response, completion_tokens);
|
||
否则仅返回 full_response。
|
||
"""
|
||
client = OpenAI(
|
||
# 如果没有配置环境变量,请直接将 api_key 替换为实际的 API Key,例如:api_key="sk-xxx"
|
||
api_key=os.getenv("DASHSCOPE_API_KEY"),
|
||
base_url="https://dashscope.aliyuncs.com/compatible-mode/v1",
|
||
)
|
||
|
||
# 调用接口,开启流式输出并包含 usage 信息
|
||
completion = client.chat.completions.create(
|
||
model="deepseek-r1-distill-qwen-32b",
|
||
temperature=0.5,
|
||
messages=[
|
||
{'role': 'user', 'content': user_query}
|
||
],
|
||
stream=True,
|
||
stream_options={"include_usage": True}
|
||
)
|
||
|
||
full_response = ""
|
||
completion_tokens = 0
|
||
|
||
for chunk in completion:
|
||
# 解析 chunk 数据:优先使用 to_dict 方法,否则采用 model_dump_json 进行转换
|
||
if hasattr(chunk, 'to_dict'):
|
||
chunk_data = chunk.to_dict()
|
||
else:
|
||
chunk_data = json.loads(chunk.model_dump_json())
|
||
|
||
# 处理 usage 信息
|
||
usage = chunk_data.get('usage')
|
||
if usage is not None:
|
||
completion_tokens = usage.get('completion_tokens', 0)
|
||
|
||
# 处理 choices 信息
|
||
choices = chunk_data.get('choices', [])
|
||
if choices:
|
||
choice = choices[0]
|
||
delta = choice.get('delta', {})
|
||
content = delta.get('content', '')
|
||
if content:
|
||
full_response += content
|
||
# 如需实时输出可取消注释下面一行
|
||
print(content, end='', flush=True)
|
||
# 若需要处理完成原因,可在此处增加相应逻辑
|
||
if choice.get('finish_reason'):
|
||
pass
|
||
|
||
# 根据 need_extra 决定返回值
|
||
if need_extra:
|
||
return full_response, completion_tokens
|
||
else:
|
||
return full_response
|
||
|
||
|
||
# 示例调用
|
||
if __name__ == "__main__":
|
||
query = "1+1等于几?请用json格式回答,键名为'答案',键值为你的回答"
|
||
result = deepseek(query, need_extra=True)
|
||
print("\n完整内容为:", result)
|