wow-agent 学习笔记

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=(
                "用于在原文中检索相关信息"
            ),
        ),
    ),
]

第七课

找个接口请求一下打包成function tool,无笔记

第八课

AgentLite

Langchain实现新的智体推理类型和架构过于复杂。为新的研究场景重构Langchain库是相当具有挑战性的,因为它在创建智体时会产生大量开销。

Autogen虽然已经成功地构建了 LLM 代理,但它的代理接口有固定的推理类型,这使得它很难适应其他研究任务。此外,它的架构仅限于多智能体对话和代码执行,可能不适合所有的新场景或基准测试。

AgentLite框架包括Individual Agent和Manager Agent:

Individual Agent是AgentSite中的基本Agent类。它由四个模块组成:即PromptGen、LLM、Actions和Memory。

Manager Agent是一个individual agent的子类,根据给定的任务指令创建子任务和相应的TaskPackage,这些TP被依次转发到相关联的各个智体。

DuckDuckGo是一个互联网搜索引擎

Zigent创建搜索代理:

class DuckSearchAgent(BaseAgent):
    def __init__(
        self,
        llm: BaseLLM,
        actions: List[BaseAction] = [DuckSearchAction()],
        manager: ABCAgent = None,
        **kwargs
    ):
        name = "duck_search_agent"
        role = "You can answer questions by using duck duck go search content."
        super().__init__(
            name=name,
            role=role,
            llm=llm,
            actions=actions,
            manager=manager,
            logger=agent_logger,
        )

执行代理:

def do_search_agent():
    # 创建代理实例
    search_agent = DuckSearchAgent(llm=llm)

    # 创建任务
    task = "what is the found date of microsoft"
    task_pack = TaskPackage(instruction=task)

    # 执行任务并获取响应
    response = search_agent(task_pack)
    print("response:", response)

第九课

多智能体交互是必要的,不同职责的智能体相互交流,更好地完成任务

编排动作:

和给大模型one-shot、few-shot一样,如果能指导智能体去思考和合作是更好的

from zigent.commons import AgentAct, TaskPackage
from zigent.actions import ThinkAct, FinishAct
from zigent.actions.InnerActions import INNER_ACT_KEY
from zigent.agents.agent_utils import AGENT_CALL_ARG_KEY

# 为哲学家智能体添加示例任务
# 设置示例任务:询问生命的意义
exp_task = "What do you think the meaning of life?"
exp_task_pack = TaskPackage(instruction=exp_task)

# 第一个动作:思考生命的意义
act_1 = AgentAct(
    name=ThinkAct.action_name,
    params={INNER_ACT_KEY: f"""Based on my thought, we are born to live a meaningful life, and it is in living a meaningful life that our existence gains value. Even if a life is brief, if it holds value, it is meaningful. A life without value is merely existence, a mere survival, a walking corpse."""
    },
)
# 第一个动作的观察结果
obs_1 = "OK. I have finished my thought, I can pass it to the manager now."

# 第二个动作:总结思考结果
act_2 = AgentAct(name=FinishAct.action_name, params={INNER_ACT_KEY: "I can summarize my thought now."})
# 第二个动作的观察结果
obs_2 = "I finished my task, I think the meaning of life is to pursue value for the whold world."
# 将动作和观察组合成序列
exp_act_obs = [(act_1, obs_1), (act_2, obs_2)]

# 为每个哲学家智能体添加示例
# 为孔子添加示例
Confucius.prompt_gen.add_example(
    task = exp_task_pack, action_chain = exp_act_obs
)
# 为苏格拉底添加示例
Socrates.prompt_gen.add_example(
    task = exp_task_pack, action_chain = exp_act_obs
)
# 为亚里士多德添加示例
Aristotle.prompt_gen.add_example(
    task = exp_task_pack, action_chain = exp_act_obs
)

先执行后思考总结的动作模板提交给三个智能体

Manager Agent:

用一个智能体调控其他智能体的交互,和MetaGPT一样用team进行管理

# 定义管理者代理
from zigent.agents import ManagerAgent

# 设置管理者代理的基本信息
manager_agent_info = {
    "name": "manager_agent",
    "role": "you are managing Confucius, Socrates and Aristotle to discuss on questions. Ask their opinion one by one and summarize their view of point."
}
# 设置团队成员
team = [Confucius, Socrates, Aristotle]
# 创建管理者代理实例
manager_agent = ManagerAgent(name=manager_agent_info["name"], role=manager_agent_info["role"], llm=llm, TeamAgents=team)

# 为管理者代理添加示例任务
exp_task = "What is the meaning of life?"
exp_task_pack = TaskPackage(instruction=exp_task)

# 第一步:思考如何处理任务
act_1 = AgentAct(
    name=ThinkAct.action_name,
    params={INNER_ACT_KEY: f"""I can ask Confucius, Socrates and Aristotle one by one on their thoughts, and then summary the opinion myself."""
    },
)
obs_1 = "OK."

# 第二步:询问孔子的观点
act_2 = AgentAct(
    name=Confucius.name,
    params={AGENT_CALL_ARG_KEY: "What is your opinion on the meaning of life?",
        },
)
obs_2 = """Based on my thought, I think the meaning of life is to pursue value for the whold world."""

# 第三步:思考下一步行动
act_3 = AgentAct(
    name=ThinkAct.action_name,
    params=xxx
)
obs_3 = xxx

# 第四步:询问苏格拉底的观点
act_4 = AgentAct(
    name=Socrates.name,
    params=xxx
)
obs_4 = xxx

# 第五步:继续思考下一步
act_5 = AgentAct(
    name=ThinkAct.action_name,
    params=xxx
)
obs_5 = "OK."

# 第六步:询问亚里士多德的观点
act_6 = AgentAct(
    name=Aristotle.name,
    params=xxx
)
obs_6 = xxx

# 最后一步:总结所有观点
act_7 = AgentAct(name=FinishAct.action_name, params=xxx)
obs_7 = xxx

# 将所有动作和观察组合成序列
exp_act_obs = [(act_1, obs_1), (act_2, obs_2), (act_3, obs_3), (act_4, obs_4), (act_5, obs_5), (act_6, obs_6), (act_7, obs_7)]

# 将示例添加到管理者代理的提示生成器中
manager_agent.prompt_gen.add_example(
    task = exp_task_pack, action_chain = exp_act_obs
)

调用 ManagerAgent:

from zigent.commons import AgentAct, TaskPackage

exp_task = "先有鸡还是先有蛋?"
exp_task_pack = TaskPackage(instruction=exp_task)
manager_agent(exp_task_pack)

第十课

WriteDirectoryAction类中通过prompt对生成的json进行规范,然而有时会出现幻觉导致json出错,在这仍然可以用Field规范一下输出

定义两个动作:写目录和填内容,并增加示例,完成创作

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/954448.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何优化Elasticsearch大文档查询?

记录一次业务复杂场景下DSL优化的过程 背景 B端商城业务有一个场景就是客户可见的产品列表是需要N多闸口及各种其它逻辑组合过滤的,各种闸口数据及产品数据都是存储在ES的(有的是独立索引,有的是作为产品属性存储在产品文档上)。 在实际使用的过程中&a…

idea分支合并代码

步骤一 首先把两个分支的代码都提交了,保持和远程仓库一致,不要有任何没提交的代码。如果一些程序的yml配置文件,不想提交,可以复制一个,不受git管理。如果有没有提交的代码,合并分支的时候就会提示那些代…

EasyLine(v2.0)自制光谱、曲线处理软件

前言:因为这次更新对软件的整体变动较大,所以就没有取版本v1.1,而是直接使用v2.0版本。然后上一版的讲解也不是很清楚,这次也做重点讲解一下。 自制光谱、曲线处理软件-EasyLine 软件的安装软件的使用总体介绍文件格式处理的使用 …

使用JMeter模拟多IP发送请求!

你是否曾遇到过这样的场景:使用 JMeter 进行压力测试时,单一 IP 被服务器限流或者屏蔽?这时,如何让 JMeter 模拟多个 IP 发送请求,成功突破测试限制,成为测试工程师必须攻克的难题。今天,我们就…

python如何设计矩阵

python设计矩阵: 1、调用numpy模块创建矩阵并设置矩阵的行跟列 import numpy matrix numpy.array([[1,2,3],[4,5,6],[7,8,9]])#创建矩阵 2、通过下标的办法输出二维列表中的一维列表,达到输出矩阵的效果 vector numpy.array([[1,2,3],[4,5,6],[7,8,9]…

量子计算:从薛定谔的猫到你的生活

文章背景 说到量子计算,不少人觉得它神秘又遥不可及。其实,它只是量子物理学的一个“应用小分支”。它的核心在于量子比特的“叠加”和“纠缠”,这些听上去像科幻小说的概念,却为计算世界开辟了一片全新的天地。如果经典计算是“…

python 轮廓 获取环形区域

目录 效果图: 代码: 效果图: 代码: import cv2 import numpy as np# 读取图像 image cv2.imread(rE:\project\jijia\tools_jijia\img_tools\ground_mask.jpg, cv2.IMREAD_GRAYSCALE) # 二值化图像 # 二值化图像 _, binary cv…

Python | 使用Matplotlib进行图案填充和边缘颜色分离的三种方法

Matplotlib是Python中功能强大的绘图库,允许广泛的自定义选项。一个常见的要求是分离出图中的图案填充和边缘颜色。默认情况下,Matplotlib中的填充颜色与边缘颜色相关联,但有一些方法可以独立自定义这些颜色。本文将深入研究如何实现这一点的…

OpenStack 网络服务的插件架构

OpenStack 的网络服务具有灵活的插件架构,可支持多种不同类型的插件以满足不同的网络需求。以下是对 OpenStack 网络服务插件架构中一些常见插件类型的介绍: 一、SDN 插件 Neutron 与 SDN 的集成:在 OpenStack 网络服务里,SDN 插…

从 MySQL 到 ClickHouse 的迁移与优化——支持上亿级数据量的复杂检索

文章目录 1. ClickHouse 背景与使用场景1.1 ClickHouse 简介1.2 ClickHouse 的特点1.3 ClickHouse 的使用场景 2. 从 MySQL 到 ClickHouse 的迁移2.1 MySQL 与 ClickHouse 的对比2.2 迁移背景2.3 迁移注意事项2.3.1 数据模型设计2.3.2 数据迁移2.3.3 SpringBoot 项目改造2.3.4 …

08:软件定时器+中断管理

软件定时器中断管理 1、软件定时器2、中断管理2.1、中断屏蔽2.2、临界区 1、软件定时器 软件定时器是基于 FreeRTOS 内核提供的时间管理功能实现的,允许开发者创建、启动、停止、删除和管理定时器,从而实现在任务中对时间的灵活控制。 软件定时器硬件定…

数据结构《MapSet哈希表》

文章目录 一、搜索树1.1 定义1.2 模拟实现搜索 二、Map2.1 定义2.2 Map.Entry2.3 TreeMap的使用2.4 Map的常用方法 三、Set3.1 定义3.2 TreeSet的使用3.3 Set的常用方法 四、哈希表4.1 哈希表的概念4.2 冲突4.2.1 冲突的概念4.2.2 冲突的避免1. 选择合适的哈希函数2. 负载因子调…

蓝桥与力扣刷题(709 转换成小写字母)

题目:给你一个字符串 s ,将该字符串中的大写字母转换成相同的小写字母,返回新的字符串。 示例 1: 输入:s "Hello" 输出:"hello"示例 2: 输入:s "here…

unity学习16:unity里向量的计算,一些方法等

目录 1 unity里的向量: 2 向量加法 2.1 向量加法的几何意义 2.2向量加法的标量算法 3 向量减法 3.1 向量减法的几何意义 3.2 向量减法的标量算法 4 向量的标量乘法 5 向量之间的乘法要注意是左乘 还是右乘 5.1 注意区别 5.2 向量,矩阵&#x…

算法3(力扣83)-删除链表中的重复元素

1、题目:给定一个已排序的链表的头 head , 删除所有重复的元素,使每个元素只出现一次 。返回 已排序的链表 。 2、实现( 因为已排序,所以元素若重复,必然在其下一位)(这里为在vscod…

深度学习基础知识

深度学习是人工智能(AI)和机器学习(ML)领域的一个重要分支,以下是对深度学习基础知识的归纳: 一、定义与原理 定义:深度学习是一种使计算机能够从经验中学习并以概念层次结构的方式理解世界的机…

基于mediapipe的手势游戏控制

基于mediapipe的手势游戏控制 ​ 玩游戏,那不是有手就行!!! mediapipe介绍 ​ Mediapipe是Google在2019年开发并提出的一款开源的跨平台多媒体处理框架,用于构建基于机器学习的应用程序,特别是涉及到计算机视觉、音频处理、姿势估计等领域。…

015: 深度学习之正向传播和反向传播

本文为合集收录,欢迎查看合集/专栏链接进行全部合集的系统学习。 合集完整版请参考这里。 上一节介绍了训练和推理的概念,这一节接着训练和推理的概念讲一下,神经网络的正向传播和反向传播。 正反向传播 其实单看正向传播和反向传播这两个…

2025.1.15——二、字符型注入

一、基本操作:整理已知信息,本题为字符型注入 二、解题步骤 step 1:确认为字符型注入 键入: 1 键入:1 and 12 # 发现报错 键入:1 and 11 # 未发现报错 所以确认为字符型注入 step 2:查询…

UML系列之Rational Rose笔记四:时序图(顺序图_序列图)

时序图有很多画法,这基本上能算rose里面要求最乱的一种图了;有些人的需求是BCE模式,这是正常规范点的,有些人就不需要,有些需要用数据库交互,有些不需要;没有一个较为统一的需求;在此…