wow-agent 学习笔记

news/2025/1/13 15:45:43 标签: agent, rag, 大模型

wow-agent-课程详情 | Datawhale

前两课比较基础,无笔记

第三课

阅卷智能体这一块,曾经做过一点和AI助教相关的内容,也是用了一个prompt去进行CoT,但是风格和课程中的不太相同,在下面附上我的prompt

你是一名资深教师助理,负责帮助老师批改和评分学生提交的主观题答案。这些题目主要涉及语文作文、英语作文等内容。你将根据以下六个评分标准,对学生的答案进行评估和打分。请确保你的评估详细且准确,并在最后提供总分。评分标准如下:
    i
    1. **准确性**(0-5分):
       - 根据学生对问题的理解和回答的准确程度进行评分。如果答案完全正确,描述了算法或概念的关键要点,并且算法选择合理,得5分。如果存在小错误、偏离题意的地方或算法选择不当,视其严重程度扣分。完全错误或无关答案得0分。

    2. **逻辑性**(0-5分):
       - 根据学生答案的逻辑结构、推理过程以及算法流程的清晰度进行评分。如果答案逻辑严密,推理过程清晰且算法步骤明确,得5分。如果逻辑混乱,推理不连贯或算法流程描述不清,视其严重程度扣分。没有逻辑或推理过程的答案得0分。

    3. **表达清晰度**(0-5分):
       - 根据学生表达的清晰度和语言的准确性进行评分。如果表达流畅、语言精准且无语法错误,术语使用正确,得5分。如果存在表达不清、语法错误或术语使用不当,视其严重程度扣分。表达不清或充满错误的答案得0分。

    4. **深度分析**(0-5分):
       - 根据学生对算法或概念的深入分析和理解进行评分。如果学生能提供超出题目要求的深入见解、分析算法的优缺点,或对算法选择进行了全面的讨论,得5分。如果答案只是表面分析,缺乏深度或未能充分考虑算法选择的合理性,视其程度扣分。缺乏任何分析的答案得0分。

    5. **创新性**(0-5分):
       - 根据学生答案的独特性和创新性进行评分。如果学生能提出新颖的算法改进、独特的概念理解,或提供有创意的解决方案,得5分。如果答案中规中矩,缺乏创新,视其程度扣分。完全缺乏创新的答案得0分。

    6. **完整性**(0-5分):
       - 根据学生回答是否涵盖了题目要求的所有方面,并提供了全面的分析或算法流程进行评分。如果答案非常全面,涵盖了所有必要的要点,并对问题进行了完整的回答,得5分。如果有些要点未涵盖或有重要内容遗漏,视其程度扣分。严重不完整的答案得0分。

    请根据以上评分标准和老师提供的标准答案,详细评估以下学生的答案,并分别给出每个评分标准的具体得分与评分理由。最后,计算并提供该学生答案的总分。

    学生的主观题题目:
    {subjective_question}
    学生的答案:
    {student_answer}
    老师提供的标准答案:
    {standard_answer}
    请对上述学生的答案进行详细的评估,并分别对每个标准进行打分(0-5分),同时给出具体的评分理由,并将所有项目得分相加,得出该学生答案的总分数。

教程给的prompt对格式要求更多,但我是拿字符串出来自己拼一个json交给后端,所以重心更多的放在了给分上

第四课

OurLLM类中

@llm_completion_callback()
    def stream_complete(
        self, prompt: str, **kwargs: Any
    ) -> Generator[CompletionResponse, None, None]:
        response = self.client.chat.completions.create(
            model=self.model_name,
            messages=[{"role": "user", "content": prompt}],
            stream=True
        )

        try:
            for chunk in response:
                chunk_message = chunk.choices[0].delta
                if not chunk_message.content:
                    continue
                content = chunk_message.content
                yield CompletionResponse(text=content, delta=content)

        except Exception as e:
            raise Exception(f"Unexpected response format: {e}")

做了一个流式输出,每次yield丢出一个content非空的chunk,chunk的content为空则代表比起上次没有更新文本内容(可能更新了元数据)

流式输出就是不等整段话全部生成完全,而是生成一点输出一点,相较于全部输出的效率更高,在业务场景下对用户体验更友好

api_key: str = Field(default=api_key)
base_url: str = Field(default=base_url)
model_name: str = Field(default=chat_model)
client: OpenAI = Field(default=None, exclude=True)

类的开头定义的Field可以帮助缓解Agent传参数,输入输出等的幻觉

llama_index调tools的小demo

multiply_tool = FunctionTool.from_defaults(fn=multiply)
add_tool = FunctionTool.from_defaults(fn=add)

# 创建ReActAgent实例
agent = ReActAgent.from_tools([multiply_tool, add_tool], llm=llm, verbose=True)

response = agent.chat("20+(2*4)等于多少?使用工具计算每一步")

第五课

Ollama是很好用的搭大模型的框架,包括Xinference、openai这些都挺好的

与数据库交互:

query_engine = NLSQLTableQueryEngine(  
    sql_database=sql_database,   
    tables=["section_stats"],   
    llm=Settings.llm  
)

第六课

llama_index + faiss:

构建索引

from llama_index.core import SimpleDirectoryReader,Document
documents = SimpleDirectoryReader(input_files=['./docs/问答手册.txt']).load_data()

# 构建节点
from llama_index.core.node_parser import SentenceSplitter
transformations = [SentenceSplitter(chunk_size = 512)]

from llama_index.core.ingestion.pipeline import run_transformations
nodes = run_transformations(documents, transformations=transformations)

# 构建索引
from llama_index.vector_stores.faiss import FaissVectorStore
import faiss
from llama_index.core import StorageContext, VectorStoreIndex

vector_store = FaissVectorStore(faiss_index=faiss.IndexFlatL2(3584))
storage_context = StorageContext.from_defaults(vector_store=vector_store)

index = VectorStoreIndex(
    nodes = nodes,
    storage_context=storage_context,
    embed_model = embedding,
)

简单分了个512的chunk,也就是512个token在一起向量化存入数据库

3584是指定的向量的维度

这里处理文档,llama_index提供了很多方法:

简单文件节点解析器 (SimpleFileNodeParser)
我们可以使用 SimpleFileNodeParser 来解析简单的文件类型,如 Markdown 文件。下面是一个例子:

from llama_index.core.node_parser import SimpleFileNodeParser
from llama_index.readers.file import FlatReader
from pathlib import Path

# 加载 Markdown 文档
md_docs = FlatReader().load_data(Path("./test.md"))

# 创建解析器实例
parser = SimpleFileNodeParser()

# 从文档中获取节点
md_nodes = parser.get_nodes_from_documents(md_docs)

HTML 节点解析器 (HTMLNodeParser)
HTMLNodeParser 使用 BeautifulSoup 来解析原始 HTML。默认情况下,它会解析一些特定的 HTML 标签。

from llama_index.core.node_parser import HTMLNodeParser

# 创建 HTML 解析器,指定需要解析的标签
parser = HTMLNodeParser(tags=["p", "h1"])

# 从 HTML 文档中获取节点
nodes = parser.get_nodes_from_documents(html_docs)

JSON 节点解析器 (JSONNodeParser)
JSONNodeParser 用于解析原始 JSON 文本。

from llama_index.core.node_parser import JSONNodeParser

# 创建 JSON 解析器实例
parser = JSONNodeParser()

# 从 JSON 文档中获取节点
nodes = parser.get_nodes_from_documents(json_docs)

Markdown 节点解析器 (MarkdownNodeParser)
MarkdownNodeParser 用于解析原始的 Markdown 文本。

from llama_index.core.node_parser import MarkdownNodeParser

# 创建 Markdown 解析器实例
parser = MarkdownNodeParser()

# 从 Markdown 文档中获取节点
nodes = parser.get_nodes_from_documents(markdown_docs)

代码分割器 (CodeSplitter)
CodeSplitter 根据代码的语言将原始代码文本进行分割。

from llama_index.core.node_parser import CodeSplitter

# 创建代码分割器实例
splitter = CodeSplitter(
    language="python",
    chunk_lines=40,  # 每块的行数
    chunk_lines_overlap=15,  # 块之间的重叠行数
    max_chars=1500,  # 每块的最大字符数
)

# 从文档中获取节点
nodes = splitter.get_nodes_from_documents(documents)

句子分割器 (SentenceSplitter)
SentenceSplitter 尝试在尊重句子边界的情况下进行文本分割。

from llama_index.core.node_parser import SentenceSplitter

# 创建句子分割器实例
splitter = SentenceSplitter(
    chunk_size=1024,
    chunk_overlap=20,
)

# 从文档中获取节点
nodes = splitter.get_nodes_from_documents(documents)

使用 Langchain 的节点解析器 (LangchainNodeParser)
你还可以用 Langchain 提供的文本分割器来包装节点解析器。

from langchain.text_splitter import RecursiveCharacterTextSplitter
from llama_index.core.node_parser import LangchainNodeParser

# 创建 Langchain 解析器实例
parser = LangchainNodeParser(RecursiveCharacterTextSplitter())

# 从文档中获取节点
nodes = parser.get_nodes_from_documents(documents)
                        
原文链接:https://blog.csdn.net/qq_29929123/article/details/140745604

构建问答引擎

# 构建检索器
from llama_index.core.retrievers import VectorIndexRetriever
# 想要自定义参数,可以构造参数字典
kwargs = {'similarity_top_k': 5, 'index': index, 'dimensions': 3584} # 必要参数
retriever = VectorIndexRetriever(**kwargs)

# 构建合成器
from llama_index.core.response_synthesizers  import get_response_synthesizer
response_synthesizer = get_response_synthesizer(llm=llm, streaming=True)

# 构建问答引擎
from llama_index.core.query_engine import RetrieverQueryEngine
engine = RetrieverQueryEngine(
      retriever=retriever,
      response_synthesizer=response_synthesizer,
        )

# 提问
question = "请问商标注册需要提供哪些文件?"
response = engine.query(question)
for text in response.response_gen:
    print(text, end="")

检索top的5个chunk作为上下文

打包RetrieverQueryEngine作为function tool

# 配置查询工具
from llama_index.core.tools import QueryEngineTool
from llama_index.core.tools import ToolMetadata
query_engine_tools = [
    QueryEngineTool(
        query_engine=engine,
        metadata=ToolMetadata(
            name="RAG工具",
            description=(
                "用于在原文中检索相关信息"
            ),
        ),
    ),
]

第七课

 pass


http://www.niftyadmin.cn/n/5822011.html

相关文章

深度学习中常见的激活函数详解

文章目录 激活函数概述常见的激活函数详解Sigmoid激活函数Tanh激活函数ReLU激活函数Leaky ReLU激活函数ELU激活函数Swish激活函数 激活函数的选择总结参考文献 在深度学习领域的神经网络中,激活函数解锁了模型对复杂数据模式的捕捉能力。它们在神经元中发挥着至关重…

Android 系统签名 keytool-importkeypair

要在 Android 项目中使用系统签名并将 APK 打包时与项目一起打包,可以按照以下步骤操作: 步骤 1:准备系统签名文件 从 Android 系统源码中获取系统签名文件,通常位于 build/target/product/security 目录下,包括 pla…

微商关系维系与服务创新:链动2+1模式、AI智能名片与S2B2C商城小程序的应用研究

摘要:随着社交媒体的蓬勃发展,微商作为一种新兴的商业模式,在人与人之间关系网络的基础上逐渐兴起。然而,与实体商家和传统电商相比,微商面临着更大的关系维系挑战。为了保持竞争力,微商必须不断创新服务模…

驱动开发系列33 - Linux Graphics mesa Intel驱动介绍

一:概述 mesa 中的 Intel 驱动体系是为支持 Intel GPU 提供图形 API 的硬件实现部分,主要包括 OpenGL、Vulkan等图形接口,Intel驱动实现整体上分为四层: 第一层:API 层, 实现 OpenGL 和 Vulkan 接口, src/mesa/main、src/vulkan。 第二层:驱动层,实现 OpenGL 和 Vulkan…

【13】制作镜像以及重启实例

制作镜像 k8s集群 有两个镜像需要制作,一个是master节点,一个是node节点。 在master节点上成功部署了k8s的控制平面,在node节点上部署了worker节点的配置,不知道打包镜像重启之后集群的状态是什么样的。 确认集群在运行&#…

ref useRef React.createRef React.forwardRef

react如何获取真实DOM&#xff1a;useRef, React.CreateRef() access DOM nodes directly within React&#xff1a;ref.current Let’s say you want to change the value of an <input> element, but without using props or re-rendering the whole component. They’…

爬虫基础之爬取歌曲宝歌曲批量下载

声明&#xff1a;本案列仅供学习交流使用 任何用于非法用途均与本作者无关 需求分析: 网站:邓紫棋-mp3在线免费下载-歌曲宝-找歌就用歌曲宝-MP3音乐高品质在线免费下载 (gequbao.com) 爬取 歌曲名 歌曲 实现歌手名称下载所有歌曲 本案列所使用的模块 requests (发送…

机器学习模型调优指南

机器学习模型调优指南 机器学习模型参数调优的作用在于优化模型的性能&#xff0c;使其能够在给定任务上更好地泛化和预测。通过合理调整模型的超参数&#xff0c;能够提高模型的准确性、降低过拟合或欠拟合的风险、加快训练过程等。具体来说&#xff0c;机器学习模型参数调优…