ESPAÇO PUBLICITÁRIO DISPONÍVEL · FALE CONOSCO

Como integrar a API Baichuan com LangChain e LlamaIndex para pipelines RAG de documentos corporativos em chinês

365Finds Editorial
11.430 artigos Wiki catalogados

Use o 365 Wiki com sua IA

Copie o prompt abaixo, cole na IA que você já usa e faça sua pergunta.

Baixar o Skill completo

Experimente primeiro com o prompt. Se você usa o 365 Wiki com frequência, instale o Skill completo do 365Wiki para não precisar colá-lo novamente. Se não usa uma IA específica, as versões web do Gemini ou Microsoft Copilot também servem.

A construção de pipelines de Geração Aumentada por Recuperação (RAG) voltados a documentos corporativos em chinês apresenta desafios técnicos que os ecossistemas tradicionais de processamento de texto ocidental não resolvem com eficiência. O idioma chinês não utiliza espaços como delimitadores naturais entre palavras, contratos e manuais de conformidade contêm terminologia jurídica e numeração de cláusulas complexas, e modelos genéricos de embedding multilíngue frequentemente causam fragmentação excessiva de tokens (token inflation), degradando a precisão semântica e a taxa de recuperação.

A Baichuan AI disponibiliza modelos treinados nativamente sobre vastos volumes de dados corporativos em chinês: os modelos Baichuan4 e Baichuan3-Turbo para raciocínio e síntese de respostas, e o Baichuan-Text-Embedding (saída vetorial densa de 1024 dimensões) voltado à recuperação semântica. Como a plataforma Baichuan oferece endpoints REST compatíveis com a especificação da OpenAI em https://api.baichuan-ai.com/v1, engenheiros de backend podem integrá-la ao LangChain e ao LlamaIndex usando conectores comunitários ou adaptadores padrão.

Este guia apresenta a arquitetura recomendada, estratégias de fragmentação (chunking) adaptadas ao chinês e implementações completas em Python para ambientes corporativos.


1. Pré-requisitos e especificações da API

Antes de estruturar a ingestão de documentos, obtenha uma chave de API na plataforma de desenvolvedores da Baichuan Intelligent e configure-a nas variáveis de ambiente do sistema:

export BAICHUAN_API_KEY="your-baichuan-api-key"

Instale os pacotes necessários de orquestração e banco vetorial:

pip install langchain-community langchain-core langchain-openai \
            llama-index-core llama-index-llms-openai-like llama-index-embeddings-openai \
            chromadb pydantic

Parâmetros essenciais da API da Baichuan:


2. Estratégia de divisão de texto para documentos corporativos em chinês

Dividir documentos apenas por espaços ou contagem cega de caracteres quebra orações no meio, desestruturando referências a normas e tabelas orçamentárias. A fragmentação de textos em chinês deve ser recursiva, priorizando quebras de parágrafo e pontuações do chinês (。, !, ?, ;).

Ponto crítico de infraestrutura: o modelo Baichuan-Text-Embedding impõe um limite estrito de 512 tokens por requisição. Para evitar falhas com código 400 Bad Request em processamentos em lote, mantenha o tamanho de cada fragmento entre 350 e 400 caracteres, com sobreposição de 40 a 50 caracteres.

from langchain_text_splitters import RecursiveCharacterTextSplitter

def create_chinese_document_splitter(chunk_size: int = 400, chunk_overlap: int = 50):
    """
    Divisor de texto recursivo calibrado para contratos e normas corporativas em chinês.
    """
    return RecursiveCharacterTextSplitter(
        chunk_size=chunk_size,
        chunk_overlap=chunk_overlap,
        separators=[
            "\n\n",      # Quebras de parágrafo
            "\n",        # Quebras de linha
            "。",        # Ponto final em chinês
            "!",        # Ponto de exclamação
            "?",        # Ponto de interrogação
            ";",        # Ponto e vírgula (comum em subitens contratuais)
            " ",         # Espaço em branco
            ""           # Divisão por caractere como fallback
        ]
    )

3. Integração com LangChain (LCEL + Busca Vetorial)

No LangChain, você pode usar classes dedicadas de langchain_community (ChatBaichuan, BaichuanTextEmbeddings) ou utilizar langchain_openai configurando o parâmetro openai_api_base para o gateway da Baichuan. A abordagem com o wrapper compatível com OpenAI é frequentemente a mais estável em produção por suportar streaming nativo, chamadas assíncronas e LCEL (LangChain Expression Language).

Pipeline RAG completo com LangChain

import os
from langchain_openai import ChatOpenAI, OpenAIEmbeddings
from langchain_community.vectorstores import Chroma
from langchain_core.prompts import ChatPromptTemplate
from langchain_core.runnables import RunnablePassthrough
from langchain_core.output_parsers import StrOutputParser
from langchain_core.documents import Document

# 1. Inicialização do LLM e do modelo de Embedding da Baichuan
BAICHUAN_BASE_URL = "https://api.baichuan-ai.com/v1"
api_key = os.environ.get("BAICHUAN_API_KEY")

embeddings = OpenAIEmbeddings(
    model="Baichuan-Text-Embedding",
    openai_api_base=BAICHUAN_BASE_URL,
    openai_api_key=api_key,
    check_embedding_ctx_length=False  # Ignora checagem de contexto fixo da OpenAI
)

llm = ChatOpenAI(
    model="Baichuan4",
    openai_api_base=BAICHUAN_BASE_URL,
    openai_api_key=api_key,
    temperature=0.1,  # Temperatura reduzida para respostas estritamente factuais
    streaming=True
)

# 2. Exemplo de documentos normativos internos
raw_docs = [
    Document(
        page_content="第十三条 采购付款管理规范:对于超过人民币50万元的设备采购合同,供应商必须提供全额增值税专用发票后,财务部方可安排第二笔30%的进度款支付。项目初验合格前,累计付款比例不得超过合同总额的80%。",
        metadata={"source": "采购管理制度2024.pdf", "department": "Finance"}
    ),
    Document(
        page_content="第二十四条 差旅报销标准:研发部门员工赴一类城市(北京、上海、广州、深圳)出差,住宿费上限为每人每天550元,餐饮补贴为每人每天120元,按实际出差自然天数核算。",
        metadata={"source": "员工差旅规范v3.pdf", "department": "HR"}
    )
]

splitter = create_chinese_document_splitter(chunk_size=400, chunk_overlap=40)
chunked_docs = splitter.split_documents(raw_docs)

# 3. Criação do índice vetorial com Chroma
vectorstore = Chroma.from_documents(
    documents=chunked_docs,
    embedding=embeddings,
    collection_name="enterprise_knowledge"
)
retriever = vectorstore.as_retriever(search_kwargs={"k": 2})

# 4. Template de prompt com regras rígidas de conformidade
system_prompt = (
    "你是一个严谨的企业知识库助手。请严格根据以下检索到的参考文档回答用户的问题。\n"
    "如果参考文档中没有提供明确信息,请直接回答'依据现有内部制度未查到相关说明',严禁虚构或主观臆测。\n\n"
    "【参考文档】:\n{context}"
)

prompt = ChatPromptTemplate.from_messages([
    ("system", system_prompt),
    ("human", "{question}")
])

def format_docs(docs):
    return "\n\n".join(f"[{doc.metadata.get('source', '未知')}] {doc.page_content}" for doc in docs)

# 5. Montagem da cadeia LCEL
rag_chain = (
    {"context": retriever | format_docs, "question": RunnablePassthrough()}
    | prompt
    | llm
    | StrOutputParser()
)

# 6. Execução da consulta
if __name__ == "__main__":
    query = "50万元以上的设备采购合同,第二笔进度款支付的前提条件是什么?"
    response = rag_chain.invoke(query)
    print("Resposta gerada:\n", response)

4. Integração com LlamaIndex (OpenAILike e Particionador Personalizado)

Na arquitetura modular do LlamaIndex (v0.10+), a classe nativa OpenAI valida nomes de modelos oficiais. Para se comunicar com a API Baichuan, utiliza-se a classe OpenAILike do pacote llama-index-llms-openai-like e o OpenAIEmbedding apontando para o api_base da Baichuan.

Pipeline RAG completo com LlamaIndex

import os
from llama_index.core import Settings, VectorStoreIndex, Document
from llama_index.core.node_parser import SentenceSplitter
from llama_index.llms.openai_like import OpenAILike
from llama_index.embeddings.openai import OpenAIEmbedding

# 1. Configurações globais do LlamaIndex
BAICHUAN_BASE_URL = "https://api.baichuan-ai.com/v1"
api_key = os.environ.get("BAICHUAN_API_KEY")

Settings.llm = OpenAILike(
    model="Baichuan4",
    api_base=BAICHUAN_BASE_URL,
    api_key=api_key,
    is_chat_model=True,
    temperature=0.1
)

Settings.embed_model = OpenAIEmbedding(
    model="Baichuan-Text-Embedding",
    api_base=BAICHUAN_BASE_URL,
    api_key=api_key
)

# 2. Configuração de quebra por oração com pontuação em chinês
Settings.node_parser = SentenceSplitter(
    chunk_size=400,
    chunk_overlap=40,
    separator="。"
)

# 3. Criação de documentos e indexação
documents = [
    Document(
        text="第七章 核心数据安全防护要求:涉及生产数据库导出操作必须提前48小时提交工单,经信息安全负责人与业务分管领导双重审批后方可在堡垒机中执行。导出文件须启用国密SM4算法加密并在3天内自动销毁。",
        metadata={"category": "SecOps", "author": "Security Committee"}
    )
]

index = VectorStoreIndex.from_documents(documents)

# 4. Configuração do motor de consulta
query_engine = index.as_query_engine(
    similarity_top_k=2,
    system_prompt=(
        "你代表企业信息化与安全管理委员会回答技术咨询。"
        "请严格根据检索到的规范作答,列出具体审核流程及技术加密要求。"
    )
)

if __name__ == "__main__":
    response = query_engine.query("导出生产环境数据库需要满足哪些审批与安全条件?")
    print("Resposta do LlamaIndex:\n", str(response))

5. Boas práticas de engenharia para produção corporativa

Para operar sistemas RAG com a API Baichuan em escala empresarial com alta confiabilidade, considere as seguintes recomendações:

1. Busca Híbrida (Vetorial + BM25)

A busca vetorial densa é eficaz para capturar intenção semântica, mas pode falhar ao identificar termos literais críticos, como identificadores de artigos contratuais ("第十三条") ou códigos de peças e projetos. A combinação do Baichuan-Text-Embedding com um recuperador esparso (BM25 ou Elasticsearch) via EnsembleRetriever eleva substancialmente a precisão.

2. Validação prévia de tokens para evitar exceções

Como o Baichuan-Text-Embedding rejeita entradas que excedam 512 tokens, tabelas muito extensas ou textos sem pontuação gerados por OCR podem interromper rotinas de indexação em lote. Adicione uma etapa de sanitização que conte os tokens e divida previamente fragmentos atípicos antes de chamar a API.

3. Controle de taxa de requisições (Rate Limits) e resiliência

Grandes migrações de documentos podem atingir as cotas de requisições por minuto (RPM) da plataforma. Utilize bibliotecas como tenacity para gerenciar retentativas com backoff exponencial ou controle o throughput com semáforos assíncronos.

4. Mitigação de alucinações e rastreabilidade de fontes

Em cenários de auditoria e governança, uma informação incorreta acarreta riscos regulatórios. Configure prompts restritivos para forçar a admissão explícita de ausência de dados quando o documento não contiver a resposta, e retorne metadados das fontes consultadas para que o usuário final possa auditar o texto de origem.


Referências