chenpei d0dc94e36d feat: 将弹幕功能替换为AI聊天助手
新功能:
- 创建AI聊天助手组件(AIChatWidget)
- 支持文字+图片多模态对话
- 集成Gemini AI API
- 支持图片编辑和内容生成
- 实时对话历史管理
- 优雅的UI设计,支持黑夜模式

技术实现:
- 后端API代理Gemini API(/api/ai-chat)
- 支持最多5张图片上传
- 流式响应处理
- 对话历史管理
- Base64图片处理

配置:
- 在.env中添加Gemini API配置
- GEMINI_API_KEY
- GEMINI_API_BASE_URL
- GEMINI_MODEL

替换原弹幕功能,提供更强大的AI助手体验!
2025-10-27 17:45:37 +08:00

651 lines
24 KiB
Python
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import asyncio
import base64
import os, sys
import random
from volcengine.viking_db import *
sys.path.insert(0, "/data00/home/xiejianqiao.1027/project/volc-sdk-python/volcengine")
# from ...viking_db import VikingDBService, Field, FieldType
# from ../../viking_db import *
if __name__ == '__main__':
vikingdb_service = VikingDBService()
vikingdb_service.set_ak()
vikingdb_service.set_sk()
# id = vikingdb_service.create_task(TaskType.Filter_Delete, {"collection_name": "example", "filter": {"like": [2]}})
# print(id)
# res = vikingdb_service.update_task("ae6f9a4e-9a68-5374-9687-36017c1ddd3e", task_status=TaskStatus.Confirmed)
# id = vikingdb_service.create_task(TaskType.Data_Import, {"tos_path": "demo-1028/demo_1030", "file_type":"json", "ignore_error":False, "collection_name":"sparse"})
# print(id)
# task = vikingdb_service.get_task("bc5e952d-3f95-5e0c-b310-548933890308")
# print(task.task_status)
# tasks = vikingdb_service.list_tasks()
# for item in tasks:
# print(item.process_info)
# res = vikingdb_service.drop_task("01f7f554-46b9-55d6-af6c-b2aa9502d229")
# dense_sparse
# fields = [
# Field(
# field_name="id",
# field_type=FieldType.String,
# is_primary_key=True
# ),
# Field(
# field_name="vector",
# field_type=FieldType.Vector,
# dim=10
# ),
# Field(
# field_name="sparse",
# field_type=FieldType.Sparse_Vector,
# default_val=0
# ),
# ]
# res = vikingdb_service.create_collection("sparse", fields)
# print(res)
# res = vikingdb_service.get_collection("sparse")
# for item in res.fields:
# print(item.field_type, item.field_name)
def gen_random_vector(dim):
res = [0, ] * dim
for i in range(dim):
res[i] = random.random() - 0.5
return res
# collection = vikingdb_service.get_collection("sparse")
# field1 = {"id": "111", "vector": gen_random_vector(10), "sparse": {"hello1": 0.01, "world1": 0.02}}
# field2 = {"id": "222", "vector": gen_random_vector(10), "sparse": {"hello2": 0.02, "world2": 0.03}}
# field3 = {"id": "333", "vector": gen_random_vector(10), "sparse": {"hello3": 0.03, "world3": 0.04}}
# field4 = {"id": "444", "vector": gen_random_vector(10), "sparse": {"hello4": 0.04, "world4": 0.05}}
# data1 = Data(field1)
# data2 = Data(field2)
# data3 = Data(field3)
# data4 = Data(field4)
# datas = [data1, data2, data3, data4]
# collection.upsert_data(datas)
# collection = vikingdb_service.get_collection("example")
# res = collection.fetch_data(555)
# print(res.fields)
# vector_index = VectorIndexParams(distance=DistanceType.COSINE, index_type=IndexType.HNSW_HYBRID,
# quant=QuantType.Float)
# res = vikingdb_service.create_index("sparse", "sparse", vector_index)
# res = vikingdb_service.get_index("sparse", "sparse")
# print(res.vector_index)
# index = vikingdb_service.get_index("sparse_go", "sparse_go_test5")
# res = index.search_by_vector(vector=gen_random_vector(12), sparse_vectors={"he": 0.05}, dense_weight=0.1, retry=True)
# print(res)
# index = vikingdb_service.get_index("sparse_go", "sparse_go_test5")
# res = index.search_by_id("111", dense_weight=0.1)
# print(res)
# index = vikingdb_service.get_index("sparse", "sparse")
# res = index.search_by_id("111", dense_weight=0.1)
# print(res)
# index = vikingdb_service.get_index("sparse", "sparse")
# res = index.search(VectorOrder(vector=gen_random_vector(10), sparse_vectors={"he": 0.05}), dense_weight=0.1)
# print(res)
# list = [RawData("text", "hello1"), RawData("text", "hello2")]
# res = vikingdb_service.embedding_v2(EmbModel("bge-m3"), list)
# print(res)
# datas = [{
# "query": "退改",
# "content": "如果您需要人工服务,可以拨打人工客服电话:4006660921",
# "title": "无"
# }, {
# "query": "退改",
# "content": "1、1日票 1.5日票 2日票的退款政策: -到访日前2天的00:00前,免费退款 - 到访日前2天的00:00至到访日前夜23:59期间,退款需扣除服务费(人民币80元) - 到访日当天(00:00 之后),不可退款 2、半日票的退款政策: - 未使用的们票可在所选入...",
# "title": "门票退改政策|北京环球影城的门票退改政策"
# }, {
# "query": "退改",
# "content": "如果您需要人工服务,可以拨打人工客服电话:4006660921",
# }]
# res = vikingdb_service.batch_rerank(datas)
# print(res)
# 写给用户的样例
# fields = [
# Field(
# field_name="doc_id",
# field_type=FieldType.String,
# is_primary_key=True
# ),
# Field(
# field_name="text_vector",
# field_type=FieldType.Vector,
# dim=12
# ),
# Field(
# field_name="like",
# field_type=FieldType.Int64,
# default_val=0
# ),
# Field(
# field_name="price",
# field_type=FieldType.Float32,
# default_val=0
# ),
# Field(
# field_name="author",
# field_type=FieldType.List_String,
# default_val=[]
# ),
# Field(
# field_name="aim",
# field_type=FieldType.Bool,
# default_val=True
# ),
# ]
# res = vikingdb_service.create_collection("example", fields, "This is an example")
# # 返回一个collection实例
# print(res)
#
# res = vikingdb_service.get_collection("example")
# # 返回一个collection实例
# print(res.update_person)
# #
# vikingdb_service.drop_collection("example") # 无返回
#
# res = vikingdb_service.list_collections()
# 返回一个列表
# for item in res:
# print(item.indexes)
#
# vector_index = VectorIndexParams(distance=DistanceType.COSINE,index_type=IndexType.DiskANN,
# quant=QuantType.Float)
# res = vikingdb_service.create_index("example1","example1", vector_index, cpu_quota=2,
# description="This is an index", scalar_index=['price', 'like'], shard_policy=ShardType.Custom, shard_count=10)
# # 返回一个index实例
# print(res)
#
# res = vikingdb_service.get_index("example", "example")
# 返回一个index实例
# print(res.shard_count, res.shard_policy)
#
# vikingdb_service.drop_index("example", "example") # 无返回
#
# res = vikingdb_service.list_indexes("example")
# 返回一个列表
# for item in res:
# print(item.shard_count)
# print(item.shard_policy)
# print(item.update_time)
# print(item.create_time)
#
# def gen_random_vector(dim):
# res = [0, ] * dim
# for i in range(dim):
# res[i] = random.random() - 0.5
# return res
# collection = vikingdb_service.get_collection("example")
# field1 = {"doc_id": "111", "text_vector": gen_random_vector(12), "like": 1, "price": 1.11,
# "author": ["gy"], "aim": True}
# field2 = {"doc_id": "222", "text_vector": gen_random_vector(12), "like": 2, "price": 2.22,
# "author": ["gy", "xjq"], "aim": False}
# field3 = {"doc_id": "333", "text_vector": gen_random_vector(12), "like": 3, "price": 3.33,
# "author": ["gy", "xjq"], "aim": False}
# field4 = {"doc_id": "444", "text_vector": gen_random_vector(12), "like": 4, "price": 4.44,
# "author": ["gy", "xjq"], "aim": False}
# data1 = Data(field1)
# data2 = Data(field2)
# data3 = Data(field3)
# data4 = Data(field4)
# datas = []
# datas.append(data1)
# datas.append(data2)
# datas.append(data3)
# datas.append(data4)
# collection.upsert_data(datas) # 无返回
#
# collection = vikingdb_service.get_collection("example")
# res = collection.fetch_data("333")
# print(res.fields)
# res = collection.fetch_data(["111", "222", "333", "444"])
# # 返回一个列表
# for item in res:
# print(item)
# print(item.fields)
#
# collection = vikingdb_service.get_collection("example")
# collection.delete_data("11") # 无返回
#
# index = vikingdb_service.get_index("sparse_go", "sparse_go_test5")
# res = index.fetch_data(["111"])
# # 返回一个列表
# for item in res:
# print(item)
# print(item.fields)
#
# index = vikingdb_service.get_index("sparse_go", "sparse_go_test5")
# res = index.search_by_vector(gen_random_vector(10), sparse_vectors={'1':1.1})
# # 返回一个列表
# print(res)
# index = vikingdb_service.get_index("example", "example_index")
# def gen_random_vector(dim):
# res = [0, ] * dim
# for i in range(dim):
# res[i] = random.random() - 0.5
# return res
# res = index.search_by_vector(gen_random_vector(10), limit=2, output_fields=["doc_id", "like", "text_vector"],
# )
# 返回一个列表
# for item in res:
# print(item)
# print(item.score)
#
# index = vikingdb_service.get_index("example", "example_index")
# def gen_random_vector(dim):
# res = [0, ] * dim
# for i in range(dim):
# res[i] = random.random() - 0.5
# return res
# res = index.search(order=VectorOrder(gen_random_vector(10)), limit=2,
# output_fields=["doc_id", "like", "text_vector"],
# filter={"op": "range", "field": "price", "lt": 3.5})
# 返回一个列表
# for item in res:
# print(item)
# print(item.score)
# res = index.search(order=ScalarOrder("price", Order.Desc), limit=6,
# output_fields=["price"],
# filter={"op": "range", "field": "price", "lt": 5})
# # 返回一个列表
# for item in res:
# print(item)
# print(item.score)
# index = vikingdb_service.get_index("example", "example_index")
# res = index.search(limit=5, output_fields=["doc_id", "like"],
# filter={"op": "range", "field": "price", "lt": 3.5})
# 返回一个列表
# for item in res:
# print(item.fields)
# print(item.score)
#
# 含有text字段的测试
# fields = [
# Field(
# field_name="doc_id",
# field_type=FieldType.String,
# is_primary_key=True
# ),
# Field(
# field_name="text",
# field_type=FieldType.Text,
# pipeline_name="text_split_bge_large_zh"
# ),
# Field(
# field_name="like",
# field_type=FieldType.Int64,
# default_val=0
# ),
# Field(
# field_name="price",
# field_type=FieldType.Float32,
# default_val=0
# ),
# Field(
# field_name="author",
# field_type=FieldType.List_String,
# default_val=[]
# ),
# Field(
# field_name="aim",
# field_type=FieldType.Bool,
# default_val=True
# ),
# ]
# res = vikingdb_service.create_collection("example_text", fields, "This is an example include text")
#
# vector_index = VectorIndexParams(distance=DistanceType.IP, index_type=IndexType.FLAT,
# quant=QuantType.Int8)
# res = vikingdb_service.create_index("example", "example1")
#
# collection = vikingdb_service.get_collection("example_text")
# field1 = {"doc_id": "11", "text": {"text":"this is one"}, "like": 1, "price": 1.11,
# "author": ["gy"], "aim": True}
# field2 = {"doc_id": "22", "text": {"text":"this is two"}, "like": 2, "price": 2.22,
# "author": ["gy", "xjq"], "aim": False}
# field3 = {"doc_id": "33", "text": {"text":"this is three"}, "like": 1, "price": 3.33,
# "author": ["gy", "xjq"], "aim": False}
# field4 = {"doc_id": "44", "text": {"text":"this is four"}, "like": 1, "price": 4.44,
# "author": ["gy", "xjq"], "aim": False}
# data1 = Data(field1)
# data2 = Data(field2)
# data3 = Data(field3)
# data4 = Data(field4)
# datas = []
# datas.append(data1)
# datas.append(data2)
# datas.append(data3)
# datas.append(data4)
# collection.upsert_data(datas) # 无返回
#
# index = vikingdb_service.get_index("example_text", "example_index_text")
# res = index.search_by_text(Text(text="this is five"), filter={"op": "range", "field": "price", "lt": 4},
# limit=3, output_fields=["doc_id", "text", "price", "like"], partition=1)
# for item in res:
# print(item)
# print(item.text)
# list = [RawData("text","hello1"), RawData("text","hello2")]
# res = vikingdb_service.embedding(EmbModel("bge_large_zh"), list)
# print(res)
# for item in res:
# print(item)
# fields = [
# Field(
# field_name="like1",
# field_type=FieldType.Float32,
# default_val=0
# ),
# Field(
# field_name="price1",
# field_type=FieldType.String,
# default_val=""
# ),
# ]
# vikingdb_service.update_collection("example",fields,description="change")
# res = vikingdb_service.get_collection("example")
# print(res.description)
# for field in res.fields:
# print(field.field_name)
# print(field.field_type)
# print(field.default_val)
# print(field.dim)
# print(field.pipeline_name)
# print("--------------------")
# res = vikingdb_service.get_index("example", "example_index")
# print(res.description)
# print(res.cpu_quota)
# print(res.scalar_index)
#
# vikingdb_service.update_index("example", "example_index", shard_count=3)
#
# res = vikingdb_service.get_index("example", "example_index")
# print(res.description)
# print(res.cpu_quota)
# print(res.scalar_index)
# score = vikingdb_service.rerank("退改", "如果您需要人工服务,可以拨打人工客服电话:4006660921", "转人工")
# print(score)
# async def create_collection():
# fields = [
# Field(
# field_name="doc_id",
# field_type=FieldType.String,
# is_primary_key=True
# ),
# Field(
# field_name="text_vector",
# field_type=FieldType.Vector,
# dim=10
# ),
# Field(
# field_name="like",
# field_type=FieldType.Int64,
# default_val=0
# ),
# Field(
# field_name="price",
# field_type=FieldType.Float32,
# default_val=0
# ),
# Field(
# field_name="author",
# field_type=FieldType.List_String,
# default_val=[]
# ),
# Field(
# field_name="aim",
# field_type=FieldType.Bool,
# default_val=True
# ),
# ]
# res = await vikingdb_service.async_create_collection("async", fields, "This is an example")
# print(res)
# async def get_collection():
# res = await vikingdb_service.async_get_collection("async")
# for item in res.fields:
# print(item.field_type, item.field_name)
# async def del_collection():
# await vikingdb_service.async_drop_collection("async")
# async def list_collections():
# res = await vikingdb_service.async_list_collections()
# print(res)
# async def create_index():
# vector_index = VectorIndexParams(distance=DistanceType.COSINE, index_type=IndexType.HNSW,
# quant=QuantType.Float)
# res = await vikingdb_service.async_create_index("async", "async", vector_index, cpu_quota=2,
# description="This is an index", scalar_index=['price', 'like'], shard_policy=ShardType.Custom, shard_count=10)
# print(res)
# async def get_index():
# res = await vikingdb_service.async_get_index("async", "async")
# print(res.shard_count, res.shard_policy)
# async def del_index():
# await vikingdb_service.async_drop_index("async", "async")
# async def list_index():
# res = await vikingdb_service.async_list_indexes("async")
# print(res)
# for item in res:
# print(item.index_name)
# async def embedding():
# list = [RawData("text", "hello1"), RawData("text", "hello2")]
# res = await vikingdb_service.async_embedding(EmbModel("bge_large_zh"), list)
# print(res)
# async def update_index():
# await vikingdb_service.async_update_index("async", "async", shard_count=3)
# async def update_collection():
# fields = [
# Field(
# field_name="like1",
# field_type=FieldType.Float32,
# default_val=0
# ),
# Field(
# field_name="price1",
# field_type=FieldType.String,
# default_val=""
# ),
# ]
# await vikingdb_service.async_update_collection("async1", fields)
# async def rerank():
# score = await vikingdb_service.async_rerank("退改", "如果您需要人工服务,可以拨打人工客服电话:4006660921",
# "转人工")
# print(score)
# async def batch_rerank():
# datas = [{
# "query": "退改",
# "content": "如果您需要人工服务,可以拨打人工客服电话:4006660921",
# "title": "无"
# }, {
# "query": "退改",
# "content": "1、1日票 1.5日票 2日票的退款政策: -到访日前2天的00:00前,免费退款 - 到访日前2天的00:00至到访日前夜23:59期间,退款需扣除服务费(人民币80元) - 到访日当天(00:00 之后),不可退款 2、半日票的退款政策: - 未使用的们票可在所选入...",
# "title": "门票退改政策|北京环球影城的门票退改政策"
# }, {
# "query": "退改",
# "content": "如果您需要人工服务,可以拨打人工客服电话:4006660921",
# }]
# res = await vikingdb_service.async_batch_rerank(datas)
# print(res)
# async def embedding_v2():
# list = [RawData("text", "hello1"), RawData("text", "hello2")]
# res = await vikingdb_service.async_embedding_v2(EmbModel("bge-m3"), list)
# print(res)
# async def upsert_data():
# def gen_random_vector(dim):
# res = [0, ] * dim
# for i in range(dim):
# res[i] = random.random() - 0.5
# return res
# collection = await vikingdb_service.async_get_collection("example")
# field1 = {"doc_id": "111", "text_vector": gen_random_vector(10), "like": 1, "price": 1.11,
# "author": ["gy"], "aim": True}
# field2 = {"doc_id": "222", "text_vector": gen_random_vector(10), "like": 2, "price": 2.22,
# "author": ["gy", "xjq"], "aim": False}
# field3 = {"doc_id": "333", "text_vector": gen_random_vector(10), "like": 3, "price": 3.33,
# "author": ["gy", "xjq"], "aim": False}
# field4 = {"doc_id": "444", "text_vector": gen_random_vector(10), "like": 4, "price": 4.44,
# "author": ["gy", "xjq"], "aim": False}
# data1 = Data(field1)
# data2 = Data(field2)
# data3 = Data(field3)
# data4 = Data(field4)
# datas = [data1, data2, data3, data4]
# await collection.async_upsert_data(datas)
# async def fetch_data():
# collection = vikingdb_service.get_collection("async")
# res = await collection.async_fetch_data(["111", "222"])
# for item in res:
# print(item.fields)
# async def del_data():
# collection = vikingdb_service.get_collection("async")
# res = await collection.async_delete_data("111")
# async def search_by_id():
# index = await vikingdb_service.async_get_index("async", "async")
# res = await index.async_search_by_id("222")
# for item in res:
# print(item.fields)
# async def search_by_vector():
# def gen_random_vector(dim):
# res = [0, ] * dim
# for i in range(dim):
# res[i] = random.random() - 0.5
# return res
# index = await vikingdb_service.async_get_index("async", "async")
# res = await index.async_search_by_vector(gen_random_vector(10))
# for item in res:
# print(item.fields)
# async def index_fetch_data():
# index = await vikingdb_service.async_get_index("async", "async")
# res = await index.async_fetch_data(["111", "222", "333", "444"])
# for item in res:
# print(item.fields)
# async def search():
# index = vikingdb_service.get_index("async", "async")
# def gen_random_vector(dim):
# res = [0, ] * dim
# for i in range(dim):
# res[i] = random.random() - 0.5
# return res
# res = index.search(order=VectorOrder(gen_random_vector(10)), limit=2,
# output_fields=["doc_id", "like", "text_vector"],
# filter={"op": "range", "field": "price", "lt": 3.5})
# print("-----------search_vector---------")
# for item in res:
# print(item)
# print(item.score)
# print("-----------search_scalar---------")
# res = index.search(order=ScalarOrder("price", Order.Desc), limit=6,
# output_fields=["price"],
# filter={"op": "range", "field": "price", "lt": 5})
# for item in res:
# print(item)
# print(item.score)
# print("-----------search_None---------")
# res = index.search(limit=5, output_fields=["doc_id", "like"],
# filter={"op": "range", "field": "price", "lt": 3.5})
# for item in res:
# print(item.fields)
# print(item.score)
# asyncio.run(create_collection())
# asyncio.run(get_collection())
# asyncio.run(del_collection())
# asyncio.run(list_collections())
# asyncio.run(create_index())
# asyncio.run(get_index())
# asyncio.run(del_index())
# asyncio.run(list_index())
# asyncio.run(embedding())
# asyncio.run(update_index())
# asyncio.run(update_collection())
# asyncio.run(rerank())
# asyncio.run(batch_rerank())
# asyncio.run(embedding_v2())
# asyncio.run(upsert_data())
# asyncio.run(fetch_data())
# asyncio.run(del_data())
# asyncio.run(search_by_id())
# asyncio.run(search_by_vector())
# asyncio.run(index_fetch_data())
# asyncio.run(search())
# with open('', 'rb') as file:
# file_content = file.read()
# encoded_image_content = base64.b64encode(file_content).decode()
# list = [RawData("image", image=encoded_image_content), RawData("image", image=encoded_image_content)]
# res = vikingdb_service.embedding_v2(EmbModel(""), list)
# print(res)