news 2026/4/3 15:43:03

构建一个LangChain RAG应用

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
构建一个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: list[Document]) -> 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)

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/2 11:32:10

如何写出优秀的单元测试?

🍅 点击文末小卡片,免费获取软件测试全套资料,资料在手,涨薪更快写出优秀的单元测试需要考虑以下几个方面:1. 测试用例设计测试用例应该覆盖被测试代码的不同场景和边界情况,以尽可能发现潜在的问题。在设计…

作者头像 李华
网站建设 2026/4/3 13:32:55

LLM - 从 Prompt 到上下文工程:面向 Java 的生产级 AI Agent 设计范式

文章目录引言:从“会写代码”到“能托付工作”Agent 能力边界与安全前提Prompt 注入威胁的现实形态多层防注入策略:从模型到框架工具设计:从“能用”到“好用又安全”工具调用策略:循环而非流水线上下文工程:从 Prompt…

作者头像 李华
网站建设 2026/3/31 23:14:35

完结 风哥Oracle RAC+DG生产实战(4):Oracle21c RAC DataGuard搭建2+2

如何高效掌握《Oracle 21c RAC DataGuard 22架构实战指南》并生成技术文章想要快速且有效地消化这篇架构实战指南,并将其精髓转化为一篇属于自己的技术文章,可以遵循以下系统化的学习与写作路径。这不仅适用于本文,也是学习任何复杂技术文档的…

作者头像 李华
网站建设 2026/4/3 14:24:39

AudioGen文本到音频生成技术深度解析

AudioGen文本到音频生成技术深度解析 【免费下载链接】audiocraft Audiocraft is a library for audio processing and generation with deep learning. It features the state-of-the-art EnCodec audio compressor / tokenizer, along with MusicGen, a simple and controlla…

作者头像 李华
网站建设 2026/4/3 0:10:07

泛型的相关知识

定义类、接口、方法时&#xff0c;同时声明了一个或多个类型变量&#xff08;如&#xff1a;<E>&#xff09;&#xff0c;称为泛型类、泛型接口、泛型方法&#xff0c;他们统称为泛型。public class ArrayList<E> {//... }作用&#xff1a;泛型提供了在编译阶段约束…

作者头像 李华
网站建设 2026/4/3 7:34:51

微信小程序开发实战之 02-微信小程序页面制作

页面制作概述 WXML 概述 在制作微信小程序页面时&#xff0c;页面的结构可以用 WXML 来实现。 WXML 是微信团队为微信小程序开发而设计的一套语言&#xff0c;可以结合微信小程序中的各种组件构建页面结构。 WXML 与 HTML 的区别&#xff1a; HTML 和 WXML 使用的标签不同。HTM…

作者头像 李华