Skip to main content

RAG服务核心代码开发

代码实践​

创建rag.py,实现获取执行链的方法:

from langchain_core.documents import Document
from langchain_core.runnables import RunnablePassthrough
from vector_stores import VectorStoresService
from langchain_community.embeddings import DashScopeEmbeddings
import os
from dotenv import load_dotenv
import config_data as config
from langchain_core.prompts import ChatPromptTemplate
from langchain_community.chat_models import ChatTongyi
from langchain_core.output_parsers import StrOutputParser

load_dotenv()


def print_prompt(prompt):
print("="*20)
print(prompt.to_string())
print('='*20)
return prompt

class RagService(object):

def __init__(self):

self.vector_service = VectorStoresService(
embedding=DashScopeEmbeddings(model=config.embedding_model_name,dashscope_api_key=os.getenv("LLM_API_KEY"))
)

self.prompt_template = ChatPromptTemplate.from_messages(
[
("system", "以我提供的已知参考资料为主, 简洁和专业的回答用户问题。参考资料:{context}。"),
("user", "用户提问: {input}")
]
)

self.chat_model = ChatTongyi(model=config.chat_model_name,api_key=os.getenv("LLM_API_KEY"))

self.chain = self.__get_chain()


def __get_chain(self):
"""获取最终的执行链"""
retriever = self.vector_service.get_retriever()

def format_document(docs: list[Document]):
if not docs:
return "无相关参考资料"

formatted_str = ""
for doc in docs:
formatted_str += f"文档片段:{doc.page_content}\n文档元数据:{doc.metadata}"

return formatted_str

chain = (
{
"input": RunnablePassthrough(),
"context": retriever | format_document
} | self.prompt_template | print_prompt | self.chat_model | StrOutputParser()
)

return chain

if __name__ == "__main__":
res = RagService().chain.invoke("我的体重120斤,身高172,尺码推荐")
print(res)

在config_data.py新增配置项:

md5_path = "./md5.txt"


# Chroma
collection_name = "rag"
persist_directory = "./chroma_db"


# spliter
chunk_size = 1000
chunk_overlap = 100
separators = ["\n\n", "\n", ".", "!", "?", "。", "!", "?", " ", ""]
max_split_char_number = 1000 # 文本分割的阈值

# retriever
similarity_search_k = 1 # 检索返回匹配的文档数量

# model
embedding_model_name = "text-embedding-v4"
chat_model_name = "qwen3-max"