当前位置: 首页 > article >正文

【LLM】Langchain+RAG大模型学习笔记

目录

Langchain介绍

Langchain基本使用

1. 调用 LLM(LLM Call)

2. 提示模板(Prompt Templates)

3. 保存历史对话(Conversation History)

4. 集成现有工具(Tool Integration)

5. 调用 Agent(Agent Call)

6. 构建和使用 Storage(Storage)

RAG

1.RAG 的工作原理

2.RAG 的优势

3.RAG 的典型应用场景

4.RAG 的工作流程

5.LangChain 中的 RAG 实现


Langchain介绍

LangChain 是一个用于构建基于语言模型应用的开源框架,它帮助开发者将大语言模型(如 OpenAI 的 GPT)与外部数据源、工具、数据库、API 等集成,从而构建更为复杂、智能和实用的应用。

LangChain 的核心功能包括:

  1. 链式调用(Chains):将多个操作或模型调用按顺序链接在一起。开发者可以组合语言模型与其他工具(如数据库、API 或外部应用程序),以实现更复杂的任务。

  2. 代理(Agents):LangChain 允许创建智能代理,代理可以根据特定的任务或输入条件动态地选择和调用不同的工具或模型。这使得开发者能够构建能够自动执行多步骤决策的智能系统。

  3. 记忆(Memory):LangChain 支持在交互中保持对话的上下文或状态(例如用户输入的历史信息),从而让系统能够进行更智能的对话或任务处理。

  4. 文档处理(Document Loaders and Retrievers):它可以帮助从各种格式的文档(如文本、PDF、网页等)中加载信息,并将其与模型的推理过程结合,进行信息检索和分析。

  5. 支持多种语言模型:LangChain 不仅支持 OpenAI 的 GPT,还可以与其他多个大语言模型提供商(如 Hugging Face、Anthropic 等)兼容,提供更多灵活性。

Langchain基本使用

1. 调用 LLM(LLM Call)

LangChain 使得对大语言模型(LLM)的调用变得简洁。你可以直接初始化一个 LLM 实例(例如 OpenAI 的 GPT 模型),并向其发送文本以生成响应。

from langchain.llms import OpenAI

# Initialize OpenAI model
llm = OpenAI(temperature=0.7)

# Call the model with a prompt
response = llm("What is LangChain?")
print(response)
  • OpenAI(temperature=0.7):初始化一个 OpenAI 模型实例,temperature 参数控制生成文本的创造性,值越低越确定,值越高则更具多样性。
  • llm("What is LangChain?"):将输入文本传递给模型并获取响应。

2. 提示模板(Prompt Templates)

提示模板(PromptTemplate)用于动态构建带有变量的提示。通过模板,你可以设置固定的结构,并将动态的输入替换到指定位置。

from langchain.prompts import PromptTemplate

# Define a prompt template with system and human parts
template = """
System: You are a helpful assistant that provides solutions to user queries.
Human: {user_input}
"""

# Create a prompt template
prompt = PromptTemplate(input_variables=["user_input"], template=template)

# Format the prompt with user input
formatted_prompt = prompt.format(user_input="What is LangChain?")
print(formatted_prompt)
  • PromptTemplate:定义了一个包含 systemhuman 部分的提示模板。
  • formatted_prompt = prompt.format(user_input="What is LangChain?"):根据用户的输入动态填充模板。

3. 保存历史对话(Conversation History)

LangChain 提供了 记忆(memory)功能,可以保存对话历史,便于多轮对话中模型使用上下文信息。你可以通过 ConversationBufferMemory 保存对话,并通过 memory_key 来管理历史对话。

from langchain.memory import ConversationBufferMemory
from langchain.llms import OpenAI
from langchain.chains import ConversationChain

# Initialize the OpenAI model and memory
llm = OpenAI(temperature=0.7)
memory = ConversationBufferMemory(memory_key="chat_history")

# Create a conversation chain with memory
conversation = ConversationChain(llm=llm, memory=memory)

# Simulate conversation
response_1 = conversation.predict(input="How are you today?")
print(response_1)

response_2 = conversation.predict(input="What about you?")
print(response_2)

# View conversation history
print("Conversation History:", memory.load_memory_variables({}))
  • ConversationBufferMemory(memory_key="chat_history"):通过唯一的 key 保存对话历史。
  • memory.load_memory_variables({}):查看当前存储的对话历史。

4. 集成现有工具(Tool Integration)

LangChain 允许你集成外部工具(如 Web 搜索、API 调用等)。例如,你可以集成现有的 DuckDuckGo 搜索工具来进行搜索。

from langchain.agents import initialize_agent
from langchain.llms import OpenAI
from langchain.agents import AgentType
from langchain.tools import DuckDuckGoSearchResults

# Initialize the DuckDuckGo search tool
search = DuckDuckGoSearchResults()

# Initialize the OpenAI model
llm = OpenAI(temperature=0.7)

# Initialize agent with the search tool
agent = initialize_agent([search], llm, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# Use the agent to perform a search
response = agent.run("What is LangChain?")
print(response)

  • DuckDuckGoSearchResults():初始化现有的 DuckDuckGo 搜索工具。
  • initialize_agent([search], llm, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION):初始化一个代理,结合 LLM 和外部工具(如搜索工具),可以处理不同的任务。

5. 调用 Agent(Agent Call)

代理(Agent)是一个高级功能,它能够基于任务动态选择合适的工具进行执行。可以通过初始化代理并将工具与 LLM 结合,自动完成任务。

from langchain.agents import initialize_agent
from langchain.llms import OpenAI
from langchain.agents import AgentType
from langchain.tools import DuckDuckGoSearchResults

# Initialize the DuckDuckGo search tool
search = DuckDuckGoSearchResults()

# Initialize the OpenAI model
llm = OpenAI(temperature=0.7)

# Initialize agent
agent = initialize_agent([search], llm, agent_type=AgentType.ZERO_SHOT_REACT_DESCRIPTION, verbose=True)

# Use the agent to perform a task
response = agent.run("What is LangChain?")
print(response)

  • 代理使用 initialize_agent 初始化,并结合多个工具来自动选择合适的工具执行任务。

6. 构建和使用 Storage(Storage)

LangChain 支持使用向量数据库存储数据,Chroma 是一个常见的存储解决方案,用于存储和查询文本嵌入。可以通过 Chroma 向量存储进行文本嵌入存储与相似度搜索。

from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.llms import OpenAI

# Initialize OpenAI embeddings
embeddings = OpenAIEmbeddings()

# Initialize Chroma vector store
chroma_store = Chroma.from_texts(["This is an example text"], embeddings)

# Add new text data to Chroma store
chroma_store.add_texts(["This is new text data"])

# Perform similarity search
results = chroma_store.similarity_search("text", k=1)
print(results)

  • Chroma.from_texts(["This is an example text"], embeddings):初始化 Chroma 向量数据库,并将文本嵌入数据存储。
  • chroma_store.similarity_search("text", k=1):在存储的文本数据中执行相似性搜索,查找与查询文本最相似的内容。

RAG

RAG(Retrieval-Augmented Generation) 是一种增强生成模型的技术,通过将外部信息检索(retrieval)与生成模型(generation)结合,使得生成模型能够获取外部的上下文信息,从而在回答问题或生成内容时更加准确、信息丰富。RAG 在处理复杂问题、冷知识以及动态信息时尤其有用。

1.RAG 的工作原理

RAG 主要包括两个阶段:检索(Retrieval)和生成(Generation)。它结合了信息检索系统和大语言模型(LLM)来完成任务,具体工作流程如下:

  1. 检索阶段

    • 当用户提出问题或查询时,RAG 系统首先通过信息检索模块从外部知识库或文档中检索出与用户问题相关的文档、片段或信息。这些外部文档通常是预先存储的,比如企业知识库、文档数据库、网络文章等。
    • 检索过程通常通过向量数据库(如 ChromaFAISS 等)进行相似度搜索来完成,搜索结果是与用户查询最相关的文档。
  2. 生成阶段

    • 将检索到的相关文档作为上下文信息,输入到生成模型(如 GPT、T5 等)。生成模型结合这些外部信息生成最终的答案或文本。
    • 通过这种方式,生成模型不再仅仅依赖其自身的训练数据,而是能够动态地从外部知识库中获取相关信息,生成更加精确且及时的回答。

2.RAG 的优势

  1. 增强上下文知识:通过检索外部信息,生成模型能够补充其训练数据中可能缺乏的知识,尤其在回答冷知识或领域特定问题时更具优势。
  2. 提高回答准确性:生成模型可以基于最新的外部信息进行回答,因此能提供更为准确、详细的答案。
  3. 动态更新:外部文档库可以实时更新,不需要重新训练模型。系统可以随时从外部数据源获取最新的信息。
  4. 减少计算开销:传统生成模型(如 GPT)需要处理大量的知识,而 RAG 模型通过将信息检索和生成分开执行,降低了对大型模型的依赖。

3.RAG 的典型应用场景

  • 开放领域问答:例如,用户询问特定领域或时效性问题,RAG 可以检索到相关的文档或新闻,然后基于这些信息生成准确的回答。
  • 文档摘要:RAG 可以从一大段文本中提取相关段落并生成摘要。
  • 信息整合:结合多个领域的外部文档,生成综合性回答。

4.RAG 的工作流程

  1. 用户查询:用户向系统提出问题。
  2. 检索阶段:从外部文档或数据库中检索与用户查询最相关的内容。
  3. 生成阶段:将检索到的信息与用户的查询一起输入到生成模型中,生成最终的回答。

5.LangChain 中的 RAG 实现

使用 LangChain 构建一个简单的 RAG 流程,通过 Chroma 向量数据库存储文档数据,并使用 OpenAI GPT 模型来生成回答。

from langchain.llms import OpenAI
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
from langchain.chains import RetrievalQA

# Step 1: Initialize the OpenAI embeddings model
embeddings = OpenAIEmbeddings()

# Step 2: Create a list of documents (could be knowledge base or articles)
texts = [
    "LangChain is a framework for building applications with large language models.",
    "LangChain simplifies the process of connecting LLMs to other data sources and tools.",
    "With LangChain, you can perform tasks such as information retrieval, question answering, and more."
]

# Step 3: Store documents in Chroma vector store
chroma_store = Chroma.from_texts(texts, embeddings)

# Step 4: Initialize OpenAI model for text generation (temperature controls randomness)
llm = OpenAI(temperature=0.7)

# Step 5: Set up the RetrievalQA chain
retrieval_qa = RetrievalQA.from_chain_type(llm=llm, chain_type="stuff", retriever=chroma_store.as_retriever())

# Step 6: Ask a question to the RAG system
query = "What is LangChain?"
response = retrieval_qa.run(query)

# Print the response
print(response)

http://www.kler.cn/a/419475.html

相关文章:

  • 后端 Java发送邮件 JavaMail 模版 20241128测试可用
  • map用于leetcode
  • 基于协同推荐的黔醉酒业白酒销售系统
  • 相交链表和环形链表
  • Java设计模式——职责链模式:解锁高效灵活的请求处理之道
  • Rust vs Java:后端开发应该选哪个?
  • 什么是事件日志管理系统?事件日志管理系统有哪些用处?
  • Ollama离线迁移模型,不联网从一台电脑复制到另一台电脑
  • Vulnhub靶场 Matrix-Breakout: 2 Morpheus 练习
  • Ubuntu Linux操作系统
  • 语音助手利器:ChatTTS让AI语音更具情感与自然感告别机械音!
  • STL:相同Size大小的vector和list哪个占用空间多?
  • 详解:HTTP/HTTPS协议
  • 精通.NET鉴权与授权
  • 操作系统、虚拟化技术与云原生01
  • mini主机通过内网穿透做成服务器
  • MySQL技巧之跨服务器数据查询:进阶篇-从A服务器的MySQ数据库复制到B服务器的SQL Server数据库的表中
  • Linux:进程间通信之system V
  • 服务器数据恢复—服务器raid0阵列硬盘指示灯显示黄颜色的数据恢复案例
  • 3d行政区划-中国地图
  • 【Linux】线程安全与锁概念——自旋锁、读写锁
  • 三分钟快速掌握——Linux【vim】的使用及操作方法
  • Gooxi Eagle Stream 2U双路通用服务器:性能强劲 灵活扩展 稳定易用
  • 类型转换与IO流:C++世界的变形与交互之道
  • QT学习笔记-QStringList,QTimer
  • 生成树详解(STP、RSTP、MSTP)