首页 > 其他分享 >大模型agent开发之基于知识库的聊天机器人

大模型agent开发之基于知识库的聊天机器人

时间:2024-10-21 19:58:32浏览次数:8  
标签:机器人 text self 知识库 agent texts print 文本 page

1. 文本知识库的加载和分割

实现一个智能文档助手,基于已有知识库给向ai发起提问使ai能够基于知识库回答更加准确的答案,首先需要加载对应的文档,文档类型可以是docx,xlsx,md等格式。并且对文档进行分割,将其分割成一块一块的Document类型并转成list类型方便后续处理。

    def getFile(self):
        print(f"Attempting to load document: {self.doc}")
        doc = self.doc
        loaders = {
            "docx": Docx2txtLoader,
            "pdf": PyPDFLoader,
            "excel": UnstructuredExcelLoader
        }
        file_extension = doc.split(".")[-1]
        loader_class = loaders.get(file_extension)

        if loader_class:
            try:
                print(f"Using loader: {loader_class.__name__}")
                loader = loader_class(doc)
                text = loader.load()
                print("Loaded text:", text)

                # 处理返回的 text 是 list 但内容是 Document 类型的情况
                if isinstance(text, list):
                    processed_text = []
                    for t in text:
                        if isinstance(t, Document):
                            processed_text.append(t)
                        else:
                            print(f"Unknown object type in list: {type(t)}")
                    return processed_text
                elif isinstance(text, str):
                    return [text]
                else:
                    raise ValueError("Loaded content is neither string nor list of strings.")
            except Exception as e:
                print(f"Error loading {file_extension} file: {e}")
                print(f"Document path: {doc}")
                return None
        else:
            print(f"Unsupported file extension: {file_extension}")
            return None

2. 文档向量化存储

将上述切割好的文档保存在类实例‘splitText’中选择‘all-MiniLM-L6-v2’文本嵌入模型,这是一种轻量级小模型。根据该模型对列表中的每个文本块进行向量化处理,然后通过Chroma向量化数据库保存生成的向量。

    # 向量化与向量存储
    def embeddingAndVectorDB(self):
        # 确保 self.splitText 不为空
        if not self.splitText or len(self.splitText) == 0:
            raise ValueError("Document list is empty. Please provide valid documents.")

        # 使用本地的预训练模型,如 'all-MiniLM-L6-v2'
        embedding_model = LocalEmbedding('sentence-transformers/all-MiniLM-L6-v2')
        page_texts = []
        for t in self.splitText:
            page_texts.append(t.page_content)
        print(f"page: {page_texts}")
        # 生成嵌入
        embeddings = embedding_model.embed_documents(page_texts)
        if not embeddings or len(embeddings) != len(page_texts):
            raise ValueError("Mismatch between document count and embedding count.")

        # 打印调试信息
        print(f"Documents: {self.splitText}")
        print(f"Embeddings: {embeddings}")

        # 使用 Chroma 存储这些向量
        db = Chroma.from_texts(
            texts=page_texts,  # 文档列表
            embedding=embedding_model  # 传入自定义的嵌入模型
        )

        return db

 3. 索引并使用自然语言找出相关文本块

在本模块中首先获取到向量数据库并与传入的问题一起根据余弦相似度算法计算出评分最高的文本块,并将文本块返回。

    # 提问并找到相关文本块(在向量存储时使用最大边际相似性和相似性打分)
    def askAndFindFiles(self, question):
        db = self.embeddingAndVectorDB()
        print(f"Vector DB created: {db}")  # 确保数据库创建成功
        retriever = db.as_retriever(search_type="similarity_score_threshold",
                                    search_kwargs={"score_threshold": 0.1, "k": 1})
        context = retriever.invoke(input=question)
        print(f"Retrieved documents: {context}")  # 确保检索到内容
        return context

4. 开始和文件聊天

首先需要传入知识库文本地址,然后引用获取问题的接口,该接口回将与问题相关的文本块返回来,然后将文本块拼接好传入到本地大模型中作为提示词。

# 和文本机器人聊天
def chatWithyl(question):
    _content = ""
    context = chat_yl.askAndFindFiles(question)
    for i in context:
        _content += i.page_content
    msgs = chat_yl.prompts.format_messages(context=_content, question=question)
    print(msgs)
    response = llm(msgs)
    print(f"answer: {response}")

最后运行向大模型提出某一领域问题,即可得到相关的答案。

标签:机器人,text,self,知识库,agent,texts,print,文本,page
From: https://www.cnblogs.com/Ethereal-hzc/p/18486593

相关文章

  • agent开发实习生都是做什么,agent是什么,介绍,怎么学习,学习路线
    Agent,中文译为“代理”或“智能体”,是一种能够在特定环境中自主行动、感知环境、做出决策并与其他Agent或人类进行交互的计算机程序或实体。它们具备自主性、反应性、社交性和适应性等特点,能够根据环境的变化调整自己的行为,以达到预设的目标。Agent开发实习生通常参与以下工作......
  • 为什么需要Multi-agent framework?
    为什么需要Multi-agentframework?Multi-agentframework(多智能体框架)之所以被需要,主要基于以下几个方面的原因:一、突破单智能体的限制上下文窗口大小限制:在处理长上下文(LongContext)时,单一的智能体可能会受到上下文窗口大小的限制,导致无法有效地处理和生成回复。通过拆分......
  • 乘风破浪,扬帆出海,机器人领域常用数学之距离计算
    欧几里得距离欧几里得距离公式(EuclideanDistanceFormula)是一种用来计算两个点之间直线距离的数学公式。它基于欧几里得几何学,即经典的平面和空间几何学。欧几里得距离是两点之间最短的路径,它是在各维度上的差值的平方和的平方根。这是我们通常在日常生活中所理解的“直线距......
  • 大健康零售电商AI知识库:优化用户体验的新引擎
    在当今的数字化时代,大健康零售电商行业正以前所未有的速度蓬勃发展。随着消费者对健康产品需求的日益增长,如何提升用户体验,成为了大健康零售电商平台的核心竞争力之一。在这个过程中,AI知识库作为连接产品与消费者的桥梁,正逐渐展现出其在优化用户体验方面的巨大潜力。一、用......
  • 企业AI助理与知识库管理系统:重塑企业知识管理的新篇章
    在数字化转型的浪潮中,企业正面临着前所未有的机遇与挑战。如何高效管理、快速获取并利用企业内部的知识资源,成为了提升企业竞争力的关键。近年来,企业AI助理与知识库管理系统的结合,正逐步成为企业知识管理的新趋势,为企业的知识共享、创新和发展注入了新的活力。本文将深入探......
  • 精准管理知识资产:十大内部知识库工具全解析
    在当今竞争激烈的市场环境中,知识资产已成为企业核心竞争力的重要组成部分。为了更好地管理和利用这些宝贵的知识资源,选择合适的内部知识库工具至关重要。本文将为您介绍十款高效、实用的内部知识库工具,帮助您实现知识资产的精准管理。1.HelpLookAI知识库适用对象:企业/客......
  • qwen2.5 ollama推理;openai function call调用中文离线agents使用
    ollama部署qwen2.5:3b0.3.11版本agents使用https://qwen.readthedocs.io/en/latest/framework/function_call.htmlfromopenaiimportOpenAIimportjsondefsend_messages(messages):response=client.chat.completions.create(model="qwen2.5:3b......
  • 开源模型+Orchestrating Agents多智能体框架,易用、强大且可控
    以下是对开源模型+OrchestratingAgents多智能体框架的技术详解:一、开源模型1.优势   成本效益     开源模型无需支付昂贵的授权费用。对于预算有限的研究机构、初创企业和小型开发团队来说,这是一个巨大的优势。例如,在自然语言处理领域,许多开源的语言模型可供......
  • AI 大模型:Intelligent Agent—— 开启智能新纪元
    在LLM语境下,Agent理解为在某种能自主理解、规划决策、执行复杂任务的智能体,LLM充当着智能体的“大脑”。从软件工程的角度,智能体是一种基于大语言模型的,具备规划思考能力、记忆能力、使用工具函数的能力,能自主完成给定任务的计算机程序。在基于LLM的智能体中,LLM的充......
  • 【Agent系列】从论文到源码解析Self-Ask 以及数据构建带来的启发
    前言一、Self-Ask解决了什么二、Self-Ask的理论实现三、从源码看Self-Ask的实现四、从实验结果看LLM的内部机制五、数据集的构建细节六、资料链接总结前言Self-Ask对LLM的推理能力进行了实验评估,并且提出了一种follow-up范式来提升LLM的2跳推理能力,为了进一步提升回答准确率......