Commit 1e8a8704 authored by Wade's avatar Wade

qa test

parent 462d9f21
{"level":"info","pid":11977,"time":1749193440,"caller":"/Users/wade/project/wuban/agentchat/log.go:68","message":"This message appears when log level set to Debug or Info"}
{"level":"info","pid":11977,"method":"DeepSeek.Init","time":1749193440,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:91","message":"Initializing DeepSeek plugin"}
{"level":"info","pid":11977,"method":"DeepSeek.Init","time":1749193440,"caller":"/Users/wade/project/wuban/agentchat/plugins/deepseek/deepseek.go:104","message":"Initialization successful"}
{"level":"info","pid":11977,"method":"Milvus.Init","time":1749193440,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:75","message":"Initializing Milvus plugin"}
{"level":"info","pid":11977,"method":"Milvus.Init","time":1749193441,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:87","message":"Initialization successful"}
{"level":"info","pid":11977,"method":"GraphKnowledge.Init","time":1749193441,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:299","message":"Initializing GraphKnowledge plugin"}
{"level":"info","pid":11977,"method":"NewClient","ip":"54.92.111.204","port":5670,"time":1749193441,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:93","message":"Creating new GraphRAG client"}
{"level":"info","pid":11977,"method":"GraphKnowledge.Init","time":1749193441,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:311","message":"Initialization successful"}
{"level":"info","pid":11977,"method":"DefineIndexerAndRetriever","collection":"chatRag1","dimension":768,"time":1749193441,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:152","message":"Defining indexer and retriever"}
{"level":"info","pid":11977,"method":"Milvus.newDocStore","collection":"chatRag1","dimension":768,"time":1749193441,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:201","message":"Creating new doc store"}
{"level":"info","pid":11977,"method":"Milvus.newDocStore","collection":"chatRag1","time":1749193442,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:302","message":"Doc store created successfully"}
{"level":"info","pid":11977,"method":"DefineIndexerAndRetriever","collection":"chatRag1","time":1749193442,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:182","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":11977,"method":"DefineIndexerAndRetriever","time":1749193442,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:357","message":"Defining indexer and retriever"}
{"level":"info","pid":11977,"method":"GraphKnowledge.newDocStore","space_id":"","model_name":"Qwen/Qwen2.5-Coder-32B-Instruct","time":1749193442,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:393","message":"Creating new doc store"}
{"level":"info","pid":11977,"method":"GraphKnowledge.newDocStore","time":1749193442,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:399","message":"Doc store created successfully"}
{"level":"info","pid":11977,"method":"DefineIndexerAndRetriever","time":1749193442,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:376","message":"Indexer and retriever defined successfully"}
{"level":"info","pid":11977,"method":"NewKnowledgeClient","endpoint":"lkeap.tencentcloudapi.com","region":"ap-guangzhou","secret_id":"","token":"","time":1749193443,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:43","message":"Creating new KnowledgeClient"}
{"level":"info","pid":11977,"method":"KnowledgeClient.Init","time":1749193443,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:51","message":"Initializing KnowledgeClient"}
{"level":"info","pid":11977,"method":"KnowledgeClient.Init","time":1749193443,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:109","message":"Initialization successful"}
{"level":"info","pid":11977,"time":1749193443,"caller":"/Users/wade/project/wuban/agentchat/main.go:264","message":"KnowledgeClient initialized successfully"}
{"level":"info","pid":11977,"time":1749193460,"caller":"/Users/wade/project/wuban/agentchat/main.go:278","message":"input--------{\"content\":\"What is the capital of UK?\",\"model\":\"gpt-3.5-turbo\",\"apiKey\":\"sk-1234567890abcdef\",\"from\":\"Alice\",\"from_id\":\"user123\",\"to\":\"Bob\",\"to_id\":\"user456\"}"}
{"level":"info","pid":11977,"time":1749193460,"caller":"/Users/wade/project/wuban/agentchat/main.go:304","message":"qaAsJson--------{\"ID\":46,\"CreatedAt\":\"2025-06-06T03:44:11.829103Z\",\"FromID\":\"user123\",\"From\":\"Alice\",\"Question\":\"你是谁?\",\"Answer\":\"我是一个基于Milvus的助手,但我能提供的信息有限。目前我只知道巴黎是法国的首都,美国是最大的咖啡进口国。知识库的信息不足以回答“你是谁”这个问题。\\n\",\"Summary\":\"Conversation summary: Conversation summary: Conversation summary: The provided context does not contain the answer to your question. The context mentions Paris is the capital of France and the USA is the largest importer of coffee. The graph context also indicates a lack of information. Therefore, I cannot answer your question about the capital of the UK.\",\"To\":\"Bob\",\"ToID\":\"user456\"}"}
{"level":"info","pid":11977,"method":"docStore.Retrieve","collection":"chatRag1","time":1749193460,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:450","message":"Starting retrieve operation"}
{"level":"info","pid":11977,"method":"docStore.Retrieve","collection":"chatRag1","documents":2,"time":1749193463,"caller":"/Users/wade/project/wuban/agentchat/plugins/milvus/milvus.go:640","message":"Retrieve operation completed successfully"}
{"level":"info","pid":11977,"time":1749193463,"caller":"/Users/wade/project/wuban/agentchat/main.go:330","message":"promptInput.Context: Paris is the capital of France?\nUSA is the largest importer of coffee?\n"}
{"level":"info","pid":11977,"method":"docStore.Retrieve","space_id":"","time":1749193463,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:755","message":"Starting retrieve operation"}
{"level":"info","pid":11977,"method":"docStore.Retrieve","space_id":"","documents":1,"time":1749193469,"caller":"/Users/wade/project/wuban/agentchat/plugins/graphrag/graph.go:892","message":"Retrieve operation completed successfully"}
{"level":"info","pid":11977,"time":1749193469,"caller":"/Users/wade/project/wuban/agentchat/main.go:345","message":"promptInput.Graph : 知识库中提供的内容不足以回答此问题\n\n<references title=\"References\" references=\"[]\" />\n"}
{"level":"info","pid":11977,"from":"Alice","from_id":"user123","to":"Bob","to_id":"user456","promptInput.Query":"What is the capital of UK?","resp.Text()":"I'm sorry, but the information I have access to doesn't include the capital of the UK. The provided context and graph knowledge base lack this information.\n","promptInput.Summary":"Conversation summary: Conversation summary: Conversation summary: The provided context does not contain the answer to your question. The context mentions Paris is the capital of France and the USA is the largest importer of coffee. The graph context also indicates a lack of information. Therefore, I cannot answer your question about the capital of the UK.","time":1749193470,"caller":"/Users/wade/project/wuban/agentchat/main.go:372","message":"QueryRewriteWithSummary"}
{"level":"info","pid":11977,"method":"KnowledgeClient.QueryRewriteWithSummary","user_question":"What is the capital of UK?","assistant_answer":"I'm sorry, but the information I have access to doesn't include the capital of the UK. The provided context and graph knowledge base lack this information.\n","history_summary":"Conversation summary: Conversation summary: Conversation summary: The provided context does not contain the answer to your question. The context mentions Paris is the capital of France and the USA is the largest importer of coffee. The graph context also indicates a lack of information. Therefore, I cannot answer your question about the capital of the UK.","time":1749193470,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:256","message":"Starting query rewrite with summary operation"}
{"level":"info","pid":11977,"method":"KnowledgeClient.QueryRewrite","message_count":3,"model":"lke-query-rewrite-base","time":1749193470,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:131","message":"Starting query rewrite operation"}
{"level":"info","pid":11977,"method":"KnowledgeClient.QueryRewrite","rewritten_query":"What is the capital of the UK?","request_id":"e4457db4-48a1-471d-a19f-62eb5f6d3cfb","usage":{"InputTokens":139,"OutputTokens":9,"TotalTokens":148},"raw_response":"{\"Response\":{\"Content\":\"What is the capital of the UK?\",\"Usage\":{\"InputTokens\":139,\"OutputTokens\":9,\"TotalTokens\":148},\"RequestId\":\"e4457db4-48a1-471d-a19f-62eb5f6d3cfb\"}}","time":1749193472,"caller":"/Users/wade/project/wuban/agentchat/plugins/knowledge/knowledge.go:237","message":"Query rewrite operation completed successfully"}
{"level":"info","pid":11977,"from":"Alice","from_id":"user123","to":"Bob","to_id":"user456","question":"What is the capital of UK?","context":"Paris is the capital of France?\nUSA is the largest importer of coffee?\n","graph":"知识库中提供的内容不足以回答此问题\n\n<references title=\"References\" references=\"[]\" />\n","last summary":"Conversation summary: Conversation summary: Conversation summary: The provided context does not contain the answer to your question. The context mentions Paris is the capital of France and the USA is the largest importer of coffee. The graph context also indicates a lack of information. Therefore, I cannot answer your question about the capital of the UK.","answer":"I'm sorry, but the information I have access to doesn't include the capital of the UK. The provided context and graph knowledge base lack this information.\n","time":1749193472,"caller":"/Users/wade/project/wuban/agentchat/main.go:398","message":"Question and answer pair recorded"}
package question
import (
"context"
"database/sql"
"testing"
"time"
_ "github.com/lib/pq"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)
// TestQAStore 测试 QAStore 的读写功能
func TestQAStore(t *testing.T) {
// 初始化测试数据库连接
store, err := qa.InitQAStore()
require.NoError(t, err, "failed to initialize QAStore")
defer store.(*qaStore).db.Close()
ctx := context.Background()
// 清理测试数据(可选,确保测试环境干净)
// cleanup := func() {
// _, err := store.(*qaStore).db.ExecContext(ctx, "TRUNCATE TABLE qa RESTART IDENTITY")
// require.NoError(t, err, "failed to truncate qa table")
// }
// cleanup()
t.Run("WriteQA_Insert", func(t *testing.T) {
// 测试插入新记录
qa := QA{
Question: stringPtr("What is Go?"),
Answer: stringPtr("A programming language"),
Summary: stringPtr("Go introduction"),
From: stringPtr("Alice"),
FromID: stringPtr("user123"),
To: stringPtr("Bob"),
ToID: stringPtr("user456"),
}
id, err := store.WriteQA(ctx, qa)
require.NoError(t, err, "failed to insert QA")
assert.NotZero(t, id, "inserted ID should not be zero")
// 验证数据库中的记录
var stored QA
row := store.(*qaStore).db.QueryRowContext(ctx, `
SELECT id, created_at, question, answer, summary, "from", "to", from_id, to_id
FROM qa
WHERE id = $1`, id)
var question, answer, summary, from, to, fromID, toID sql.NullString
err = row.Scan(&stored.ID, &stored.CreatedAt, &question, &answer, &summary, &from, &to, &fromID, &toID)
require.NoError(t, err, "failed to query inserted QA")
// 设置结构体字段
if question.Valid {
stored.Question = &question.String
}
if answer.Valid {
stored.Answer = &answer.String
}
if summary.Valid {
stored.Summary = &summary.String
}
if from.Valid {
stored.From = &from.String
}
if to.Valid {
stored.To = &to.String
}
if fromID.Valid {
stored.FromID = &fromID.String
}
if toID.Valid {
stored.ToID = &toID.String
}
// 验证插入的数据
assert.Equal(t, qa.Question, stored.Question)
assert.Equal(t, qa.Answer, stored.Answer)
assert.Equal(t, qa.Summary, stored.Summary)
assert.Equal(t, qa.From, stored.From)
assert.Equal(t, qa.To, stored.To)
assert.Equal(t, qa.FromID, stored.FromID)
assert.Equal(t, qa.ToID, stored.ToID)
})
t.Run("WriteQA_Update", func(t *testing.T) {
// 先插入一条记录
qa := QA{
Question: stringPtr("What is Python?"),
Answer: stringPtr("Another language"),
FromID: stringPtr("user789"),
}
id, err := store.WriteQA(ctx, qa)
require.NoError(t, err, "failed to insert QA for update test")
// 更新记录
updatedQA := QA{
ID: id,
Question: stringPtr("Updated: What is Python?"),
Answer: stringPtr("A versatile language"),
Summary: stringPtr("Python summary"),
FromID: stringPtr("user789"),
}
updatedID, err := store.WriteQA(ctx, updatedQA)
require.NoError(t, err, "failed to update QA")
assert.Equal(t, id, updatedID, "updated ID should match inserted ID")
// 验证更新后的记录
var stored QA
row := store.(*qaStore).db.QueryRowContext(ctx, `
SELECT id, created_at, question, answer, summary, "from", "to", from_id, to_id
FROM qa
WHERE id = $1`, id)
var question, answer, summary, from, to, fromID, toID sql.NullString
err = row.Scan(&stored.ID, &stored.CreatedAt, &question, &answer, &summary, &from, &to, &fromID, &toID)
require.NoError(t, err, "failed to query updated QA")
if question.Valid {
stored.Question = &question.String
}
if answer.Valid {
stored.Answer = &answer.String
}
if summary.Valid {
stored.Summary = &summary.String
}
if fromID.Valid {
stored.FromID = &fromID.String
}
assert.Equal(t, updatedQA.Question, stored.Question)
assert.Equal(t, updatedQA.Answer, stored.Answer)
assert.Equal(t, updatedQA.Summary, stored.Summary)
assert.Equal(t, updatedQA.FromID, stored.FromID)
})
t.Run("GetLatestQA", func(t *testing.T) {
// 插入多条记录以测试视图
qa1 := QA{
Question: stringPtr("First question"),
Answer: stringPtr("First answer"),
FromID: stringPtr("user123"),
CreatedAt: time.Now().Add(-2 * time.Hour),
}
_, err := store.WriteQA(ctx, qa1)
require.NoError(t, err, "failed to insert first QA")
qa2 := QA{
Question: stringPtr("Second question"),
Answer: stringPtr("Second answer"),
FromID: stringPtr("user123"),
CreatedAt: time.Now(),
}
_, err = store.WriteQA(ctx, qa2)
require.NoError(t, err, "failed to insert second QA")
// 查询最新记录
fromID := stringPtr("user123")
results, err := store.GetLatestQA(ctx, fromID)
require.NoError(t, err, "failed to get latest QA")
require.Len(t, results, 1, "should return exactly one record for from_id")
// 验证返回的记录是最新的一条
assert.Equal(t, qa2.Question, results[0].Question)
assert.Equal(t, qa2.Answer, results[0].Answer)
assert.Equal(t, qa2.FromID, results[0].FromID)
})
t.Run("GetLatestQA_NullFromID", func(t *testing.T) {
// 插入一条 from_id 为 NULL 的记录
qa := QA{
Question: stringPtr("Null from_id question"),
Answer: stringPtr("Null from_id answer"),
FromID: nil,
}
_, err := store.WriteQA(ctx, qa)
require.NoError(t, err, "failed to insert QA with null from_id")
// 查询 from_id 为 NULL 的记录
results, err := store.GetLatestQA(ctx, nil)
require.NoError(t, err, "failed to get latest QA for null from_id")
assert.NotEmpty(t, results, "should return records for null from_id")
assert.Nil(t, results[0].FromID, "from_id should be nil")
assert.Equal(t, qa.Question, results[0].Question)
})
// 清理测试数据
// cleanup()
}
package qa
// import (
// "context"
// "database/sql"
// "testing"
// "time"
// _ "github.com/lib/pq"
// "github.com/stretchr/testify/assert"
// "github.com/stretchr/testify/require"
// "github.com/wade-liwei/agentchat/plugins/qa"
// )
// // TestQAStore 测试 QAStore 的读写功能
// func TestQAStore(t *testing.T) {
// // 初始化测试数据库连接
// store, err := qa.InitQAStore()
// require.NoError(t, err, "failed to initialize QAStore")
// defer store.(*qaStore).db.Close()
// ctx := context.Background()
// // 清理测试数据(可选,确保测试环境干净)
// // cleanup := func() {
// // _, err := store.(*qaStore).db.ExecContext(ctx, "TRUNCATE TABLE qa RESTART IDENTITY")
// // require.NoError(t, err, "failed to truncate qa table")
// // }
// // cleanup()
// t.Run("WriteQA_Insert", func(t *testing.T) {
// // 测试插入新记录
// qa := QA{
// Question: stringPtr("What is Go?"),
// Answer: stringPtr("A programming language"),
// Summary: stringPtr("Go introduction"),
// From: stringPtr("Alice"),
// FromID: stringPtr("user123"),
// To: stringPtr("Bob"),
// ToID: stringPtr("user456"),
// }
// id, err := store.WriteQA(ctx, qa)
// require.NoError(t, err, "failed to insert QA")
// assert.NotZero(t, id, "inserted ID should not be zero")
// // 验证数据库中的记录
// var stored QA
// row := store.(*qaStore).db.QueryRowContext(ctx, `
// SELECT id, created_at, question, answer, summary, "from", "to", from_id, to_id
// FROM qa
// WHERE id = $1`, id)
// var question, answer, summary, from, to, fromID, toID sql.NullString
// err = row.Scan(&stored.ID, &stored.CreatedAt, &question, &answer, &summary, &from, &to, &fromID, &toID)
// require.NoError(t, err, "failed to query inserted QA")
// // 设置结构体字段
// if question.Valid {
// stored.Question = &question.String
// }
// if answer.Valid {
// stored.Answer = &answer.String
// }
// if summary.Valid {
// stored.Summary = &summary.String
// }
// if from.Valid {
// stored.From = &from.String
// }
// if to.Valid {
// stored.To = &to.String
// }
// if fromID.Valid {
// stored.FromID = &fromID.String
// }
// if toID.Valid {
// stored.ToID = &toID.String
// }
// // 验证插入的数据
// assert.Equal(t, qa.Question, stored.Question)
// assert.Equal(t, qa.Answer, stored.Answer)
// assert.Equal(t, qa.Summary, stored.Summary)
// assert.Equal(t, qa.From, stored.From)
// assert.Equal(t, qa.To, stored.To)
// assert.Equal(t, qa.FromID, stored.FromID)
// assert.Equal(t, qa.ToID, stored.ToID)
// })
// t.Run("WriteQA_Update", func(t *testing.T) {
// // 先插入一条记录
// qa := QA{
// Question: stringPtr("What is Python?"),
// Answer: stringPtr("Another language"),
// FromID: stringPtr("user789"),
// }
// id, err := store.WriteQA(ctx, qa)
// require.NoError(t, err, "failed to insert QA for update test")
// // 更新记录
// updatedQA := QA{
// ID: id,
// Question: stringPtr("Updated: What is Python?"),
// Answer: stringPtr("A versatile language"),
// Summary: stringPtr("Python summary"),
// FromID: stringPtr("user789"),
// }
// updatedID, err := store.WriteQA(ctx, updatedQA)
// require.NoError(t, err, "failed to update QA")
// assert.Equal(t, id, updatedID, "updated ID should match inserted ID")
// // 验证更新后的记录
// var stored QA
// row := store.(*qaStore).db.QueryRowContext(ctx, `
// SELECT id, created_at, question, answer, summary, "from", "to", from_id, to_id
// FROM qa
// WHERE id = $1`, id)
// var question, answer, summary, from, to, fromID, toID sql.NullString
// err = row.Scan(&stored.ID, &stored.CreatedAt, &question, &answer, &summary, &from, &to, &fromID, &toID)
// require.NoError(t, err, "failed to query updated QA")
// if question.Valid {
// stored.Question = &question.String
// }
// if answer.Valid {
// stored.Answer = &answer.String
// }
// if summary.Valid {
// stored.Summary = &summary.String
// }
// if fromID.Valid {
// stored.FromID = &fromID.String
// }
// assert.Equal(t, updatedQA.Question, stored.Question)
// assert.Equal(t, updatedQA.Answer, stored.Answer)
// assert.Equal(t, updatedQA.Summary, stored.Summary)
// assert.Equal(t, updatedQA.FromID, stored.FromID)
// })
// t.Run("GetLatestQA", func(t *testing.T) {
// // 插入多条记录以测试视图
// qa1 := QA{
// Question: stringPtr("First question"),
// Answer: stringPtr("First answer"),
// FromID: stringPtr("user123"),
// CreatedAt: time.Now().Add(-2 * time.Hour),
// }
// _, err := store.WriteQA(ctx, qa1)
// require.NoError(t, err, "failed to insert first QA")
// qa2 := QA{
// Question: stringPtr("Second question"),
// Answer: stringPtr("Second answer"),
// FromID: stringPtr("user123"),
// CreatedAt: time.Now(),
// }
// _, err = store.WriteQA(ctx, qa2)
// require.NoError(t, err, "failed to insert second QA")
// // 查询最新记录
// fromID := stringPtr("user123")
// results, err := store.GetLatestQA(ctx, fromID)
// require.NoError(t, err, "failed to get latest QA")
// require.Len(t, results, 1, "should return exactly one record for from_id")
// // 验证返回的记录是最新的一条
// assert.Equal(t, qa2.Question, results[0].Question)
// assert.Equal(t, qa2.Answer, results[0].Answer)
// assert.Equal(t, qa2.FromID, results[0].FromID)
// })
// t.Run("GetLatestQA_NullFromID", func(t *testing.T) {
// // 插入一条 from_id NULL 的记录
// qa := QA{
// Question: stringPtr("Null from_id question"),
// Answer: stringPtr("Null from_id answer"),
// FromID: nil,
// }
// _, err := store.WriteQA(ctx, qa)
// require.NoError(t, err, "failed to insert QA with null from_id")
// // 查询 from_id NULL 的记录
// results, err := store.GetLatestQA(ctx, nil)
// require.NoError(t, err, "failed to get latest QA for null from_id")
// assert.NotEmpty(t, results, "should return records for null from_id")
// assert.Nil(t, results[0].FromID, "from_id should be nil")
// assert.Equal(t, qa.Question, results[0].Question)
// })
// // 清理测试数据
// // cleanup()
// }
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