本文主要是新手小白在学习过程中对代码的理解,如有不足之处,欢迎指正!
易速鲜花聊天机器人项目(23 24)
1、设置DoubaoEmbedding类:
主要功能:设置一种文本转换为向量的方法
class DoubaoEmbeddings(BaseModel, Embeddings):
定义方法_init_
用于初始化DoubaoEmbedding类,OPENAI_BASE_URL 和 OPENAI_API_KEY 是两个环境变量,它们分别代表了OpenAI API的基础URL和API密钥。
-
OPENAI_BASE_URL:这是OpenAI API的基本URL,它指向OpenAI服务的端点。 -
OPENAI_API_KEY:这是您的OpenAI API密钥,它是一个字符串,用于验证身份,以便您可以访问OpenAI的服务。
def __init__(self, **data: Any):
定义方法embed_query
将输入text转化为embedding浮点数值向量,以便插入向量数据库。
def embed_query(self, text: str) -> List[float]:
embeddings = self.client.embeddings.create(model=self.model, input=text)
return embeddings.data[0].embedding
- 将文本test转化为embedings类型
- embeddeds.data是一个列表,但是由于只调用一次方法,列表只有一个元素,仅需访问data[0]
- 返回data的embedding属性
定义方法embed_documents
多文本输入向量数据库。
def embed_documents(self, texts: List[str]) -> List[List[float]]:
Class Config
创建实例时可传递任意类型参数,使其更加灵活。
class Config:
arbitrary_types_allowed = True
2、创建ChatbotWithRetrieval类
汇总:向量数据库、llm、memory、检索器链、UI界面方法
class ChatbotWithRetrieval:
定义方法_init_初始化函数
步骤1:文件的处理与向量数据库
① 从文件路径中提取文件。
def __init__(self, dir):
# 加载Documents
base_dir = dir # 文档的存放目录
documents = []
② 文本分割
text_splitter = RecursiveCharacterTextSplitter(chunk_size=200, chunk_overlap=0)
all_splits = text_splitter.split_documents(documents)
③ 生成向量数据库,并嵌入文档
向量数据库的建立:
- 分块后的文档
- embedding(文本转换向量的方法)
self.vectorstore = Qdrant.from_documents(
documents
embedding=DoubaoEmbeddings(
model=os.environ["EMBEDDING_MODELEND"],
), # 用OpenAI的Embedding Model做嵌入
location # in-memory 存储
collection_name # 指定collection_name
location 和 collection_name 是用于配置 Qdrant 向量数据库的参数。
location: 这个参数指定了 Qdrant 数据库的存储位置。location被设置为":memory:",这意味着数据库将被存储在内存中,而不是持久化到磁盘上。collection_name: 这个参数指定了在 Qdrant 数据库中创建的集合(collection)的名称。集合是 Qdrant 中用于组织和存储向量数据的逻辑单元。collection_name被设置为"my_documents",这意味着所有的文档嵌入向量将被存储在一个名为 "my_documents" 的集合中。
位置和文件名+附加方式:这两个参数共同定义了 Qdrant 数据库的存储位置和组织方式。
步骤2:llm
self.llm = ChatOpenAI(
model=os.environ["LLM_MODELEND"],
temperature=0,
)
步骤3:memory
self.memory = ConversationSummaryMemory(
llm=self.llm, memory_key="chat_history"
return_messages=True
)
memory_key="chat_history" 是 ConversationSummaryMemory 类的一个参数,它定义了在对话历史中用于存储和检索信息的键。这个键用于标识存储对话历史的特定部分,以便在需要时可以访问和使用这些信息。
键被设置为 "chat_history",这意味着对话历史将被存储在一个名为 "chat_history" 的变量或数据结构中。
步骤4:检索器链Retrieval Chain
创建检索器retriever。
retriever = self.vectorstore.as_retriever()
- 检索器的依据是向量数据库
vectorstore
创建一个对话检索链Conversational Retrieval Chain
self.qa = ConversationalRetrievalChain.from_llm(
self.llm, retriever=retriever, memory=self.memory
)
self.llm:语言模型,负责生成文本回复。retriever:检索器,负责从向量数据库中检索与用户输入相关的文档或信息。memory=self.memory:对话历史存储方式ConversationSummaryMemory
步骤5:UI界面
为 Gradio 创建的新函数,用于展示UI界面
def get_response(self, user_input): # 这是为 Gradio 创建的新函数
1、回答用户的问题:
response = self.qa(user_input)
- 因为
self.qa方法是通过ConversationalRetrievalChain实现的,需要传入user_input。
2、存储并展示展示历史对话:
# 更新对话历史
self.conversation_history += (
f"你: {user_input}\nChatbot: {response['answer']}\n"
)
return self.conversation_history
conversation_history需要在前面初始化,本文省略叙述。
3、主函数
if __name__ == "__main__":
folder = "OneFlower"
bot = ChatbotWithRetrieval(folder)
- 其中,
OneFlower为待输入的文件
定义 Gradio 界面
interface = gr.Interface(
fn=bot.get_response,
inputs="text",
outputs="text",
live=False,
title="易速鲜花智能客服",
description="请输入问题,然后点击提交。",
)
- fn:使用
ChatbotWithRetrieval类的UI界面函数,保证程序响应运行。 - inputs:输入是文本
- outputs:输出也是文本
- live=False:实时更新,这样用户可以连续与模型交互
- title:界面标题
- description:描述
启动 Gradio 界面
interface.launch(share=True)
总结——AI练中学、AI刷题
AI练中学和AI刷题是两种利用人工智能技术来辅助和促进学习过程的方法,本次青训营学习让体会到这种学习方式的先进性。
AI练中学,是一个专注于解决学习新语言或框架时繁琐环境搭建与低效学习问题的产品。它利用专业的IDE激活课程,为我们提供了一个开箱即用的代码环境,极大地缩短了学习准备时间。在学习过程中,AI助教的无缝嵌入让学习者在遇到问题时能够即时获得解答,无需跳出课程进行搜索比对。这种沉浸式的学习体验,让我们能够更加专注于学习本身,从而实现了学习效率的翻倍提升。
AI刷题是一个针对刷题这一编程学习刚需场景而设计的工具。它结合了强大的AI能力和全功能的代码编辑器,为我们提供了从读题、解题到诊断错误的全方位支持。AI刷题功能能够根据我们的技术水平和学习进度,智能推荐适合的题目,确保每一次练习都能带来实质性的提升。在解题过程中,AI还会提供算法与实现思路的引导,帮助我们深入理解算法背后的原理。当代码运行出错时,AI能迅速定位问题,并给出详细的解决建议。此外,marscode平台还拥有近千道题库,这为我们提供了丰富的练习资源。
AI练中学和AI刷题都是利用人工智能技术来优化学习过程的创新工具。它们通过提供个性化的学习资源和练习题目,帮助学习者更加高效、精准地掌握编程知识和技能,提升学习效果。这两种工具都将成为我们在编程学习道路上的得力助手。