intent_recog / llm_client.py
OrangeWalking's picture
Rename llm-client.py to llm_client.py
c2f9ad2 verified
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
LLM Client Module
--------------
Handles communication with the LLM API using credentials from .env.
"""
import os
import logging
import json
from dotenv import load_dotenv
import openai
logger = logging.getLogger(__name__)
class LLMClient:
"""Client for interacting with OpenAI-compatible LLM APIs."""
def __init__(self, model="gpt-3.5-turbo"):
"""
Initialize the LLM client with API credentials from .env.
Args:
model: Default LLM model to use
"""
# Ensure environment variables are loaded
load_dotenv()
self.api_key = os.getenv("OPENAI_API_KEY")
self.base_url = os.getenv("OPENAI_BASE_URL")
self.default_model = model
if not self.api_key:
raise ValueError("OPENAI_API_KEY not found in environment variables")
if not self.base_url:
raise ValueError("OPENAI_BASE_URL not found in environment variables")
# 初始化OpenAI客户端
self.client = openai.OpenAI(
api_key=self.api_key,
base_url=self.base_url
)
logger.info(f"LLM client initialized with base URL: {self.base_url} and default model: {model}")
def identify_intent(self, prompt, model=None, temperature=0.3):
"""
Call the LLM API to identify the intent from the prompt.
Args:
prompt: The prompt to send to the LLM
model: The model to use for the API call (defaults to self.default_model)
temperature: Sampling temperature for the model
Returns:
Identified intent as a string
"""
try:
# 使用指定的模型或默认模型
model_to_use = model or self.default_model
logger.info(f"Calling LLM API with model: {model_to_use}")
# 使用OpenAI客户端调用Chat Completion API
response = self.client.chat.completions.create(
model=model_to_use,
messages=[{"role": "user", "content": prompt}],
temperature=temperature,
max_tokens=50 # We only need a short response for the intent
)
# 从响应中提取内容
content = response.choices[0].message.content.strip()
logger.info(f"LLM identified intent: {content}")
return content
except Exception as e:
logger.error(f"Error identifying intent: {e}", exc_info=True)
return f"Error: {str(e)}"
def chat(self, messages, model=None, temperature=0.7, max_tokens=1000):
"""
进行对话聊天
Args:
messages: 消息列表,每个消息包含role和content
model: 要使用的模型 (默认为self.default_model)
temperature: 采样温度
max_tokens: 最大生成令牌数
Returns:
生成的回复内容
"""
try:
# 使用指定的模型或默认模型
model_to_use = model or self.default_model
logger.info(f"Calling LLM chat API with model: {model_to_use}")
# 使用OpenAI客户端调用Chat Completion API
response = self.client.chat.completions.create(
model=model_to_use,
messages=messages,
temperature=temperature,
max_tokens=max_tokens
)
# 从响应中提取内容
content = response.choices[0].message.content
return content
except Exception as e:
logger.error(f"Error in chat: {e}", exc_info=True)
return f"Error: {str(e)}"
# For testing
if __name__ == "__main__":
logging.basicConfig(level=logging.INFO)
# Load environment variables
load_dotenv()
client = LLMClient()
test_prompt = """
请根据用户的输入,判断用户的意图属于下列哪一类。
用户输入: "请帮我理清当前场景中的问题"
可能的意图类别及其示例:
意图: 1. 需求梳理
示例:
- "我目前不确定面临的决策问题,请帮我理清我的优化需求。"
- "请引导我一步步明确建模场景中的关键问题。"
- "请协助我明确问题中哪些部分需要约束条件。"
意图: 2. 建模
示例:
- "请根据我提供的场景描述自动生成一个数学模型。"
- "帮我构建一个模型,包含目标函数和约束条件。"
- "请生成数学模型,并自动添加必要的决策变量。"
根据以上信息,用户的输入最符合哪个意图?请只回复意图名称。
"""
intent = client.identify_intent(test_prompt)
print(f"Identified intent: {intent}")
# 测试聊天功能
chat_messages = [
{"role": "system", "content": "你是一个专业的数学建模助手。"},
{"role": "user", "content": "请帮我理清当前场景中的问题"}
]
chat_response = client.chat(chat_messages)
print("\nChat response:")
print(chat_response)