1.動機
複数のモデルに接続可能なAgentを作って、別のことをやっていたのですが、
・DeepSeekとの通信で、Abortが発生したりして、安定しない。
・WindsurfのAIに依頼していると、DeepSeekの通信部分のみログが膨れ上がってきた。
ので、動作確認のために、単純なものを作ってみました。
ちなみに、確認の結果、DeepSeek v3の応答が、すごく遅くなっていることがわかりました。サイトを確認すると、追加チャージ禁止の状態になっていますね。
2.機能など
以前に作った、「会話履歴付きのチャットボット」をもと作成しました。
Windsurfに指示して、OpenAI/Anthropic/Google Gemini/DeepSeekのAIモデルを切り替えて、チャットをできるようにし、下記の機能を実装しました。(AIに実装させました)
- ・複数のAIプロバイダーのモデルをシームレスに切り替え
- ・対話履歴の管理(サイズ制限、保存、表示)
- ・詳細なログ機能
- ・使いやすいコマンドインターフェース
ツール実行時に使えるコマンドは下記の通りです。
コマンド | 説明 | 備考 |
---|---|---|
/model <プロバイダー> <モデル名> | モデルを切り替えます | 例: /model anthropic claude-3-opus | /models | 利用可能なモデルの一覧を表示 |
/current | 現在使用中のモデルを表示 | |
/history_size <数値> | 対話履歴の保存数を設定 | 例: /history_size 20 |
/history_info | 現在の対話履歴の設定を表示 | |
/help | ヘルプを表示 | |
/quit | 現プログラムを終了 |
詳細は、AIで自動生成したREADME.mdを参照してください
3.ソースコード
機能追加を自動で行った結果のソースコードを、下記のとおりです。
/**
* MultiModelChat - マルチモデルチャットボット
* ====================================
*
* 複数のAIモデル(OpenAI、Anthropic、Google、DeepSeek)を切り替えて使用できる
* インタラクティブなチャットボットです。
*
* 主な機能:
* - 複数のAIプロバイダーのモデルをシームレスに切り替え
* - 対話履歴の管理(サイズ制限、保存、表示)
* - 詳細なログ機能
* - 使いやすいコマンドインターフェース
*
* @version 1.0.0
* @author Michihiro Yamazaki
* @license MIT
*
* MIT License
*
* Copyright (c) 2025 Michihiro Yamazaki
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in all
* copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
* SOFTWARE.
*/
import { ChatOpenAI } from "@langchain/openai";
import { ChatGoogleGenerativeAI } from "@langchain/google-genai";
import { ChatAnthropic } from "@langchain/anthropic";
import { ChatDeepSeek } from "@langchain/deepseek";
import { InMemoryChatMessageHistory } from "@langchain/core/chat_history";
import { ChatPromptTemplate } from "@langchain/core/prompts";
import { RunnablePassthrough, RunnableSequence, RunnableWithMessageHistory } from "@langchain/core/runnables";
import * as readline from 'readline';
import 'dotenv/config'
import { v4 as uuidv4 } from 'uuid';
import * as fs from 'fs';
import * as path from 'path';
// 設定
let historySize = 10; // デフォルトの履歴保存数
let messages = []; // 対話履歴の配列
// ログディレクトリの作成
const LOG_DIR = 'logs';
const RAS_LOG_DIR = path.join(LOG_DIR, 'ras');
if (!fs.existsSync(LOG_DIR)) {
fs.mkdirSync(LOG_DIR);
}
if (!fs.existsSync(RAS_LOG_DIR)) {
fs.mkdirSync(RAS_LOG_DIR);
}
// 現在のログファイル名を取得する関数
function getCurrentLogFileName() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
return path.join(LOG_DIR, `chat_${year}${month}${day}.log`);
}
// RASログファイル名を取得する関数
function getCurrentRasFileName() {
const now = new Date();
const year = now.getFullYear();
const month = String(now.getMonth() + 1).padStart(2, '0');
const day = String(now.getDate()).padStart(2, '0');
return path.join(RAS_LOG_DIR, `ras_${year}${month}${day}.json`);
}
// RASログを保存する関数
function saveRasLog(requestData, responseData, modelInfo) {
const logFile = getCurrentRasFileName();
let logs = [];
// 既存のログファイルが存在する場合は読み込む
if (fs.existsSync(logFile)) {
try {
const fileContent = fs.readFileSync(logFile, 'utf8');
logs = JSON.parse(fileContent);
} catch (error) {
console.error('RASログファイルの読み込みに失敗しました:', error);
logs = [];
}
}
// 新しいログエントリを作成
const rasLog = {
timestamp: new Date().toISOString(),
model: modelInfo,
request: requestData,
response: responseData
};
// ログを配列に追加
logs.push(rasLog);
// ログを保存
try {
fs.writeFileSync(logFile, JSON.stringify(logs, null, 2));
} catch (error) {
console.error('RASログの保存に失敗しました:', error);
}
}
// ログを保存する関数
function saveLog(role, content, modelName = '') {
const now = new Date();
const timestamp = now.toISOString();
const logEntry = {
timestamp,
role,
modelName,
content
};
const logFile = getCurrentLogFileName();
fs.appendFileSync(logFile, JSON.stringify(logEntry) + '\n');
}
// カスタムコールバック関数を作成
const callbacks = {
async handleLLMStart(llm, prompts) {
this.startTime = Date.now();
this.requestData = {
timestamp: new Date().toISOString(),
model: llm.model,
prompts: prompts
};
},
async handleLLMEnd(output) {
const endTime = Date.now();
const responseData = {
timestamp: new Date().toISOString(),
duration: endTime - this.startTime,
output: output
};
// RASログを保存
saveRasLog(
this.requestData,
responseData,
{
provider: currentModelName.split('/')[0],
model: currentModelName.split('/')[1]
}
);
},
async handleLLMError(error) {
const responseData = {
timestamp: new Date().toISOString(),
error: error.message,
stack: error.stack
};
// エラー時のRASログを保存
saveRasLog(
this.requestData,
responseData,
{
provider: currentModelName.split('/')[0],
model: currentModelName.split('/')[1]
}
);
}
};
// モデル定義
const models = {
openai: {
"gpt-4o": new ChatOpenAI({ model: "gpt-4o", temperature: 0, callbacks: [callbacks] }),
"gpt-4o-mini": new ChatOpenAI({ model: "gpt-4o-mini", temperature: 0, callbacks: [callbacks] }),
"gpt-4-turbo": new ChatOpenAI({ model: "gpt-4-turbo", temperature: 0, callbacks: [callbacks] }),
"gpt-4": new ChatOpenAI({ model: "gpt-4", temperature: 0, callbacks: [callbacks] }),
"gpt-3.5-turbo": new ChatOpenAI({ model: "gpt-3.5-turbo", temperature: 0, callbacks: [callbacks] }),
},
google: {
"gemini-2.0-flash": new ChatGoogleGenerativeAI({ modelName: "gemini-2.0-flash", temperature: 0, callbacks: [callbacks] }),
"gemini-1.5-flash": new ChatGoogleGenerativeAI({ modelName: "gemini-1.5-flash", temperature: 0, callbacks: [callbacks] }),
"gemini-1.5-pro": new ChatGoogleGenerativeAI({ modelName: "gemini-1.5-pro", temperature: 0, callbacks: [callbacks] }),
},
anthropic: {
"claude-3.5-sonnet": new ChatAnthropic({ modelName: "claude-3-5-sonnet-20241022", temperature: 0, callbacks: [callbacks] }),
"claude-3.5-haiku": new ChatAnthropic({ modelName: "claude-3-5-haiku-20241022", temperature: 0, callbacks: [callbacks] }),
"claude-3-opus": new ChatAnthropic({ modelName: "claude-3-opus-20240229", temperature: 0, callbacks: [callbacks] }),
"claude-3-sonnet": new ChatAnthropic({ modelName: "claude-3-sonnet-20240229", temperature: 0, callbacks: [callbacks] }),
"claude-3-haiku": new ChatAnthropic({ modelName: "claude-3-haiku-20240307", temperature: 0, callbacks: [callbacks] }),
},
deepseek: {
"v3": new ChatDeepSeek({ model: "deepseek-chat", temperature: 0, callbacks: [callbacks] }),
}
};
// Create interface for reading from console
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
// モデルの設定
let currentModel = models.openai["gpt-4"];
let currentModelName = "openai/gpt-4";
// プロンプトを更新する関数
function updatePrompt() {
rl.setPrompt(`[${currentModelName}] 入力してください > `);
rl.prompt(true); // 現在の行を再描画
}
// 初期プロンプトの設定
updatePrompt();
// プロンプト
const prompt = ChatPromptTemplate.fromMessages([
[
"system",
`あなたは私が送ったメッセージをすべて覚えている親切なアシスタントです。`,
],
["placeholder", "{chat_history}"],
["human", "{input}"],
]);
// コマンドの定義
const COMMANDS = {
models: {
description: "利用可能なモデルの一覧を表示",
usage: "/models"
},
model: {
description: "モデルを切り替え",
usage: "/model <provider> <model_name>"
},
current: {
description: "現在のモデルを表示",
usage: "/current"
},
history_size: {
description: "対話履歴の保存数を設定",
usage: "/history_size <数値>"
},
history_info: {
description: "現在の対話履歴の設定を表示",
usage: "/history_info"
},
help: {
description: "このヘルプを表示",
usage: "/help"
},
quit: {
description: "チャットを終了",
usage: "/quit"
}
};
// ヘルプを表示する関数
function showHelp() {
console.log("利用可能なコマンド:");
for (const [command, info] of Object.entries(COMMANDS)) {
console.log(`${info.usage} - ${info.description}`);
}
}
// メッセージ処理関数
async function processMessage(input) {
try {
// コマンド処理
if (input.startsWith('/')) {
const [command, ...args] = input.slice(1).split(' ');
await handleCommand(command, args);
return;
}
// 通常のメッセージ処理
messages.push({ role: 'user', content: input });
saveLog('user', input);
try {
const response = await currentModel.call(messages);
console.log(`AI Assistant: ${response.content}`);
messages.push({ role: 'assistant', content: response.content });
saveLog('assistant', response.content);
// 履歴サイズを制限
while (messages.length > historySize) {
messages.shift();
}
} catch (error) {
console.error('エラーが発生しました:', error);
messages.pop(); // エラーの場合、ユーザーの入力を履歴から削除
saveLog('error', error.message);
}
} catch (error) {
console.error('メッセージ処理中にエラーが発生しました:', error);
}
}
// コマンドハンドラー
async function handleCommand(command, args) {
if (!(command in COMMANDS)) {
console.log(`未知のコマンドです。利用可能なコマンド:\n${Object.values(COMMANDS).map(cmd => cmd.usage).join(", ")}`);
console.log("\n詳しい使い方は /help で確認できます。");
return;
}
switch (command) {
case 'models':
console.log("\n利用可能なモデル一覧:");
for (const [provider, providerModels] of Object.entries(models)) {
console.log(`\n${provider}:`);
for (const modelName of Object.keys(providerModels)) {
console.log(` - ${modelName}`);
}
}
console.log("\nモデルを変更するには: /model <provider> <model_name>");
console.log("例: /model openai gpt-4");
console.log("モデル一覧を表示するには: /models");
console.log("現在のモデルを確認するには: /current");
console.log("終了するには: /quit\n");
break;
case 'current':
console.log(`現在のモデル: ${currentModelName}`);
saveLog('system', `現在のモデルを確認: ${currentModelName}`);
break;
case 'model':
if (args.length !== 2) {
console.log("使用方法: /model <provider> <model_name>");
break;
}
const [provider, modelName] = args;
if (models[provider]?.[modelName]) {
currentModel = models[provider][modelName];
currentModelName = `${provider}/${modelName}`;
console.log(`モデルを ${provider}の${modelName} に変更しました`);
saveLog('system', `モデルを ${provider}の${modelName} に変更しました`);
updatePrompt(); // プロンプトを更新
} else {
console.log("指定されたモデルは利用できません");
console.log("\n利用可能なモデル一覧:");
for (const [provider, providerModels] of Object.entries(models)) {
console.log(`\n${provider}:`);
for (const modelName of Object.keys(providerModels)) {
console.log(` - ${modelName}`);
}
}
console.log("\nモデルを変更するには: /model <provider> <model_name>");
console.log("例: /model openai gpt-4");
console.log("モデル一覧を表示するには: /models");
console.log("現在のモデルを確認するには: /current");
console.log("終了するには: /quit\n");
}
break;
case "history_size":
if (args.length === 0) {
console.log("使用法: /history_size <数値>\n例: /history_size 10");
break;
}
const size = parseInt(args[0]);
if (isNaN(size) || size < 1) {
console.log("エラー: 1以上の数値を指定してください。");
break;
}
historySize = size;
// 履歴サイズを超える古いメッセージを削除
while (messages.length > historySize) {
messages.shift();
}
console.log(`対話履歴の保存数を${size}に設定しました。`);
break;
case "history_info":
console.log(`現在の設定:\n- 対話履歴の保存数: ${historySize}\n- 現在の履歴数: ${messages.length}`);
break;
case 'quit':
saveLog('system', 'チャットを終了しました');
process.exit(0);
break;
case 'help':
showHelp();
break;
default:
showHelp();
}
}
// Prompt user for input
rl.prompt();
// 入力イベント処理
rl.on('line', async (input) => {
await processMessage(input);
updatePrompt(); // 各入力後にプロンプトを更新
rl.prompt();
});
// 終了イベント処理
rl.on('close', () => {
console.log('プログラムを終了します');
process.exit(0);
});
4.動作例
動作例は、下記の通り。
PS C:\Users\yamaz\Dropbox\work\git\multi-model-chat> node --no-deprecation .\MyChatbot.js [openai/gpt-4] 入力してください > /models
利用可能なモデル一覧:
openai:
- gpt-4o
- gpt-4o-mini
- gpt-4-turbo
- gpt-4
- gpt-3.5-turbo
google:
- gemini-2.0-flash
- gemini-1.5-flash
- gemini-1.5-pro
anthropic:
- claude-3.5-sonnet
- claude-3.5-haiku
- claude-3-opus
- claude-3-sonnet
- claude-3-haiku
deepseek:
- v3
モデルを変更するには: /model
例: /model openai gpt-4
モデル一覧を表示するには: /models
現在のモデルを確認するには: /current
終了するには: /quit
[openai/gpt-4] 入力してください > /model deepseek v3
モデルを deepseekのv3 に変更しました
[deepseek/v3] 入力してください > 中国最古の王朝について、詳しく説明してください。
AI Assistant: 中国最古の王朝とされるのは**夏王朝(かおうちょう)**です。夏王朝は伝説的な王朝であり、その存在については歴史的な証拠が限ら れていますが、中国の伝承や文献において重要な位置を占めています。以下に、夏王朝について詳しく説明します。
1. 夏王朝の概要
- 成立時期:紀元前2070年頃~紀元前1600年頃(伝承による)
- 建国者:禹(う)
- 首都:陽城(ようじょう、現在の河南省登封市付近とされる)
- 特徴:中国史上初の王朝とされ、後の王朝の基礎を築いたとされる。
2. 夏王朝の建国者・禹
夏王朝の建国者である禹は、中国古代の伝説的な英雄です。彼は「大禹治水(だいうちすい)」という故事で知られており、黄河の治水事業に成功 したことで人々の信頼を得ました。禹は、それまでの禅譲(せんじょう、君主が有能な人物に位を譲る制度)を廃し、自分の子・啓(けい)に王位を継 がせ、世襲制を確立しました。これが夏王朝の始まりとされています。
3. 夏王朝の歴史的意義
- 王朝の始まり:夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築きました。
- 文化と技術:夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。
- 伝承と神話:夏王朝は、中国の神話や伝承に深く関わっており、特に「禹の治水」や「啓の即位」などの物語が有名です。
4. 夏王朝の存在に関する議論
夏王朝の存在は長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されています。特に、**二里 頭文化(にりとうぶんか)**の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、確定的な証拠はまだ見つかっていません。
5. 夏王朝の滅亡
夏王朝は、最後の王である**桀(けつ)の時代に滅びたとされています。桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)**に よって滅ぼされました。これにより、殷王朝が成立しました。
6. 夏王朝の文化的影響
- 歴史観の形成:夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。
- 治水の象徴:禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。
まとめ
夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、 その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。
[deepseek/v3] 入力してください > /model google gemini-2.0-flash
モデルを googleのgemini-2.0-flash に変更しました
[google/gemini-2.0-flash] 入力してください > 中国最古の王朝について、詳しく説明してください。
AI Assistant: 中国最古の王朝とされるのは、**夏王朝(かおうちょう)**です。しかし、夏王朝は伝説的な要素が強く、その実在性については議論が 分かれています。それでも、中国の歴史において非常に重要な位置を占めているため、以下に詳しく解説します。
1. 夏王朝とは?
- 成立時期: 紀元前21世紀頃~紀元前16世紀頃(諸説あり、正確な年代は不明)
- 建国者: 禹(う)
- 首都: 陽城(ようじょう、現在の河南省登封市付近とされる)
- 特徴: 中国史上初の王朝とされ、世襲制を確立したとされる。
2. 夏王朝の建国者:禹(う)
- 禹は、中国古代の伝説的な英雄で、「大禹治水(だいうちすい)」の故事で知られています。
- 黄河の氾濫を治めることに成功し、人々の信頼を得て、舜(しゅん)から帝位を譲り受けたとされています。
- 禹は、それまでの禅譲(君主が有能な人物に位を譲る制度)を廃止し、自分の子である啓(けい)に王位を継がせ、世襲制を確立しました。これが 夏王朝の始まりとされています。
3. 夏王朝の歴史的意義
- 王朝の始まり: 夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築いたと考えられています。
- 文化と技術: 夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。
- 伝承と神話: 夏王朝は、中国の神話や伝承に深く関わっており、「禹の治水」や「啓の即位」などの物語は有名です。
4. 夏王朝の存在をめぐる議論
- 夏王朝の存在は、長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されるようになりまし た。
- 特に、**二里頭文化(にりとうぶんか)**の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、文字資料などの直接的な証拠は 発見されていません。
- 二里頭文化は、都市計画や青銅器の製造技術など、高度な文明の存在を示唆していますが、これが本当に夏王朝のものなのか、あるいは別の文化な のか、結論は出ていません。
5. 夏王朝の滅亡
- 夏王朝は、最後の王である**桀(けつ)**の時代に滅びたとされています。
- 桀は暴君として描かれており、殷(商)王朝の始祖である**湯(とう)**によって滅ぼされました。これにより、殷王朝が成立しました。
6. 夏王朝の文化的影響
- 歴史観の形成: 夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。
- 治水の象徴: 禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。
- 正統性の根拠: 後世の王朝は、夏王朝を自らの正統性の根拠として利用しました。
7. まとめ
夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、 その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。
補足:
- 夏王朝の実在を否定する説もあります。この説では、夏王朝は殷王朝の神話的な起源を語るための創作であると考えられています。
- 夏王朝の研究は、考古学的な発見や文献資料の解釈など、様々な分野からのアプローチが必要とされています。
夏王朝は、中国の歴史の始まりを理解する上で、非常に重要なテーマです。今後の研究によって、その実像が明らかになることが期待されます。
[google/gemini-2.0-flash] 入力してください > /quit
記録している情報は二種類あります。
チャットログ
{"timestamp":"2025-02-10T09:37:08.642Z","role":"system","modelName":"","content":"モデルを deepseekのv3 に変更しました"}
{"timestamp":"2025-02-10T09:37:19.611Z","role":"user","modelName":"","content":"中国最古の王朝について、詳しく説明してください。"}
{"timestamp":"2025-02-10T09:38:34.726Z","role":"assistant","modelName":"","content":"中国最古の王朝とされるのは夏王朝(かおうちょう)です。夏王朝は伝説的な王朝であり、その存在については歴史的な証拠が限られていますが、中国の伝承や文献において重要な位置を占めています。以下に、夏王朝について詳しく説明します。\n\n---\n\n### 1. 夏王朝の概要\n- 成立時期:紀元前2070年頃~紀元前1600年頃(伝承による)\n- 建国者:禹(う)\n- 首都:陽城(ようじょう、現在の河南省登封市付近とされる)\n- 特徴:中国史上初の王朝とされ、後の王朝の基礎を築いたとされる。\n\n---\n\n### 2. 夏王朝の建国者・禹\n夏王朝の建国者である禹は、中国古代の伝説的な英雄です。彼は「大禹治水(だいうちすい)」という故事で知られており、黄河の治水事業に成功したことで人々の信頼を得ました。禹は、それまでの禅譲(せんじょう、君主が有能な人物に位を譲る制度)を廃し、自分の子・啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n---\n\n### 3. 夏王朝の歴史的意義\n- 王朝の始まり:夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築きました。\n- 文化と技術:夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n- 伝承と神話:夏王朝は、中国の神話や伝承に深く関わっており、特に「禹の治水」や「啓の即位」などの物語が有名です。\n\n---\n\n### 4. 夏王朝の存在に関する議論\n夏王朝の存在は長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されています。特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、確定的な証拠はまだ見つかっていません。\n\n---\n\n### 5. 夏王朝の滅亡\n夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n---\n\n### 6. 夏王朝の文化的影響\n- 歴史観の形成:夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n- 治水の象徴:禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n\n---\n\n### まとめ\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。"}
{"timestamp":"2025-02-10T09:39:10.139Z","role":"system","modelName":"","content":"モデルを googleのgemini-2.0-flash に変更しました"}
{"timestamp":"2025-02-10T09:39:12.474Z","role":"user","modelName":"","content":"中国最古の王朝について、詳しく説明してください。"}
{"timestamp":"2025-02-10T09:39:19.627Z","role":"assistant","modelName":"","content":"中国最古の王朝とされるのは、夏王朝(かおうちょう)です。しかし、夏王朝は伝説的な要素が強く、その実在性については議論が分かれています。それでも、中国の歴史において非常に重要な位置を占めているため、以下に詳しく解説します。\n\n1. 夏王朝とは?\n\n 成立時期: 紀元前21世紀頃~紀元前16世紀頃(諸説あり、正確な年代は不明)\n 建国者: 禹(う)\n 首都: 陽城(ようじょう、現在の河南省登封市付近とされる)\n 特徴: 中国史上初の王朝とされ、世襲制を確立したとされる。\n\n2. 夏王朝の建国者:禹(う)\n\n* 禹は、中国古代の伝説的な英雄で、「大禹治水(だいうちすい)」の故事で知られています。\n* 黄河の氾濫を治めることに成功し、人々の信頼を得て、舜(しゅん)から帝位を譲り受けたとされています。\n* 禹は、それまでの禅譲(君主が有能な人物に位を譲る制度)を廃止し、自分の子である啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n3. 夏王朝の歴史的意義\n\n* 王朝の始まり: 夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築いたと考えられています。\n* 文化と技術: 夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n* 伝承と神話: 夏王朝は、中国の神話や伝承に深く関わっており、「禹の治水」や「啓の即位」などの物語は有名です。\n\n4. 夏王朝の存在をめぐる議論\n\n* 夏王朝の存在は、長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されるようになりました。\n* 特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、文字資料などの直接的な証拠は発見されていません。\n 二里頭文化は、都市計画や青銅器の製造技術など、高度な文明の存在を示唆していますが、これが本当に夏王朝のものなのか、あるいは別の文化なのか、結論は出ていません。\n\n5. 夏王朝の滅亡*\n\n* 夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。\n 桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n6. 夏王朝の文化的影響*\n\n* 歴史観の形成: 夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n* 治水の象徴: 禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n* 正統性の根拠: 後世の王朝は、夏王朝を自らの正統性の根拠として利用しました。\n\n7. まとめ\n\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。\n\n補足:\n\n* 夏王朝の実在を否定する説もあります。この説では、夏王朝は殷王朝の神話的な起源を語るための創作であると考えられています。\n* 夏王朝の研究は、考古学的な発見や文献資料の解釈など、様々な分野からのアプローチが必要とされています。\n\n夏王朝は、中国の歴史の始まりを理解する上で、非常に重要なテーマです。今後の研究によって、その実像が明らかになることが期待されます。\n"}
{"timestamp":"2025-02-10T09:39:24.883Z","role":"system","modelName":"","content":"チャットを終了しました"}
RASログ(HTTPレベル通信ログ)
[
{
"timestamp": "2025-02-10T09:38:34.724Z",
"model": {
"provider": "deepseek",
"model": "v3"
},
"request": {
"timestamp": "2025-02-10T09:37:19.616Z",
"prompts": [
"Human: 中国最古の王朝について、詳しく説明してください。"
]
},
"response": {
"timestamp": "2025-02-10T09:38:34.724Z",
"duration": 75108,
"output": {
"generations": [
[
{
"text": "中国最古の王朝とされるのは夏王朝(かおうちょう)です。夏王朝は伝説的な王朝であり、その存在については歴史的な証拠が限られていますが、中国の伝承や文献において重要な位置を占めています。以下に、夏王朝について詳しく説明します。\n\n---\n\n### 1. 夏王朝の概要\n- 成立時期:紀元前2070年頃~紀元前1600年頃(伝承による)\n- 建国者:禹(う)\n- 首都:陽城(ようじょう、現在の河南省登封市付近とされる)\n- 特徴:中国史上初の王朝とされ、後の王朝の基礎を築いたとされる。\n\n---\n\n### 2. 夏王朝の建国者・禹\n夏王朝の建国者である禹は、中国古代の伝説的な英雄です。彼は「大禹治水(だいうちすい)」という故事で知られており、黄河の治水事業に成功したことで人々の信頼を得ました。禹は、それまでの禅譲(せんじょう、君主が有能な人物に位を譲る制度)を廃し、自分の子・啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n---\n\n### 3. 夏王朝の歴史的意義\n- 王朝の始まり:夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築きました。\n- 文化と技術:夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n- 伝承と神話:夏王朝は、中国の神話や伝承に深く関わっており、特に「禹の治水」や「啓の即位」などの物語が有名です。\n\n---\n\n### 4. 夏王朝の存在に関する議論\n夏王朝の存在は長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されています。特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、確定的な証拠はまだ見つかっていません。\n\n---\n\n### 5. 夏王朝の滅亡\n夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n---\n\n### 6. 夏王朝の文化的影響\n- 歴史観の形成:夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n- 治水の象徴:禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n\n---\n\n### まとめ\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。",
"message": {
"lc": 1,
"type": "constructor",
"id": [
"langchain_core",
"messages",
"AIMessage"
],
"kwargs": {
"content": "中国最古の王朝とされるのは夏王朝(かおうちょう)です。夏王朝は伝説的な王朝であり、その存在については歴史的な証拠が限られていますが、中国の伝承や文献において重要な位置を占めています。以下に、夏王朝について詳しく説明します。\n\n---\n\n### 1. 夏王朝の概要\n- 成立時期:紀元前2070年頃~紀元前1600年頃(伝承による)\n- 建国者:禹(う)\n- 首都:陽城(ようじょう、現在の河南省登封市付近とされる)\n- 特徴:中国史上初の王朝とされ、後の王朝の基礎を築いたとされる。\n\n---\n\n### 2. 夏王朝の建国者・禹\n夏王朝の建国者である禹は、中国古代の伝説的な英雄です。彼は「大禹治水(だいうちすい)」という故事で知られており、黄河の治水事業に成功したことで人々の信頼を得ました。禹は、それまでの禅譲(せんじょう、君主が有能な人物に位を譲る制度)を廃し、自分の子・啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n---\n\n### 3. 夏王朝の歴史的意義\n- 王朝の始まり:夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築きました。\n- 文化と技術:夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n- 伝承と神話:夏王朝は、中国の神話や伝承に深く関わっており、特に「禹の治水」や「啓の即位」などの物語が有名です。\n\n---\n\n### 4. 夏王朝の存在に関する議論\n夏王朝の存在は長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されています。特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、確定的な証拠はまだ見つかっていません。\n\n---\n\n### 5. 夏王朝の滅亡\n夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n---\n\n### 6. 夏王朝の文化的影響\n- 歴史観の形成:夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n- 治水の象徴:禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n\n---\n\n### まとめ\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。",
"additional_kwargs": {},
"response_metadata": {
"tokenUsage": {
"promptTokens": 15,
"completionTokens": 798,
"totalTokens": 813
},
"finish_reason": "stop",
"model_name": "deepseek-chat",
"usage": {
"prompt_tokens": 15,
"completion_tokens": 798,
"total_tokens": 813,
"prompt_tokens_details": {
"cached_tokens": 0
},
"prompt_cache_hit_tokens": 0,
"prompt_cache_miss_tokens": 15
},
"system_fingerprint": "fp_3a5770e1b4"
},
"id": "d900eb22-c35c-430b-ada8-76241d13118d",
"tool_calls": [],
"invalid_tool_calls": [],
"usage_metadata": {
"output_tokens": 798,
"input_tokens": 15,
"total_tokens": 813,
"input_token_details": {
"cache_read": 0
},
"output_token_details": {}
}
}
},
"generationInfo": {
"finish_reason": "stop"
}
}
]
],
"llmOutput": {
"tokenUsage": {
"promptTokens": 15,
"completionTokens": 798,
"totalTokens": 813
}
}
}
}
},
{
"timestamp": "2025-02-10T09:39:19.625Z",
"model": {
"provider": "google",
"model": "gemini-2.0-flash"
},
"request": {
"timestamp": "2025-02-10T09:39:12.475Z",
"prompts": [
"Human: 中国最古の王朝について、詳しく説明してください。\nAI: 中国最古の王朝とされるのは夏王朝(かおうちょう)です。夏王朝は伝説的な王朝であり、その存在については歴史的な証拠が限られていますが、中国の伝承や文献において重要な位置を占めています。以下に、夏王朝について詳しく説明します。\n\n---\n\n### 1. 夏王朝の概要\n- 成立時期:紀元前2070年頃~紀元前1600年頃(伝承による)\n- 建国者:禹(う)\n- 首都:陽城(ようじょう、現在の河南省登封市付近とされる)\n- 特徴:中国史上初の王朝とされ、後の王朝の基礎を築いたとされる。\n\n---\n\n### 2. 夏王朝の建国者・禹\n夏王朝の建国者である禹は、中国古代の伝説的な英雄です。彼は「大禹治水(だいうちすい)」という故事で知られており、黄河の治水事業に成功したことで人々の信頼を得ました。禹は、それまでの禅譲(せんじょう、君主が有能な人物に位を譲る制度)を廃し、自分の子・啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n---\n\n### 3. 夏王朝の歴史的意義\n- 王朝の始まり:夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築きました。\n- 文化と技術:夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n- 伝承と神話:夏王朝は、中国の神話や伝承に深く関わっており、特に「禹の治水」や「啓の即位」などの物語が有名です。\n\n---\n\n### 4. 夏王朝の存在に関する議論\n夏王朝の存在は長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されています。特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、確定的な証拠はまだ見つかっていません。\n\n---\n\n### 5. 夏王朝の滅亡\n夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n---\n\n### 6. 夏王朝の文化的影響\n- 歴史観の形成:夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n- 治水の象徴:禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n\n---\n\n### まとめ\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。\nHuman: 中国最古の王朝について、詳しく説明してください。"
]
},
"response": {
"timestamp": "2025-02-10T09:39:19.624Z",
"duration": 7149,
"output": {
"generations": [
[
{
"text": "中国最古の王朝とされるのは、夏王朝(かおうちょう)です。しかし、夏王朝は伝説的な要素が強く、その実在性については議論が分かれています。それでも、中国の歴史において非常に重要な位置を占めているため、以下に詳しく解説します。\n\n1. 夏王朝とは?\n\n 成立時期: 紀元前21世紀頃~紀元前16世紀頃(諸説あり、正確な年代は不明)\n 建国者: 禹(う)\n 首都: 陽城(ようじょう、現在の河南省登封市付近とされる)\n 特徴: 中国史上初の王朝とされ、世襲制を確立したとされる。\n\n2. 夏王朝の建国者:禹(う)\n\n* 禹は、中国古代の伝説的な英雄で、「大禹治水(だいうちすい)」の故事で知られています。\n* 黄河の氾濫を治めることに成功し、人々の信頼を得て、舜(しゅん)から帝位を譲り受けたとされています。\n* 禹は、それまでの禅譲(君主が有能な人物に位を譲る制度)を廃止し、自分の子である啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n3. 夏王朝の歴史的意義\n\n* 王朝の始まり: 夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築いたと考えられています。\n* 文化と技術: 夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n* 伝承と神話: 夏王朝は、中国の神話や伝承に深く関わっており、「禹の治水」や「啓の即位」などの物語は有名です。\n\n4. 夏王朝の存在をめぐる議論\n\n* 夏王朝の存在は、長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されるようになりました。\n* 特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、文字資料などの直接的な証拠は発見されていません。\n 二里頭文化は、都市計画や青銅器の製造技術など、高度な文明の存在を示唆していますが、これが本当に夏王朝のものなのか、あるいは別の文化なのか、結論は出ていません。\n\n5. 夏王朝の滅亡*\n\n* 夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。\n 桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n6. 夏王朝の文化的影響*\n\n* 歴史観の形成: 夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n* 治水の象徴: 禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n* 正統性の根拠: 後世の王朝は、夏王朝を自らの正統性の根拠として利用しました。\n\n7. まとめ\n\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。\n\n補足:\n\n* 夏王朝の実在を否定する説もあります。この説では、夏王朝は殷王朝の神話的な起源を語るための創作であると考えられています。\n* 夏王朝の研究は、考古学的な発見や文献資料の解釈など、様々な分野からのアプローチが必要とされています。\n\n夏王朝は、中国の歴史の始まりを理解する上で、非常に重要なテーマです。今後の研究によって、その実像が明らかになることが期待されます。\n",
"message": {
"lc": 1,
"type": "constructor",
"id": [
"langchain_core",
"messages",
"AIMessage"
],
"kwargs": {
"content": "中国最古の王朝とされるのは、夏王朝(かおうちょう)です。しかし、夏王朝は伝説的な要素が強く、その実在性については議論が分かれています。それでも、中国の歴史において非常に重要な位置を占めているため、以下に詳しく解説します。\n\n1. 夏王朝とは?\n\n* 成立時期: 紀元前21世紀頃~紀元前16世紀頃(諸説あり、正確な年代は不明)\n* 建国者: 禹(う)\n* 首都: 陽城(ようじょう、現在の河南省登封市付近とされる)\n* 特徴: 中国史上初の王朝とされ、世襲制を確立したとされる。\n\n2. 夏王朝の建国者:禹(う)\n\n* 禹は、中国古代の伝説的な英雄で、「大禹治水(だいうちすい)」の故事で知られています。\n* 黄河の氾濫を治めることに成功し、人々の信頼を得て、舜(しゅん)から帝位を譲り受けたとされています。\n* 禹は、それまでの禅譲(君主が有能な人物に位を譲る制度)を廃止し、自分の子である啓(けい)に王位を継がせ、世襲制を確立しました。これが夏王朝の始まりとされています。\n\n3. 夏王朝の歴史的意義\n\n* 王朝の始まり: 夏王朝は、中国史上初めての世襲制王朝とされ、後の殷(商)王朝や周王朝の基礎を築いたと考えられています。\n* 文化と技術: 夏王朝の時代には、青銅器の使用や農業技術の発展が進んだとされています。\n* 伝承と神話: 夏王朝は、中国の神話や伝承に深く関わっており、「禹の治水」や「啓の即位」などの物語は有名です。\n\n4. 夏王朝の存在をめぐる議論\n\n* 夏王朝の存在は、長い間、伝説や神話の一部と見なされていましたが、20世紀以降の考古学的発見により、その実在性が議論されるようになりました。\n* 特に、二里頭文化(にりとうぶんか)の遺跡(河南省偃師市付近)が夏王朝のものとされることがありますが、文字資料などの直接的な証拠は発見されていません。\n 二里頭文化は、都市計画や青銅器の製造技術など、高度な文明の存在を示唆していますが、これが本当に夏王朝のものなのか、あるいは別の文化なのか、結論は出ていません。\n\n5. 夏王朝の滅亡*\n\n* 夏王朝は、最後の王である桀(けつ)の時代に滅びたとされています。\n 桀は暴君として描かれており、殷(商)王朝の始祖である湯(とう)によって滅ぼされました。これにより、殷王朝が成立しました。\n\n6. 夏王朝の文化的影響*\n\n* 歴史観の形成: 夏王朝は、中国の歴史書『史記』(司馬遷著)に記載されており、中国の歴史観において重要な位置を占めています。\n* 治水の象徴: 禹の治水事業は、後の中国の統治者にとって模範とされ、治水が国家の重要な役割であるという考え方を生み出しました。\n* 正統性の根拠: 後世の王朝は、夏王朝を自らの正統性の根拠として利用しました。\n\n7. まとめ\n\n夏王朝は、中国最古の王朝として伝承されており、その存在は中国の歴史と文化に深く根ざしています。しかし、考古学的な証拠が限られているため、その実在性についてはまだ議論が続いています。それでも、夏王朝は中国の歴史的・文化的アイデンティティにおいて重要な役割を果たしています。\n\n補足:\n\n* 夏王朝の実在を否定する説もあります。この説では、夏王朝は殷王朝の神話的な起源を語るための創作であると考えられています。\n* 夏王朝の研究は、考古学的な発見や文献資料の解釈など、様々な分野からのアプローチが必要とされています。\n\n夏王朝は、中国の歴史の始まりを理解する上で、非常に重要なテーマです。今後の研究によって、その実像が明らかになることが期待されます。\n",
"tool_calls": [],
"additional_kwargs": {
"finishReason": "STOP",
"avgLogprobs": -0.12966309563588288
},
"usage_metadata": {
"input_tokens": 780,
"output_tokens": 944,
"total_tokens": 1724
},
"invalid_tool_calls": [],
"response_metadata": {
"finishReason": "STOP",
"avgLogprobs": -0.12966309563588288
},
"id": "run-8fa6c93d-1827-4fe0-bdb5-3a23637ec26b"
}
},
"generationInfo": {
"finishReason": "STOP",
"avgLogprobs": -0.12966309563588288
}
}
]
]
}
}
}
]
5.リポジトリ
リポジトリの格納先は下記です。
2025.02.10 山崎作成