{ "cells": [ { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#步骤1 获取对应文件全部信息\n", "from openai import OpenAI\n", "from dotenv import load_dotenv \n", "import os\n", "import glob\n", "import json\n", "import pandas as pd\n", "# print(\"✅ pandas 导入成功\")\n", "\n", "client = OpenAI(base_url=os.getenv(\"BAILIAN_API_BASE_URL\"),\n", " api_key=os.getenv(\"BAILIAN_API_KEY\"))\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#步骤2\n", "from datetime import datetime\n", "\n", "# 查询当前时间的工具。返回结果示例:“当前时间:2024-04-15 17:15:18。“\n", "magic_num_n=0\n", "magic_num_p=0\n", "\n", "def current_emotion_negative(reason: str):\n", " \"\"\"\"\"\"\n", " # 获取当前日期和时间\n", " current_datetime = datetime.now()\n", " # 格式化当前日期和时间\n", " formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S'),\n", " \n", " # 返回格式化后的当前时间\n", " # return f\"当前时间:{formatted_time}。\"\n", " global magic_num_n\n", " magic_num_n = magic_num_n +1\n", " print('magic_num_nmagic_num_nmagic_num_n', magic_num_n)\n", " return magic_num_n\n", "\n", "# current_emotion_negative()\n", "# print('current_emotion_negativecurrent_emotion_negativecurrent_emotion_negative', magic_num_n)\n", "\n", "def current_emotion_positive(reason: str):\n", " \"\"\"\"\"\"\n", " # 获取当前日期和时间\n", " current_datetime = datetime.now()\n", " # 格式化当前日期和时间\n", " formatted_time = current_datetime.strftime('%Y-%m-%d %H:%M:%S'),\n", " \n", " # 返回格式化后的当前时间\n", " # return f\"当前时间:{formatted_time}。\"\n", " global magic_num_p\n", " magic_num_p = magic_num_p +1\n", " print('magic_num_pmagic_num_pmagic_num_p', magic_num_p)\n", " return magic_num_p\n", "# current_emotion_negative()\n", "# print('current_emotion_negativecurrent_emotion_negativecurrent_emotion_negative', magic_num_n)\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n", "#调用接口的函数\n", "def generate_response(\n", " # user_input, \n", " model, \n", " messages,\n", " # tools,\n", " # system_prompt\n", " ):\n", " try:\n", " completion = client.chat.completions.create(\n", " model=model, # 通过参数传递\n", " \n", " # model=\"qwen3-32b\",\n", " # messages=[\n", " # {\"role\": \"system\", \"content\": system_prompt},\n", " # {\"role\": \"user\", \"content\": user_input}\n", " # ]\n", " messages = messages,\n", " tools=[\n", " {\n", " \"type\": \"function\",\n", " \"function\": {\n", " \"name\": \"current_emotion_negative\",\n", " \"description\": \"当你判断负面情绪的时候非常有用。\",\n", " \"parameters\":{\n", " \"reason\":{\n", " \"type\":\"string\",\n", " \"description\":\"Th reason of the emotion.\"\n", " }\n", " }\n", " }\n", " },\n", " {\n", " \"type\": \"function\",\n", " \"function\": {\n", " \"name\": \"current_emotion_positive\",\n", " \"description\": \"当你判断正面情绪的时候非常有用。\",\n", " }\n", " },\n", " \n", " ],\n", " tool_choice=\"auto\", # 模型必须从两个工具中选择\n", " # max_tokens=0, # 关键:禁止生成任何文本\n", " # tool_choice={\"type\": \"function\", \"function\": {\"name\": \"current_emotion_negative\"}}, # 关键参数:强制调用指定工具\n", " extra_body={\"enable_thinking\": False},\n", " temperature=0.1,\n", " )\n", " # print('completioncompletioncompletion', completion)\n", " # return completion.choices[0].message.content\n", " return completion\n", " except Exception as e:\n", " print(f\"最终失败: {str(e)}\"),\n", " \n", " return \"调用失败\"" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "# 获取 data 下所有子文件夹中的 .txt 文件\n", "txt_files = glob.glob('../data/acllmdb_sentiment_small/negative/*.txt', recursive=True)\n", "\n", "# 存储所有结果的列表\n", "emotion_results = []\n", "\n", "# print(f\"{txt_files}\")\n", "def find_text_in_target ():\n", " for index, file_path in enumerate(txt_files, start=0):\n", " print(f\"找到文件: {file_path}\")\n", " with open(file_path, 'r', encoding='utf-8') as f:\n", " # print(f\"内容片段:\\n{f.read(1000)}...\\n\"\n", " content = f.read(2000), # 读取前2000个字符\n", " # print('txt_filestxt_filestxt_files', txt_files[index])\n", " messages = [\n", " {\"role\": \"system\", \"content\": \"\"\"\n", "你是一个很有帮助的助手。根据用户的输入内容,按照以下规则选择合适的工具\n", " - 如果用户提供的文字情感不是正面的,请调用 ‘current_emotion_negative’ 函数\n", " - 如果用户提供的文字情感不是负面的,请调用 ‘current_emotion_positive’ 函数\n", "请以友好的语气回答问题。\"\"\"},\n", "]\n", " messages.append(\n", " {\n", " \"role\":\"user\",\n", " \"content\":f\"{content}\"\n", " }\n", " ),\n", " # 调用时传入全局变量\n", " response = generate_response(\n", " # user_input=\"你好!\",\n", " model=\"qwen3-30b-a3b\",\n", " # model=\"qwen3-32b\",\n", " messages = messages\n", " # system_prompt=GLOBAL_PROMPT\n", ")\n", " # print('response',response), \n", " # .choices[0].finish_reason\n", " # if response.conte\n", " if response==\"调用失败\":\n", " print('调用失败')\n", " elif response.choices[0].finish_reason=='tool_calls':\n", " function_name = response.choices[0].message.tool_calls[0].function.name\n", " arguments_string = response.choices[0].message.tool_calls[0].function.arguments\n", " # print('arguments_string',arguments_string)\n", "\n", " # 使用json模块解析参数字符串\n", " try:\n", " arguments = json.loads(arguments_string)\n", " except json.JSONDecodeError as e:\n", " print(f\"JSON解析错误: {e}\")\n", " print(f\"错误位置: 字符 {e.pos}\")\n", " print(f\"原始字符串: '{arguments_string}'\")\n", " # 尝试修复常见的JSON问题\n", " try:\n", " # 如果字符串为空或只包含空白字符\n", " if not arguments_string or arguments_string.strip() == '':\n", " arguments = {}\n", " else:\n", " # 尝试清理字符串\n", " cleaned_string = arguments_string.strip()\n", " if not cleaned_string.startswith('{'):\n", " cleaned_string = '{' + cleaned_string\n", " if not cleaned_string.endswith('}'):\n", " cleaned_string = cleaned_string + '}'\n", " arguments = json.loads(cleaned_string)\n", " except:\n", " print(\"无法修复JSON,使用空字典\")\n", " arguments = {}\n", "\n", " # print('arguments',arguments) \n", " # print('function_name',function_name) \n", " global current_emotion_negative\n", " global current_emotion_positive\n", " global magic_num_p\n", " global magic_num_n\n", " function_mapper = {\n", " # \"get_current_weather\": get_current_weather,\n", " \"current_emotion_negative\": current_emotion_negative,\n", " \"current_emotion_positive\": current_emotion_positive,\n", " # \"current_emotion_negative_test\": current_emotion_negative_test,\n", " }\n", " # 获取函数实体\n", " function = function_mapper[function_name]\n", " \n", " # 处理函数调用参数\n", " if function_name == \"current_emotion_negative\":\n", " # current_emotion_negative 需要 reason 参数\n", " reason = arguments.get('reason', '') if arguments else ''\n", " function_output = function(reason)\n", " elif function_name == \"current_emotion_positive\":\n", " # current_emotion_negative 需要 reason 参数\n", " reason = arguments.get('reason', '') if arguments else ''\n", " function_output = function(reason)\n", " else:\n", " # 其他函数的通用处理\n", " if arguments == {}:\n", " function_output = function()\n", " else:\n", " function_output = function(arguments)\n", " # 打印工具的输出\n", " # print(f\"工具函数输出:{function_output}\\n\")\n", " emotion_results.append({\n", " 'index': index,\n", " 'content': content,\n", " 'reason': arguments.get('reason', ''),\n", " 'function_name': function_name,\n", " 'file_path': file_path,\n", " })\n", " print(f\"当前一共检验了{index+1}段文字,负面情绪{magic_num_n},正面情绪{magic_num_p}: {arguments.get('reason','')}\")\n", " # print(f'第{index}段, content内容:{content}')\n", " # return res\n", " # global magic_num_n\n", " # print('magic_num_nmagic_num_nmagic_num_nmagic_num_n', magic_num_n)\n", " return\n", "\n", "find_text_in_target() \n", "# pandas\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "messages = [\n", " {\"role\": \"system\", \"content\": \"You are a helpful assistant.\"},\n", "]\n", "\n", "# 调用时传入全局变量\n", "response = generate_response(\n", " # user_input=\"你好!\",\n", " model=\"qwen3-30b-a3b\",\n", " # model=\"qwen3-32b\",\n", " messages = messages,\n", " \n", " # system_prompt=GLOBAL_PROMPT\n", ")\n", "# print('response',response)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "#调用\n", "tools = [\n", " {\n", " \"type\": \"function\",\n", " \"function\": {\n", " \"name\": \"current_emotion_negative\",\n", " \"description\": \"当你判断负面情绪的时候非常有用。\",\n", " }\n", " },\n", " {\n", " \"type\": \"function\",\n", " \"function\": {\n", " \"name\": \"current_emotion_positive\",\n", " \"description\": \"当你判断正面情绪的时候非常有用。\",\n", " }\n", " },\n", "]\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "df = pd.DataFrame(emotion_results)\n", "print('emotion_results ',emotion_results)\n", "df.to_csv('emotion_results.csv', index=False)\n", "print(\"✅ 结果已保存到 emotion_results.csv\")" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.11.13" } }, "nbformat": 4, "nbformat_minor": 2 }