GPT实战系列-构建本地知识库RAG的LLM Agent

GPT实战系列-构建本地知识库RAG的LLM Agent

LangChain

GPT实战系列-LangChain如何构建基通义千问的多工具链

GPT实战系列-构建多参数的自定义LangChain工具

GPT实战系列-通过Basetool构建自定义LangChain工具方法

GPT实战系列-一种构建LangChain自定义Tool工具的简单方法

GPT实战系列-搭建LangChain流程简单应用

GPT实战系列-简单聊聊LangChain搭建本地知识库准备

GPT实战系列-LangChain + ChatGLM3构建天气查询助手

GPT实战系列-大模型为我所用之借用ChatGLM3构建查询助手

GPT实战系列-简单聊聊LangChain

大模型查询工具助手之股票免费查询接口

概述

本文将介绍如何设计和实现具有LLM能力的聊天机器人。涉及到一些模块:

  • Chat Models.聊天机器人基于消息的界面,而不是raw text,需要的LangChain界面是最适合聊天模型而不是raw text的 LLM 。聊天模型具有对话语气和天生支持消息接口。
  • Prompt Templates,简化提示的过程,包括结合默认消息、用户输入、聊天记录和 (可选)额外检索。
  • Chat History,允许聊天机器人“记住”过去互动,并响应后续行动时将其考虑在内。
  • Retrievers(可选),如果需要使用特定领域的最新知识作为背景,以增强对话的响应。

如何将上述组件组合在一起,创建一个 强大的对话式聊天机器人。

初始化配置

初始化聊天模型,将作为聊天机器人的大脑:

from langchain_openai import ChatOpenAI

chat = ChatOpenAI(model="gpt-3.5-turbo-1106", temperature=0.2)

如果调用聊天模型,则输出为:AIMessage

from langchain_core.messages import HumanMessage

chat.invoke(
    [
        HumanMessage(
            content="Translate this sentence from English to French: I love programming."
        )
    ]
)
AIMessage(content="J'adore programmer.")

目前,该模型没有任何状态。

为了解决这个问题,需要将整个对话历史记录传递到模型。

from langchain_core.messages import AIMessage

chat.invoke(
    [
        HumanMessage(
            content="Translate this sentence from English to French: I love programming."
        ),
        AIMessage(content="J'adore la programmation."),
        HumanMessage(content="What did you just say?"),
    ]
)
AIMessage(content='I said "J\'adore la programmation," which means "I love programming" in French.')

这样可以看到得到了很好的有记忆的回应!

是我们想要的,具备交互能力的聊天机器人。

Prompt模板

定义提示模板,使格式设置简单些。可以 通过将链通过管道,连接到模型中来创建链:

from langchain_core.prompts import ChatPromptTemplate, MessagesPlaceholder

prompt = ChatPromptTemplate.from_messages(
    [
        (
            "system",
            "You are a helpful assistant. Answer all questions to the best of your ability.",
        ),
        MessagesPlaceholder(variable_name="messages"),
    ]
)

chain = prompt | chat

上面就是插入交谈消息,先传递到链的输入,直接进入提示,然后触发调用链:

chain.invoke(
    {
   
        "messages": [
            HumanMessage(
                content="Translate this sentence from English to French: I love programming."
            ),
            AIMessage(content="J'adore la programmation."),
            HumanMessage(content="What did you just say?"),
        ],
    }
)
AIMessage(content='I said "J\'adore la programmation," which means "I love programming" in French.')

历史消息

作为一个有记性的聊天机器人,需管理聊天记录,其快捷方法可以使用 MessageHistory 类,它是 负责保存和加载聊天消息。已经集成很多内置历史消息功能,可将消息保存到各种的数据库,这里仅仅用内存来演示。ChatMessageHistory

下面是直接使用它的示例:

from langchain.memory import ChatMessageHistory

demo_ephemeral_chat_history = ChatMessageHistory()
demo_ephemeral_chat_history.add_user_message("hi!")
demo_ephemeral_chat_history.add_ai_message("whats up?")

[HumanMessage(content='hi!'), AIMessage(content='whats up?')]

这样,我们就可以将存储的消息,作为参数直接传递到链中 :

demo_ephemeral_chat_history.add_user_message(
    "Translate this sentence from English to French: I love programming."
)

response = chain.invoke({
   "messages": demo_ephemeral_chat_history.messages})

AIMessage(content='The translation of "I love programming" in French is "J\'adore la programmation."')
demo_ephemeral_chat_history.add_ai_message(response)
demo_ephemeral_chat_history.add_user_message("What did you just say?")

chain.invoke({
   "messages": demo_ephemeral_chat_history.messages})
AIMessage(content='I said "J\'adore la programmation," which is the French translation for "I love programming."')

现在进一步结合历史信息,构建一个基本的聊天机器人!

虽然这也可以作为一个有用的聊天机器人了,但我们还想让它更厉害!就需给它连接内部知识,通过某种形式的,或简称 RAG,来获取浅的,特定领域的,很有用知识,使聊天机器人更加强大。

接下来将介绍 retrieval-augmented generation`

Retrievers

可以设置并使用 Retriever 来获得聊天机器人的特定领域知识。例如,让聊天机器人,能够回答有关LangSmith 文档的问题。你也可以让他回答别的问题。

将使用 LangSmith 文档作为源材料,并将其存储在 vectorstore 中,以供以后检索。请注意, 这个例子将跳过一些关于解析和 存储数据源。

使用文档加载器从网页中提取数据:

from langchain_community.document_loaders import WebBaseLoader

loader = WebBaseLoader("https://docs.smith.langchain.com/overview")
data = loader.load()

接下来,将其拆分为更小的块,LLM 的上下文窗口可以处理,并将其存储在向量数据库中:

from langchain_text_splitters import RecursiveCharacterTextSplitter

text_splitter = RecursiveCharacterTextSplitter(chunk_size=500, chunk_overlap=0)
all_splits = text_splitter.split_documents(data)

然后,将这些块嵌入并存储在向量数据库中:


                
### LangChainAgentRAG模式的实现与应用 #### Agent 的定义与功能 在 LangChain 中,Agent 是一种用于自动化任务处理的核心模块。它通过结合语言模型 (LLM) 和工具集来完成复杂的多步操作。Agent 可以接收用户的自然语言输入并解析成一系列动作,调用外部 API 或数据库查询等功能模块,最终返回结果给用户[^1]。 以下是创建一个简单 Agent 的代码示例: ```python from langchain.agents import initialize_agent, Tool from langchain.llms import OpenAI from langchain.tools import BaseTool class ExampleTool(BaseTool): name = "example_tool" description = "An example tool that returns a fixed response." def _run(self, query: str) -> str: return f"Response to {query}" llm = OpenAI(temperature=0) tools = [ExampleTool()] agent_chain = initialize_agent(tools, llm, agent="zero-shot-react-description", verbose=True) result = agent_chain.run("What is the capital of France?") print(result) ``` 此代码展示了如何初始化一个带有自定义工具的 Agent 并运行简单的提问任务[^2]。 #### RAG 模式的原理及其在 LangChain 中的应用 RAG(Retrieval-Augmented Generation)是一种增强型生成方法,其核心思想是将检索机制引入到文本生成过程中。具体来说,在生成回复之前先从大量文档数据集中提取最相关的片段作为上下文信息提供给 LLM 进行进一步加工[^3]。 LangChain 提供了完整的框架支持这种工作流的设计与开发。下面是一个典型的流程描述: 1. **索引建立**: 使用向量存储技术对原始资料进行编码形成可高效查找的数据结构; 2. **相似度匹配**: 当接收到新请求时,计算该问题与其他已知记录之间的距离得分找出最佳候选者集合; 3. **融合输出**: 将上述找到的内容传递至预训练好的大型语言模型里综合考虑后给出最终答复。 这里有一个利用 LangChain 构建本地知识库问答系统的实例演示: ```python from langchain.embeddings.openai import OpenAIEmbeddings from langchain.vectorstores import Chroma from langchain.text_splitter import CharacterTextSplitter from langchain.chains import RetrievalQA from langchain.document_loaders import TextLoader from langchain.prompts import PromptTemplate from langchain.chat_models import ChatOpenAI loader = TextLoader('./data/local_knowledge.txt') documents = loader.load() text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0) texts = text_splitter.split_documents(documents) embeddings = OpenAIEmbeddings() db = Chroma.from_texts([t.page_content for t in texts], embeddings, collection_name="local-knowledge") qa_prompt_template = """Use the following pieces of context to answer the question at the end. {context} Question: {question} Answer:""" prompt = PromptTemplate(template=qa_prompt_template, input_variables=["context", "question"]) model = ChatOpenAI(model_name='gpt-3.5-turbo', temperature=0) retriever_qa = RetrievalQA.from_llm(llm=model, retriever=db.as_retriever(), prompt=prompt) response = retriever_qa.run("Who invented Python programming language and when was it first released?") print(response) ``` 这段脚本说明了怎样加载文件、分割文本单元格、嵌入特征表示以及设置对话链路等步骤来达成特定目标——即针对某个领域内的封闭式问题给予精确解答。 #### 总结 综上所述,LangChain 不仅提供了灵活易扩展的基础架构让用户能够轻松搭建各种智能化服务项目,而且也内置了很多实用的功能组件方便开发者快速原型化想法验证效果。无论是需要执行复杂指令序列还是希望打造专属的知识咨询平台,都可以借助这一强大开源库的力量去探索无限可能!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex_StarSky

你的鼓励是创作的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值