目录

langchain检索文本分割RAG

langchain检索、文本分割、RAG

RAG

RAG:Retrieval-AugmentedGeneration检索增强生成。RAG通过结合LLMS的内在知识和外部数据库的非参数化数据,提高了模型在知识密集型任务中的准确性和可信度。

RAG是一种增强大型语言模型(LLM)知识的方法,它通过引入额外的数据来实现

pip install langgraph用来创建代理的API

检索

大型语言模型在一个大但固定的数据集上进行训练,限制了它们对私有或最新信息的推理能力。 用特定事实微调大型语言模型是缓解这一问题的一种方法,但通常不适合事实回忆并且可能成本高昂。 检索是向大型语言模型提供相关信息以改善其对给定输入的响应的过程。 检索增强生成 (RAG) 论文是使用检索到的信息来为大型语言模型生成(输出)提供基础的过程。RAG 的效果取决于检索文档的相关性和质量。

查询翻译

首先,考虑用户输入到您的 RAG 系统中的内容。理想情况下,RAG 系统可以处理各种输入,从措辞不当的问题到复杂的多部分查询。 使用大型语言模型来审查并可选地修改输入是查询翻译的核心思想。 这作为一个通用缓冲区,优化原始用户输入以适应您的检索系统。 例如,这可以简单到提取关键词,或复杂到为复杂查询生成多个子问题。

路由

其次,考虑可用于您的RAG系统的数据源。您希望跨多个数据库或跨结构化和非结构化数据源进行查询。使用大型语言模型(LLM)来审查输入并将其路由到适当的数据源是一种简单有效的跨源查询方法。

https://i-blog.csdnimg.cn/direct/fe3b068a237b498c83fc943cac59109e.png

查询构建

第三,考虑您的任何数据源是否需要特定的查询格式。许多结构化数据库使用SQL。向量存储通常具有特定的语法,用于对文档元数据应用关键字过滤器。使用LLM将自然语言查询转换为查询语法是一种流行且强大的方法。 特别是,文本到SQL、文本到Cypher和元数据过滤的查询分析分别是与结构化、图形和向量数据库交互的有用方式。

https://i-blog.csdnimg.cn/direct/92646b14b5104861bbcbc0b2779251c6.png

索引

第四,考虑文档索引的设计。一个简单而强大的想法是将用于检索的文档与用于生成的文档解耦。 索引通常使用嵌入模型和向量存储,这些模型将文档中的语义信息压缩为固定大小的向量。

许多RAG方法专注于将文档拆分为块,并根据与输入问题的相似性检索一些块供大型语言模型使用。但是,块大小和块数量可能难以设置,并且如果它们未能为大型语言模型提供完整的上下文以回答问题,则会影响结果。此外,大型语言模型越来越能够处理数百万个标记。

有两种方法可以解决这种紧张关系:(1) 多向量 检索器使用大型语言模型将文档翻译成任何适合索引的形式(例如,通常是摘要),但将完整文档返回给大型语言模型以生成答案。(2) 父文档 检索器嵌入文档块,但也返回完整文档。这个想法是兼顾两者的优点:使用简洁的表示(摘要或块)进行检索,但使用完整文档进行答案生成。

改善相似性搜索本身的质量

第五,考虑改善相似性搜索本身的质量。嵌入模型将文本压缩为固定长度(向量)表示,捕捉文档的语义内容。这种压缩对于搜索/检索是有用的,但对单个向量表示施加了沉重的负担,以捕捉文档的语义细微差别/细节。在某些情况下,无关或冗余的内容可能会稀释嵌入的语义有效性。

还有一些额外的技巧可以提高检索的质量。嵌入在捕捉语义信息方面表现出色,但在基于关键字的查询中可能会遇到困难。许多 向量存储 提供内置的 混合搜索 来结合关键字和语义相似性,结合了两种方法的优点。此外,许多向量存储具有 最大边际相关性,旨在多样化搜索结果,以避免返回相似和冗余的文档。

后处理

第六,考虑过滤或排名检索到的文档的方法。如果您正在 结合来自多个来源返回的文档,这非常有用,因为它可以降低不相关文档的排名和/或 压缩相似文档。

https://i-blog.csdnimg.cn/direct/072057d387654afe9025b955b7b8cf7e.png

生成

最后,考虑将自我纠正构建到您的RAG系统中。 RAG系统可能会遭受低质量检索(例如,如果用户问题超出了索引的领域)和/或生成中的幻觉。一个简单的检索-生成管道无法检测或自我纠正这些类型的错误。[

我们发现图形是可靠表达逻辑流程的好方法,并已从几篇论文中实现了这些想法使用LangGraph,如下图所示(红色 - 路由,蓝色 - 回退,绿色 - 自我纠正):

  • 路由: 自适应RAG。将问题路由到不同的检索方法
  • 回退: 纠正性RAG。 如果文档与查询不相关,则回退到网络搜索
  • 自我纠正: 自我RAG。 修正带有幻觉的答案或未解决的问题

文本分割

LangChain 提供多种不同类型的 文本分割器。 这些都位于 langchain-text-splitters 包中。

https://i-blog.csdnimg.cn/direct/75a71d0c391c455998458dcfd3bf9972.png

https://i-blog.csdnimg.cn/direct/e51f9c5b8412459da26093af4897e2dc.png

案例

复杂的问答(Q&A)聊天机器人。应用程序可以回答有关特定源信息的问题。使用一种称为检索增强生成(RAG)的技术

实现思路:

1.加载:首先,我们需要加载数据。这是通过DocumentLoaders完成的。

2.分割:Text splitters将大型文档分割成更小的块。这对于索引数据和将其传递给模型很有用,因为大块数据更难搜索,并且不适合模型的有限上下文窗口

3.存储:我们需要一个地方来存储和索引我们的分割,以便以后可以搜索。这通常使用VectorStore和Embeddings模型完成

4.检索:给定用户输入,使用检索器从存储中检索相关分割

5.生成:ChatModel / LLM使用包括问题和检索到的数据的提示生成答案

案例1

实现一个简单的RAG


import os
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.history_aware_retriever import create_history_aware_retriever
from langchain.chains.retrieval import create_retrieval_chain
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.document_loaders import WebBaseLoader
import bs4
from langchain_community.embeddings import ZhipuAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain_community.chat_message_histories import ChatMessageHistory

# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20f---dKxlr"
# 初始化智普 AI 模型
llm = ChatZhipuAI()

# 加载数据
loader = WebBaseLoader(
    web_path=["https://blog.csdn.net/SO_zxn/article/details/145756382"],
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(class_=("article-title-box", "article-info-box", "toc"))
    )
)
docs = loader.load()

# 文本切割
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = splitter.split_documents(docs)

embeddings = ZhipuAIEmbeddings(api_key="5eb20--NRdKxlr")

# 存储
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

# 检索器
retriever = vectorstore.as_retriever()

# 创建一个问答模版

system_prompt = """你是一个机器人助手,请你从给定的内容{context}搜索结果。
能回答的回答,无法回答的你回复:对不起,我不知道!
"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        #    MessagesPlaceholder("chat_history"),  # 提问的历史记录
        ("human", "{input}"),
    ]
)

chain1 = create_stuff_documents_chain(llm, prompt)
chain2 = create_retrieval_chain(retriever, chain1)
rest = chain2.invoke({"input": "python有哪些容器"})
print(rest)
print(rest['answer'])

结果:


E:\learn_work_spaces\PythonProject1venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\RAG\demo1.py 
USER_AGENT environment variable not set, consider setting it to identify your requests.
Number of requested results 4 is greater than number of elements in index 1, updating n_results = 1
{'input': 'python有哪些容器', 'context': [Document(metadata={'source': 'https://blog.csdn.net/SO_zxn/article/details/145756382'}, page_content='python数据容器\n\n最新推荐文章于\xa02025-03-14 20:48:21\xa0发布\n\n\n\n小码农0912\n\n最新推荐文章于\xa02025-03-14 20:48:21\xa0发布\n\n\n阅读量842\n\n\n\n收藏\n\n                              28\n                          \n\n\n\n\n点赞数\n                            22\n                        \n\n\n\n\n\n\n分类专栏:\npython\n文章标签:\npython\npython数据容器\n\n\n\n\n\n                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。\n                        \n\n                            本文链接:https://blog.csdn.net/SO_zxn/article/details/145756382\n\n\n\n\n版权\n\n\n文章目录\n定义注意\n列表语法案例列表的下表索引注意案例\n列表的方法查询修改插入追加一个元素追加多个元素删除删除某元素在列表中的第一个匹配项清空列表内容统计某元素在列表内的数量统计列表内,有多少元素列表方法汇总特点双重遍历案例\n\n元组概要语法元组的方法注意\n元组特点\n字符串概要字符串常用方法替换字符串的分割字符串的规整操作(去前后空格)字符串的规整操作(去前后指定字符串)统计字符串中某字符串的出现次数统计字符串的长度方法汇总\n特点\n容器序列切片概要语法案例\n集合概要语法常见方法添加新元素移除元素从集合中随机取出元素清空集合取出2个集合的差集消除2个集合的差集2个集合合并查看集合的元素数量\n方法汇总特点\n字典定义语法字典的嵌套常用方法获取新增元素更新元素删除元素清空字典获取全部的key遍历字典计算字典内的全部元素(键值对)数量\n方法汇总特点\n容器对比分类对比应用场景容器通用功能')], 'answer': 'Python中内置了多种数据容器类型,可以用来存储不同种类的数据。以下是Python中常见的数据容器:\n\n1. **列表(List)** - 序列类型,可以存储不同类型的元素,元素可以修改。\n   - 例子:`my_list = [1, 2, \'a\', \'b\']`\n\n2. **元组(Tuple)** - 不可变的序列类型,一旦创建就不能修改,可以存储不同类型的元素。\n   - 例子:`my_tuple = (1, 2, \'a\', \'b\')`\n\n3. **字符串(String)** - 序列类型,用于存储字符,不可变。\n   - 例子:`my_string = "Hello, World"`\n\n4. **集合(Set)** - 无序集,元素必须是唯一的,可以进行数学上的集合运算。\n   - 例子:`my_set = {1, 2, 3}`\n\n5. **字典(Dictionary)** - 键值对集合,键必须是唯一的,键和值可以是不同类型。\n   - 例子:`my_dict = {\'name\': \'John\', \'age\': 30}`\n\n对于您提供的内容,以下是可以回答的部分:\n\n- **列表(List)** - 你的文章提到了列表的语法、案例、索引、方法以及特点等。\n- **元组(Tuple)** - 文章提到了元组的语法、方法、特点等。\n- **字符串(String)** - 文章中涉及了字符串的常用方法、操作、统计长度等。\n- **容器序列切片** - 这是指各种序列类型(如列表、元组、字符串)的切片操作。\n- **集合(Set)** - 你提到了集合的语法、常见方法以及特点。\n- **字典(Dictionary)** - 文章包含字典的定义、语法、方法以及特点。\n\n对于文章中具体的操作和细节,如果需要进一步的信息或解释,你可以提供更具体的问题。\n\n对不起,我不知道的内容:\n如果在你的文章中包含了关于这些容器的高级用法或特定案例的细节,我没有足够的信息来回答那些具体的问题。如果需要,请提供具体的查询或问题,我会尽力帮助解答。'}
Python中内置了多种数据容器类型,可以用来存储不同种类的数据。以下是Python中常见的数据容器:

1. **列表(List)** - 序列类型,可以存储不同类型的元素,元素可以修改。
   - 例子:`my_list = [1, 2, 'a', 'b']`

2. **元组(Tuple)** - 不可变的序列类型,一旦创建就不能修改,可以存储不同类型的元素。
   - 例子:`my_tuple = (1, 2, 'a', 'b')`

3. **字符串(String)** - 序列类型,用于存储字符,不可变。
   - 例子:`my_string = "Hello, World"`

4. **集合(Set)** - 无序集,元素必须是唯一的,可以进行数学上的集合运算。
   - 例子:`my_set = {1, 2, 3}`

5. **字典(Dictionary)** - 键值对集合,键必须是唯一的,键和值可以是不同类型。
   - 例子:`my_dict = {'name': 'John', 'age': 30}`

对于您提供的内容,以下是可以回答的部分:

- **列表(List)** - 你的文章提到了列表的语法、案例、索引、方法以及特点等。
- **元组(Tuple)** - 文章提到了元组的语法、方法、特点等。
- **字符串(String)** - 文章中涉及了字符串的常用方法、操作、统计长度等。
- **容器序列切片** - 这是指各种序列类型(如列表、元组、字符串)的切片操作。
- **集合(Set)** - 你提到了集合的语法、常见方法以及特点。
- **字典(Dictionary)** - 文章包含字典的定义、语法、方法以及特点。

对于文章中具体的操作和细节,如果需要进一步的信息或解释,你可以提供更具体的问题。

对不起,我不知道的内容:
如果在你的文章中包含了关于这些容器的高级用法或特定案例的细节,我没有足够的信息来回答那些具体的问题。如果需要,请提供具体的查询或问题,我会尽力帮助解答。

进程已结束,退出代码为 0

案例2

在案例1的基础上加上历史记录



import os

import bs4
from langchain.chains.combine_documents import create_stuff_documents_chain
from langchain.chains.history_aware_retriever import create_history_aware_retriever
from langchain.chains.retrieval import create_retrieval_chain
from langchain_community.chat_message_histories import ChatMessageHistory
from langchain_community.chat_models import ChatZhipuAI
from langchain_community.document_loaders import WebBaseLoader
from langchain_community.embeddings import ZhipuAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder
from langchain_core.runnables import RunnableWithMessageHistory
from langchain_text_splitters import RecursiveCharacterTextSplitter

# 设置智普 AI 的 API 密钥
os.environ["ZHIPUAI_API_KEY"] = "5eb20---dKxlr"
# 初始化智普 AI 模型
llm = ChatZhipuAI()

# 加载数据
loader = WebBaseLoader(
    web_path=["https://blog.csdn.net/SO_zxn/article/details/145756382"],
    bs_kwargs=dict(
        parse_only=bs4.SoupStrainer(class_=("article-title-box", "article-info-box", "toc"))
    )
)
docs = loader.load()

# 文本切割
splitter = RecursiveCharacterTextSplitter(chunk_size=1000, chunk_overlap=200)
splits = splitter.split_documents(docs)

embeddings = ZhipuAIEmbeddings(api_key="5eb20--dKxlr")

# 存储
vectorstore = Chroma.from_documents(documents=splits, embedding=embeddings)

# 检索器
retriever = vectorstore.as_retriever()

# 创建一个问答模版

system_prompt = """你是一个机器人助手,请你从给定的内容{context}搜索结果。
能回答的回答,无法回答的你回复:对不起,我不知道!
"""
prompt = ChatPromptTemplate.from_messages(
    [
        ("system", system_prompt),
        #    MessagesPlaceholder("chat_history"),  # 提问的历史记录
        ("human", "{input}"),
    ]
)

chain1 = create_stuff_documents_chain(llm, prompt)

# 创建一个子链的提示模版
c_q_system_prompt = """
在回答问题时请结合聊天记录进行回答
"""
retriever_history_temp = ChatPromptTemplate.from_messages(
    [
        ("system", c_q_system_prompt),
        MessagesPlaceholder('chat_history'),
        ("human", "{input}"),
    ]
)

# 创建子链
history_chain = create_history_aware_retriever(llm, retriever, retriever_history_temp)

# 保存历史记录
store = {}


def get_session_history(session_id: str):
    if session_id not in store:
        store[session_id] = ChatMessageHistory()
    return store[session_id]


# 创建父chain
chain = create_retrieval_chain(history_chain, chain1)

rest_chain = RunnableWithMessageHistory(
    chain,
    get_session_history,
    input_messages_key='input',
    history_messages_key='chat_history',
    output_messages_key='answer'
)

# 第一轮对话
rest1 = rest_chain.invoke(
    {'input': 'python中有哪些容器类'},
    config={'configurable': {'session_id': 'zzz123'}}
)
print(rest1)
print(rest1['answer'])

print('==========================')
# 第2轮对话
rest2 = rest_chain.invoke(
    {'input': 'List中有哪些方法'},
    config={'configurable': {'session_id': 'zzz123'}}
)
print(rest2)
print(rest2['answer'])

结果:


E:\learn_work_spaces\PythonProject1venv\Scripts\python.exe E:\learn_work_spaces\PythonProject1\RAG\RAG.py 
USER_AGENT environment variable not set, consider setting it to identify your requests.
Number of requested results 4 is greater than number of elements in index 1, updating n_results = 1
{'input': 'python中有哪些容器类', 'chat_history': [], 'context': [Document(metadata={'source': 'https://blog.csdn.net/SO_zxn/article/details/145756382'}, page_content='python数据容器\n\n最新推荐文章于\xa02025-03-14 20:48:21\xa0发布\n\n\n\n小码农0912\n\n最新推荐文章于\xa02025-03-14 20:48:21\xa0发布\n\n\n阅读量843\n\n\n\n收藏\n\n                              28\n                          \n\n\n\n\n点赞数\n                            22\n                        \n\n\n\n\n\n\n分类专栏:\npython\n文章标签:\npython\npython数据容器\n\n\n\n\n\n                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。\n                        \n\n                            本文链接:https://blog.csdn.net/SO_zxn/article/details/145756382\n\n\n\n\n版权\n\n\n文章目录\n定义注意\n列表语法案例列表的下表索引注意案例\n列表的方法查询修改插入追加一个元素追加多个元素删除删除某元素在列表中的第一个匹配项清空列表内容统计某元素在列表内的数量统计列表内,有多少元素列表方法汇总特点双重遍历案例\n\n元组概要语法元组的方法注意\n元组特点\n字符串概要字符串常用方法替换字符串的分割字符串的规整操作(去前后空格)字符串的规整操作(去前后指定字符串)统计字符串中某字符串的出现次数统计字符串的长度方法汇总\n特点\n容器序列切片概要语法案例\n集合概要语法常见方法添加新元素移除元素从集合中随机取出元素清空集合取出2个集合的差集消除2个集合的差集2个集合合并查看集合的元素数量\n方法汇总特点\n字典定义语法字典的嵌套常用方法获取新增元素更新元素删除元素清空字典获取全部的key遍历字典计算字典内的全部元素(键值对)数量\n方法汇总特点\n容器对比分类对比应用场景容器通用功能')], 'answer': '在Python中,常见的容器类包括以下几种:\n\n1. 列表(List)\n   - 列表是Python中最常用的数据容器之一,可以存储各种类型的元素,包括数字、字符串等,且列表是可变(mutable)的,即可以修改其内容。\n\n2. 元组(Tuple)\n   - 元组与列表类似,可以存储不同类型的元素,但元组是不可变(immutable)的,一旦创建便不能修改其内容。\n\n3. 字符串(String)\n   - 字符串也可以看作是一种容器,因为它可以包含多个字符,尽管它主要用于文本处理。\n\n4. 集合(Set)\n   - 集合是一个无序的,不包含重复元素的数据容器。在Python中,集合用于包含唯一的元素,并提供了诸如并集、交集等操作。\n\n5. 字典(Dictionary)\n   - 字典是一个键值对的集合,每个键对应一个值,键必须是唯一的,而值可以是任何类型的数据。\n\n这些容器的特点和应用场景各不相同,可以根据具体需求选择合适的数据容器。'}
在Python中,常见的容器类包括以下几种:

1. 列表(List)
   - 列表是Python中最常用的数据容器之一,可以存储各种类型的元素,包括数字、字符串等,且列表是可变(mutable)的,即可以修改其内容。

2. 元组(Tuple)
   - 元组与列表类似,可以存储不同类型的元素,但元组是不可变(immutable)的,一旦创建便不能修改其内容。

3. 字符串(String)
   - 字符串也可以看作是一种容器,因为它可以包含多个字符,尽管它主要用于文本处理。

4. 集合(Set)
   - 集合是一个无序的,不包含重复元素的数据容器。在Python中,集合用于包含唯一的元素,并提供了诸如并集、交集等操作。

5. 字典(Dictionary)
   - 字典是一个键值对的集合,每个键对应一个值,键必须是唯一的,而值可以是任何类型的数据。

这些容器的特点和应用场景各不相同,可以根据具体需求选择合适的数据容器。
==========================
Number of requested results 4 is greater than number of elements in index 1, updating n_results = 1
{'input': 'List中有哪些方法', 'chat_history': [HumanMessage(content='python中有哪些容器类', additional_kwargs={}, response_metadata={}), AIMessage(content='在Python中,常见的容器类包括以下几种:\n\n1. 列表(List)\n   - 列表是Python中最常用的数据容器之一,可以存储各种类型的元素,包括数字、字符串等,且列表是可变(mutable)的,即可以修改其内容。\n\n2. 元组(Tuple)\n   - 元组与列表类似,可以存储不同类型的元素,但元组是不可变(immutable)的,一旦创建便不能修改其内容。\n\n3. 字符串(String)\n   - 字符串也可以看作是一种容器,因为它可以包含多个字符,尽管它主要用于文本处理。\n\n4. 集合(Set)\n   - 集合是一个无序的,不包含重复元素的数据容器。在Python中,集合用于包含唯一的元素,并提供了诸如并集、交集等操作。\n\n5. 字典(Dictionary)\n   - 字典是一个键值对的集合,每个键对应一个值,键必须是唯一的,而值可以是任何类型的数据。\n\n这些容器的特点和应用场景各不相同,可以根据具体需求选择合适的数据容器。', additional_kwargs={}, response_metadata={})], 'context': [Document(metadata={'source': 'https://blog.csdn.net/SO_zxn/article/details/145756382'}, page_content='python数据容器\n\n最新推荐文章于\xa02025-03-14 20:48:21\xa0发布\n\n\n\n小码农0912\n\n最新推荐文章于\xa02025-03-14 20:48:21\xa0发布\n\n\n阅读量843\n\n\n\n收藏\n\n                              28\n                          \n\n\n\n\n点赞数\n                            22\n                        \n\n\n\n\n\n\n分类专栏:\npython\n文章标签:\npython\npython数据容器\n\n\n\n\n\n                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。\n                        \n\n                            本文链接:https://blog.csdn.net/SO_zxn/article/details/145756382\n\n\n\n\n版权\n\n\n文章目录\n定义注意\n列表语法案例列表的下表索引注意案例\n列表的方法查询修改插入追加一个元素追加多个元素删除删除某元素在列表中的第一个匹配项清空列表内容统计某元素在列表内的数量统计列表内,有多少元素列表方法汇总特点双重遍历案例\n\n元组概要语法元组的方法注意\n元组特点\n字符串概要字符串常用方法替换字符串的分割字符串的规整操作(去前后空格)字符串的规整操作(去前后指定字符串)统计字符串中某字符串的出现次数统计字符串的长度方法汇总\n特点\n容器序列切片概要语法案例\n集合概要语法常见方法添加新元素移除元素从集合中随机取出元素清空集合取出2个集合的差集消除2个集合的差集2个集合合并查看集合的元素数量\n方法汇总特点\n字典定义语法字典的嵌套常用方法获取新增元素更新元素删除元素清空字典获取全部的key遍历字典计算字典内的全部元素(键值对)数量\n方法汇总特点\n容器对比分类对比应用场景容器通用功能')], 'answer': 'List(列表)是Python中内置的一种数据容器,它支持多种方法来进行列表的查询、修改、插入和删除等操作。以下是列表的一些常用方法:\n\n1. **查询**\n   - `list.index(x[, start[, end]])`: 返回列表中第一个匹配项的索引。\n   - `list.count(x)`: 返回元素x在列表中出现的次数。\n\n2. **修改**\n   - `list.append(x)`: 在列表末尾添加一个元素x。\n   - `list.insert(i, x)`: 在位置i插入元素x。\n   - `list.remove(x)`: 移除列表中第一个匹配项。\n   - `list.pop([i])`: 删除列表中的一个元素(默认为最后一个),并返回该元素的值。\n   - `list.clear()`: 清空列表的所有元素。\n\n3. **排序**\n   - `list.sort(key=None, reverse=False)`: 对列表进行原地排序(无返回值)。\n   - `list.reverse()`: 反转列表中元素的顺序。\n\n4. **扩展**\n   - `list.extend(iterable)`: 将可迭代对象(如列表、元组等)的所有元素添加到列表中。\n\n5. **访问**\n   - `list[i]`: 通过索引访问列表元素。\n\n以下是列表方法的汇总:\n\n- `append()`\n- `clear()`\n- `copy()`: 创建列表的浅拷贝。\n- `count()`\n- `extend()`\n- `index()`\n- `insert()`\n- `pop()`\n- `remove()`\n- `reverse()`\n- `sort()`\n\n使用这些方法可以高效地操作列表,以适应不同的编程需求。'}
List(列表)是Python中内置的一种数据容器,它支持多种方法来进行列表的查询、修改、插入和删除等操作。以下是列表的一些常用方法:

1. **查询**
   - `list.index(x[, start[, end]])`: 返回列表中第一个匹配项的索引。
   - `list.count(x)`: 返回元素x在列表中出现的次数。

2. **修改**
   - `list.append(x)`: 在列表末尾添加一个元素x。
   - `list.insert(i, x)`: 在位置i插入元素x。
   - `list.remove(x)`: 移除列表中第一个匹配项。
   - `list.pop([i])`: 删除列表中的一个元素(默认为最后一个),并返回该元素的值。
   - `list.clear()`: 清空列表的所有元素。

3. **排序**
   - `list.sort(key=None, reverse=False)`: 对列表进行原地排序(无返回值)。
   - `list.reverse()`: 反转列表中元素的顺序。

4. **扩展**
   - `list.extend(iterable)`: 将可迭代对象(如列表、元组等)的所有元素添加到列表中。

5. **访问**
   - `list[i]`: 通过索引访问列表元素。

以下是列表方法的汇总:

- `append()`
- `clear()`
- `copy()`: 创建列表的浅拷贝。
- `count()`
- `extend()`
- `index()`
- `insert()`
- `pop()`
- `remove()`
- `reverse()`
- `sort()`

使用这些方法可以高效地操作列表,以适应不同的编程需求。

进程已结束,退出代码为 0