LangChain 1.0 到底什么是RAG?

一、概念

RAG:Retrieval-Augmented Generation(检索-增强生成)

二、理解RAG

1. 大模型的交互过程

生成式的大模型交互过程一般是:

# 问题 → 大模型 → 回答  

基于 RAG 的大模型交互过程:

# 增强(问题+检索:根据问题找到的相似的文本) → 大模型 → 回答

从大模型的角度:没有任何区别,RAG不是大模型技术,是如何更好的用大模型的技术,从某种意义上来说RAG可以看作是一种提示词工程技术。

2. 大模型本身的局限性
  • 公开数据

    私域问题不被支持,大模型幻觉

  • 时效性问题

    回答不了实时性的问题

3. 解决方法
  1. 大模型不断实时更新 不可能*
  2. 微调:用私有数据,新的数据,局部训练,垂直行业大模型 成本太高
  3. RAG:成本最低、时间短
4. 示例:让大模型回答3i/Atlas的内容

3i/Atlas实际上是彗星的事情,但是由于大模型的时效性,无法回答关于3i/Atlas 的相关问题

from langchain.agents import create_agent
from common import Common

common = Common()
llm = common.get_model("THUDM/GLM-4-9B-0414")
agent = create_agent(
    model=llm
)
messages = {
        "messages":[{"role": "user", "content": "讲下3i/Atlas"}]
    }
result = agent.invoke(messages)
common.pretty_print_messages(result)
5. 通过网页获取信息重新回答问题
import bs4
from langchain_community.document_loaders import WebBaseLoader
from langchain_core.tools import tool
from langchain_text_splitters import RecursiveCharacterTextSplitter
from langchain.agents import create_agent
from langchain_chroma import Chroma

from common import Common

common = Common()
llm = common.get_model("THUDM/GLM-4-9B-0414")
embedding_model = common.get_embedding_model()

page_url = "https://news.cctv.com/2025/08/07/ARTIwHXTjBUTWQHIhY3pmv7Z250807.shtml"
bs4_strainer = bs4.SoupStrainer(class_="content_area")

loader = WebBaseLoader(
    web_paths=[page_url],
    bs_kwargs={"parse_only": bs4_strainer}
)
base_docs = loader.load()

# print(base_docs)

splitter = RecursiveCharacterTextSplitter(chunk_size=500,chunk_overlap=50)
docs = splitter.split_documents(base_docs)

print(len(docs))
vector_store = Chroma.from_documents(
    documents=docs,
    collection_name="17test_collection",
    embedding=embedding_model,
    persist_directory="./db/chroma_db_17"
)
# results = vector_store.similarity_search(query="3i",k=3)
# print(len( results))
# print(results)
@tool
def retrive_context(query:str):
    """检索信息的工具"""
    retrive_docs =  vector_store.similarity_search(query=query,k=2)
    content = "\n\n".join(
        (f"Source:{doc.metadata}\nContent:{doc.page_content}") for doc in retrive_docs
    )
    return content
system_prompt = """
    你是一个信息助手。
    你必须优先使用 retrive_context 工具检索信息,再回答用户问题。
    不能直接回答,必须调用工具!
"""
agent = create_agent(
    model=llm,
    tools=[retrive_context],
    system_prompt=system_prompt
)

messages = {
        "messages":[{"role": "user", "content": "讲下3i/Atlas"}]
    }

result = agent.invoke(messages)

common.pretty_print_messages(result)
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容