Commit 7e395564 by tinywell

日志,时间记录

parent da717251
import logging
from typing import Dict, Any, Optional, List from typing import Dict, Any, Optional, List
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from langchain_core.tools import BaseTool from langchain_core.tools import BaseTool
......
import time import time
import logging
from typing import Dict, List, Tuple, Any, Optional from typing import Dict, List, Tuple, Any, Optional
from pydantic import BaseModel, Field from pydantic import BaseModel, Field
from typing import Type from typing import Type
......
...@@ -2,7 +2,7 @@ from pydantic import BaseModel,Field ...@@ -2,7 +2,7 @@ from pydantic import BaseModel,Field
from typing import Literal from typing import Literal
from langchain_core.prompts import PromptTemplate from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import PydanticOutputParser from langchain_core.output_parsers import PydanticOutputParser
from ..utils.logger import get_logger
class RouterQuery(BaseModel): class RouterQuery(BaseModel):
"""Route a user query to the most relevant datasource.""" """Route a user query to the most relevant datasource."""
...@@ -43,9 +43,16 @@ class RouterLLM: ...@@ -43,9 +43,16 @@ class RouterLLM:
partial_variables={"format_instructions": parser.get_format_instructions()}, partial_variables={"format_instructions": parser.get_format_instructions()},
) )
self.router = prompt | llm | parser self.router = prompt | llm | parser
self.logger = get_logger(self.__class__.__name__)
def invoke(self, question): def invoke(self, question):
return self.router.invoke({"query": question}) self.logger.info(f"路由用户查询: {question}")
try:
result = self.router.invoke({"query": question})
self.logger.info(f"路由用户查询结果: {result}")
return result
except Exception as e:
self.logger.error(f"路由用户查询失败: {e}", exc_info=True)
return {'datasource': 'none'}
def new_router_llm(llm): def new_router_llm(llm):
......
...@@ -84,7 +84,7 @@ from pydantic import BaseModel,Field ...@@ -84,7 +84,7 @@ from pydantic import BaseModel,Field
from langchain_core.prompts import PromptTemplate from langchain_core.prompts import PromptTemplate
from langchain_core.output_parsers import PydanticOutputParser from langchain_core.output_parsers import PydanticOutputParser
import re import re
from ..utils.logger import get_logger
class ReWriterModel(BaseModel): class ReWriterModel(BaseModel):
rewriter: str = Field( rewriter: str = Field(
...@@ -102,10 +102,11 @@ class ReWriteLLM: ...@@ -102,10 +102,11 @@ class ReWriteLLM:
) )
self.router = prompt | llm self.router = prompt | llm
self.parser = parser self.parser = parser
self.logger = get_logger(self.__class__.__name__)
def invoke(self, question, history): def invoke(self, question, history):
response = self.router.invoke({"query": question, "histories": history}) self.logger.info(f"重写用户查询: {question}")
try: try:
response = self.router.invoke({"query": question, "histories": history})
result = self.parser.invoke(response) result = self.parser.invoke(response)
except: except:
# 定义正则表达式模式 # 定义正则表达式模式
...@@ -119,6 +120,7 @@ class ReWriteLLM: ...@@ -119,6 +120,7 @@ class ReWriteLLM:
return match[1].strip() return match[1].strip()
return response.content return response.content
self.logger.info(f"重写后的问题: {result.rewriter}")
return result.rewriter return result.rewriter
def extend_history(self, history): def extend_history(self, history):
......
from typing import List, Dict from typing import List, Dict
from datetime import datetime from datetime import datetime
import time
from langchain_core.prompts import PromptTemplate,ChatPromptTemplate,SystemMessagePromptTemplate,MessagesPlaceholder,HumanMessagePromptTemplate from langchain_core.prompts import PromptTemplate,ChatPromptTemplate,SystemMessagePromptTemplate,MessagesPlaceholder,HumanMessagePromptTemplate
from langchain.tools.render import render_text_description_and_args from langchain.tools.render import render_text_description_and_args
...@@ -91,33 +92,56 @@ class ToolRunner: ...@@ -91,33 +92,56 @@ class ToolRunner:
self.chain = prompt | self.llm self.chain = prompt | self.llm
def run(self, input: str, tool_name: str, params: Dict): def run(self, input: str, tool_name: str, params: Dict):
self.logger.info(f"Running tool '{tool_name}' with params: {params}") start_time = time.time()
self.logger.info(f"开始执行工具 '{tool_name}',参数: {params}")
if tool_name not in self.tools: if tool_name not in self.tools:
self.logger.error(f"Tool {tool_name} not found") self.logger.error(f"工具 {tool_name} 未找到")
raise ValueError(f"Tool {tool_name} not found") raise ValueError(f"Tool {tool_name} not found")
try: try:
# 工具执行
tool_start = time.time()
tool = self.tools[tool_name] tool = self.tools[tool_name]
self.logger.info(f"Invoking tool {tool_name}") self.logger.info(f"调用工具 {tool_name}")
result = tool.invoke(params) result = tool.invoke(params)
self.logger.debug(f"Tool result: {result}") tool_time = time.time() - tool_start
self.logger.info(f"工具执行完成,耗时: {tool_time:.2f}秒")
self.logger.debug(f"工具执行结果: {result}")
# 提取 markdown 表格
table = "" table = ""
if "markdown" in result: if "markdown" in result:
table = result["markdown"] table = result["markdown"]
del result["markdown"] del result["markdown"]
self.logger.info("Getting LLM interpretation") # LLM 解释结果
llm_start = time.time()
self.logger.info("开始 LLM 结果解释")
llm_result = self.chain.invoke({"input": input, "result": result}) llm_result = self.chain.invoke({"input": input, "result": result})
llm_time = time.time() - llm_start
self.logger.info(f"LLM 解释完成,耗时: {llm_time:.2f}秒")
# 组装响应
response = { response = {
"output": llm_result.content, "output": llm_result.content,
"table": table "table": table
} }
self.logger.info("Tool execution completed successfully")
total_time = time.time() - start_time
self.logger.info(f"工具执行完成,总耗时: {total_time:.2f}秒,其中工具执行: {tool_time:.2f}秒,LLM解释: {llm_time:.2f}秒")
# 记录性能指标
self.logger.info(
"性能指标 - "
f"总耗时: {total_time:.2f}秒, "
f"工具执行: {tool_time:.2f}秒 ({(tool_time/total_time)*100:.1f}%), "
f"LLM解释: {llm_time:.2f}秒 ({(llm_time/total_time)*100:.1f}%)"
)
return response return response
except Exception as e: except Exception as e:
self.logger.error(f"Error running tool: {str(e)}") error_time = time.time() - start_time
self.logger.error(f"工具执行失败,耗时: {error_time:.2f}秒,错误: {str(e)}", exc_info=True)
raise raise
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment