构建一个LangChain RAG应用

构建一个LangChain RAG应用

01. 外挂知识库的聊天机器人架构

在 RAG 应用中,会通过外部的检索器/知识库检索人类的提问,然后将检索到的信息填充到提示模板中,一起传递给大语言模型,让其生成特定的内容,无论 RAG 应用有多么复杂,底层一定少不了这个步骤,这也是 RAG 的基础架构。

所以在 LangChain 中,也可以按照上述的流程图,将聊天机器人添加上知识库问答功能,思路其实非常简单:

  1. 和 Postgres 一样实例化一个全局的 Weaviate 向量数据库,避免每次调用时才进行连接,提升效率。
  2. 在聊天应用中,将 Weaviate 转换成检索器,并将生成的 Document 列表转换成字符串。
  3. 将处理好的检索器拼接到 LCEL 链输入字典中,用户提问时,检索对应内容并填充到 Prompt 模板中,从而实现知识外挂。

02. 外挂知识库的聊天机器人示例

在 LLMOps 项目中,我们对接的是 Weaviate 向量数据库,可以使用云端的向量数据库,也可以使用 Docker 搭建的向量数据库,两者并没有使用差异,修改后的代码如下。

集成的向量数据库服务

internal/service/vector_database_service.py

import os

import weaviate

from injector import inject

from langchain_core.documents import Document

from langchain_core.vectorstores import VectorStoreRetriever

from langchain_openai import OpenAIEmbeddings

from langchain_weaviate import WeaviateVectorStore

from weaviate import WeaviateClient

@inject

class VectorDatabaseService:

"""向量数据库服务"""

client: WeaviateClient

vector_store: WeaviateVectorStore

def init(self):

"""构造函数,完成向量数据库服务的客户端+LangChain向量数据库实例的创建"""

1.创建/连接weaviate向量数据库

self.client = weaviate.connect_to_local(

host=os.getenv("WEAVIATE_HOST"),

port=int(os.getenv("WEAVIATE_PORT"))

)

2.创建LangChain向量数据库

self.vector_store = WeaviateVectorStore(

client=self.client,

index_name="Dataset",

text_key="text",

embedding=OpenAIEmbeddings(model="text-embedding-3-small")

)

def get_retriever(self) -> VectorStoreRetriever:

"""获取检索器"""

return self.vector_store.as_retriever()

@classmethod

def combine_documents(cls, documents: listDocument) -> str:

"""将对应的文档列表使用换行符进行合并"""

return "\n\n".join(document.page_content for document in documents)

配置信息:

Weaviate向量数据库配置

WEAVIATE_HOST=192.168.2.120

WEAVIATE_PORT=8080

聊天机器人处理器:

def debug(self, app_id: UUID):

4.创建链应用

retriever = self.vector_database_service.get_retriever() | self.vector_database_service.combine_documents

chain = (RunnablePassthrough.assign(

history=RunnableLambda(self._load_memory_variables) | itemgetter("history"),

context=itemgetter("query") | retriever

) | prompt | llm | StrOutputParser()).with_listeners(on_end=self._save_context)

相关推荐
Bioinfo Guy12 小时前
高分Panel复现系列|转录因子网络太乱?用模块框把重点圈出来
数据库·生物信息学·生信可视化
leisoo809712 小时前
100GBA股股票数据怎么存ClickHouseRedisMySQLJSON完整对比
大数据·linux·服务器·开发语言·python
WangYan202213 小时前
基于XGBoost与AI的生态—地学多源数据建模:植被与土地利用识别、土壤碳氮空间预测、生物多样性驱动机制、土壤微生物功能预测、生态退化与风险识别
python·机器学习·xgboost
ltl14 小时前
Disaggregated DB 合集:Socrates、PolarDB、Taurus 的共同模式
数据库
金銀銅鐵15 小时前
[Python] 借助 turtle 逐字展示唐诗《金缕衣》
python
Blossom i16 小时前
大数据预处理与采集实验一:使用Python操作MySQL数据库
数据库·mysql
前端开发江鸟16 小时前
Agent 能跑通以后,我才发现代码不是交付物
agent
花椒技术16 小时前
一个人已经有 Agent 了,我们为什么还要建设统 Agent 平台
人工智能·agent·ai编程
雾时之林17 小时前
Linux--软件管理、源码包安装
linux·服务器·数据库