当前位置: 首页 > article >正文

大模型融入推荐系统

结合项目实际给用户推荐,比如是商家项目,用户问了几个关于商品的信息,大模型就可以根据根据用户画像,给用户推荐商品。

我们现在做的是针对于用户学习的推荐,首先我们要对我们的数据进行处理,提取出我们数据的一些特征

 首先这个文件夹下可以放一些文件当做子目录,这些子目录就可以当做一些course

 

 

 遍历文件,转换为markdown,然后读取里面的标题内存,然后存储到csv文件中。此时还缺少摘要,所以我们用大模型来读取内容从而生成摘要。

def generate_csv_for_pdfs(root_dir):

    # 搜索指定根目录下的所有PDF文件
    pdf_files = glob.glob(f'{root_dir}/**/*.pdf', recursive=True)
    data = []

    for pdf_file in pdf_files:
        # 将 PDF 格式转化成 Markdown 格式
        markdown = convert_pdf_to_markdown(pdf_file)

        # 根据Markdown的内容结构,提取每一部分的主题内容
        toc_content = extract_content_by_sections(markdown)

        # 第一个标题部分是课程的主标题
        titles = list(toc_content.keys())
        first_title = titles[0] if titles else ""
        # 收集第一标题下的二级标题作为子标题
        first_section_content = toc_content.get(first_title, "")
        first_section_lines = first_section_content.split('\n')
        sub_titles = [line.strip() for line in first_section_lines if line.startswith('##')]
        sub_titles_cleaned = [re.sub(r'^##\s+', '', title) for title in sub_titles]

        for module_name, content in toc_content.items():
            # 提取二级标题作为 Tags
            tags = [line.strip() for line in content.split('\n') if line.startswith('##')]
            tags = [re.sub(r'^##\s+', '', tag) for tag in tags]  # 清理 '##'

            # 构建元数据
            data.append({
                'ModuleID': str(uuid.uuid4()),
                'Course': os.path.basename(os.path.dirname(pdf_file)),
                'Title': sub_titles_cleaned,
                'URL': os.path.basename(pdf_file),
                'ModuleName': module_name,
                'Tags': ", ".join(tags),
                'Content': content
            })

    df = pd.DataFrame(data)
    csv_file_path = os.path.join(root_dir, 'course_metadata.csv')
    df.to_csv(csv_file_path, index=False)
    print(f"CSV file generated: {csv_file_path}")

 然后生成摘要

 

 构建文档的画像,执行某些列,把这些列合并组成文档的画像,为一个新的列embedding_info,

这个embeding_info_的list是一个列表

 把这些用户画像存入到向量数据库中,执行的是do_add_file方法

 

 系统调用

之前的步骤略

     # 在同一个 model 实例上同时运行两个异步链(LLMChain)可能导致内部状态的混乱,所以为用户画像生成和聊天响应分别实例化模型
        # 该模型实例用于生成用户画像
        model_for_profile = get_ChatOpenAI(
            model_name=model_name,
            temperature=TEMPERATURE,
            max_tokens=MAX_TOKENS,
        )

        # 该模型实例用于生成聊天响应
        model_for_chat = get_ChatOpenAI(
            model_name=model_name,
            temperature=TEMPERATURE,
            max_tokens=MAX_TOKENS,
            callbacks=callbacks,
        )

如果用户历史对话超过5轮就生成用户画像 

 

 生成用户画像,根据用户的历史对话信息,采用这个提示模版生成用户画像

# 生成用户画像: 通过理解`用户历史行为序列`,生成`用户感兴趣的话题`以及`用户位置信息`
user_profile_prompt = """
请你根据历史对话记录:\n\n

{chat_history}

如上对话历史记录所示,请你分析当前用户的需求,并描述出用户画像,用户画像的格式如下:

[Course]
- (Course1)

[ModuleName]
- (ModuleName1)

其中课程名称 [Course] 请务必从下面的列表中提取出最匹配的:\n

["在线大模型课件", "开源大模型课件"]

最后,一定要注意,需要严格按照上述格式描述相关的课程名称和课程的知识点,同时,[Course] 和 [ModuleName] 一定要分别处理,你最终输出的结果一定不要输出任何与上述格式无关的内容。
"""
async def generate_user_profile_and_extract_info(chat_messages: List[str], user_profile_prompt: str, model) -> Dict[
    str, List[str]]:
    """
    异步生成用户画像并从中提取课程和模块信息。

    :param chat_messages: 聊天历史消息列表
    :param user_profile_prompt: 用于生成用户画像的提示
    :param model: 已实例化的模型对象
    :return: 包含课程和模块名称的字典
    """
    # 创建聊天提示模板
    prompt_template = ChatPromptTemplate.from_messages([
        ("user", user_profile_prompt),
    ])

    # 创建LangChain的链
    user_profile_chain = LLMChain(prompt=prompt_template, llm=model)

    # 异步生成用户画像
    user_profile_result = user_profile_chain.invoke({"chat_history": chat_messages})
    user_profile = user_profile_result["text"]

    # 定义正则表达式并提取课程与模块信息
    def extract_course_and_module(text: str) -> Dict[str, List[str]]:
        course_pattern = r"\[Course\]\s+-\s+(.+)"
        module_name_pattern = r"\[ModuleName\]\s+-\s+(.+)"
        courses = re.findall(course_pattern, text)
        module_names = re.findall(module_name_pattern, text)
        return {"Course": courses, "ModuleName": module_names}

    # 提取信息并返回
    return extract_course_and_module(user_profile)

然后接下来就是根据用户画像去和向量数据库中的内容匹配,如果量很大,可以把信息存储到es中,做倒排索引

接下来走正常的处理流程 


http://www.kler.cn/a/540481.html

相关文章:

  • 练习题(2.10)
  • DFS+回溯+剪枝(深度优先搜索)——搜索算法
  • Compose笔记(四)--derivedStateOf
  • 在 Java 中使用数据库的存储过程有什么好处?如何在 JDBC 中调用存储过程?
  • GB/T 43698-2024 《网络安全技术 软件供应链安全要求》标准解读
  • 十二、Docker Compose 部署 SpringCloudAlibaba 微服务
  • 【Unity】性能优化:UI的合批 图集和优化
  • 基于Java的自助多张图片合成拼接实战
  • 洛谷 P1015:回文数 ← 高精度加法
  • 宇宙大爆炸3D粒子特效实现原理详解
  • 【jmeter】在windows中,创建的变量,在jmeter中,读取变量失败的问题,路径问题
  • CSS Position宝典:解锁网页元素精准布局的秘密武器
  • Go语言构建微服务:从入门到实战
  • 0基础租个硬件玩deepseek,蓝耘元生代智算云|本地部署DeepSeek R1模型
  • 千兆网络变压器(又称千兆以太网隔离变压器)是一种基于电磁感应原理设计的设备,主要用于以下核心功能:
  • Python—pandas读取Excel将两列转为字典(json)
  • Git安全回退历史版本
  • 基于java手机销售网站设计和实现(LW+源码+讲解)
  • 麒麟系统编译安装git
  • 一篇文章讲透Raft共识协议
  • 在 Visual Studio Code 与微信开发者工具中调试使用 emscripten 基于 C 生成的 WASM 代码
  • 基于 GEE 批量下载研究区夜光遥感数据
  • Yocto Project的后坐力与未来可能性分析
  • 基于单片机的高精度智能电子秤设计
  • 线程池以及日志、线程总结
  • v-for的数据返回和接口返回不一致