总体流程
首先将模型部署到本地,其次分割新闻,将新闻向量化并放入Qdrant里。之后根据用户点击具体新闻
得到历史交互字符串,放到LLM里去生成用户画像,之后将用户画像放进qdrant里去寻找和他最相近的向量,返回其新闻内容信息。之后再利用大模型来选取最接近用户喜欢的内容推荐给用户。
部署模型
首先在本地部署使用该模型:
CUDA_VISIBLE_DEVICES=0 lmdeploy serve api_server /share/new_models/Shanghai_AI_Laboratory/internlm2-chat-1_8b --server-port 23333 --api-keys internlm2
如果不在可以下载:
from huggingface_hub import login, snapshot_download
import os
os.environ['HF_ENDPOINT'] = 'https://hf-mirror.com'
login(token=“your_access_token")
models = ["internlm/internlm2-chat-1_8b"]
for model in models:
try:
snapshot_download(repo_id=model,local_dir="langgpt/internlm2-chat-1_8b")
except Exception as e:
print(e)
pass
创建自己的Qdrant服务器
由于internvl自己的模拟机内核不一样,无法安装docker。因此本文直接创建Qdrant Cloud服务器:
如何创建就不展示了,只需要把下面URL和api_Key换成你的就好了,main函数测试你远程服务器是否链接。
from loguru import logger
from qdrant_client import QdrantClient
from qdrant_client.http.models import Distance, VectorParams, Batch
from qdrant_client.http.exceptions import UnexpectedResponse # 捕获错误信息
import inspect
from qdrant_client.http import models
from config import QDRANT_HOST, QDRANT_PORT, QDRANT_EMBEDDING_DIMS
class Qdrant:
def __init__(self):
self.client = QdrantClient(
url="********", # Qdrant Cloud 实例的 URL
api_key="*************" , # 如果启用了 API 密钥认证
# host=QDRANT_HOST,
# port=QDRANT_PORT
) # 创建客户端实例
self.size = QDRANT_EMBEDDING_DIMS # openai embedding 维度 = 1536
def get_points_count(self, collection_name):
"""
先检查集合是否存在。
- 如果集合存在,返回该集合的 points_count (集合中确切的points_count)
- 如果集合不存在,创建集合。
- 创建集合成功,则返回 points_count (0: 刚创建完points_count就是0)
- 创建集合失败,则返回 points_count (-1: 创建失败了,定义points_count为-1)
Returns:
points_count
Raises:
UnexpectedResponse: 如果在获取集合信息时发生意外的响应。
ValueError: Collection test_collection not found
"""
try:
collection_info = self.get_collection(collection_name)
except (UnexpectedResponse, ValueError) as e: # 集合不存在,创建新的集合
if self.create_collection(collection_name):
logger.success(
f"创建集合成功 | collection_name: {collection_name} points_count: 0")
return 0
else:
logger.error(
f"创建集合失败 | collection_name: {collection_name} 错误信息:{e}")
return -1
except Exception as e:
logger.error(
f"获取集合信息时发生错误 | collection_name: {collection_name} 错误信息:{e}")
return -1 # 返回错误码或其他适当的值
else:
points_count = collection_info.points_count
logger.success(
f"库里已有该集合 | collection_name: {collection_name} points_count:{points_count}")
return points_count
def list_all_collection_names(self):
"""
CollectionsResponse类型举例:
CollectionsResponse(collections=[
CollectionDescription(name='GreedyAIEmployeeHandbook'),
CollectionDescription(name='python')
])
CollectionsResponse(collections=[])
"""
CollectionsResponse = self.client.get_collections()
collection_names = [
CollectionDescription.name for CollectionDescription in CollectionsResponse.collections]
return collection_names
# 获取集合信息
def get_collection(self, collection_name):
"""
获取集合信息。
Args: