一、概念
RAG:Retrieval-Augmented Generation(检索-增强生成)
二、理解RAG
1. 大模型的交互过程
生成式的大模型交互过程一般是:
# 问题 → 大模型 → 回答
基于 RAG 的大模型交互过程:
# 增强(问题+检索:根据问题找到的相似的文本) → 大模型 → 回答
从大模型的角度:没有任何区别,RAG不是大模型技术,是如何更好的用大模型的技术,从某种意义上来说RAG可以看作是一种提示词工程技术。
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)